Stack Overflow em Português Asked by Thiago Fernandes on September 27, 2021
Tenho um dataset com várias colunas, porém uma específica coluna é referência para as cores do gráfico, como posso referenciar essa coluna no scale_fill_manua
do ggplot de forma automática?
Obs. A mesma cor pode ser usada em mais de uma referência.
No caso manual seria somente criar c("BIF"="#543005", "BRE"="#bf812d", ...)
, mas como são muitos dados haveria uma forma de automatizar isso?
Meu dataset:
> dput(dataset)
structure(list(INI = c(0, 0, 0, 0, 0.9, 15.85, 20.95, 23.05,
27.3, 32.2, 41.5, 41.75, 45.7, 50, 72.6, 74.3, 82.65, 104.45,
105.2, 106.15, 107.05, 121.8, 123.2, 124.7, 126.7, 128.4, 136.4,
139.7, 151.95, 154.35, 168.2, 172.2, 174.75, 177.35, 178.3, 179.85,
235.2, 237.1, 246.45, 249, 254.75, 255.65, 256.55, 258.1, 258.55,
259.85, 261.6, 261.85, 261.85, 268.7, 270.4, 273.45, 275.5, 277.6,
294.9, 295.4, 308.9, 310.3, 312.3, 321.95, 327.85, 328.9, 330.3,
332.15, 361.65, 368.15, 372.7, 380.7, 385.4, 386, 387.7, 389.2,
392.2, 394.55, 395.7, 396.85, 398, 400, 400.6, 402, 402.9, 405.7,
410.95, 414.7, 435.35, 436.35, 442.85, 443.5, 457.45, 457.75,
465.35, 468.4, 474.5, 475.6, 478.65, 480.1, 483.7, 485.6, 498.8,
501.05, 514.2, 522), FIM = c(0.9, 15.85, 27.3, 41.5, 20.95, 72.6,
23.05, 41.75, 32.2, 82.65, 45.7, 50, 151.95, 104.45, 74.3, 105.2,
121.8, 107.05, 106.15, 168.2, 123.2, 295.4, 124.7, 126.7, 128.4,
136.4, 139.7, 246.45, 154.35, 254.75, 172.2, 174.75, 177.35,
178.3, 179.85, 235.2, 237.1, 258.55, 249, 255.65, 258.1, 256.55,
261.85, 261.6, 259.85, 261.85, 294.9, 268.7, 270.4, 327.85, 273.45,
275.5, 277.6, 328.9, 310.3, 308.9, 312.3, 386, 321.95, 330.3,
332.15, 361.65, 385.4, 368.15, 400, 372.7, 380.7, 389.2, 387.7,
405.7, 395.7, 392.2, 394.55, 396.85, 398, 400.6, 402.9, 414.7,
402, 410.95, 436.35, 457.45, 422.45, 435.35, 442.85, 443.5, 457.75,
454.75, 465.35, 468.4, 514.2, 474.5, 475.6, 478.65, 480.1, 483.7,
485.6, 498.8, 501.05, 522, 537.4, 526.7), UNIDADES = structure(c(2L,
4L, 3L, 1L, 2L, 4L, 2L, 2L, 3L, 3L, 1L, 2L, 1L, 2L, 4L, 4L, 3L,
2L, 4L, 4L, 2L, 3L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 4L, 4L, 4L,
4L, 4L, 4L, 4L, 4L, 2L, 2L, 1L, 2L, 2L, 1L, 4L, 4L, 1L, 4L, 2L,
4L, 2L, 2L, 2L, 2L, 1L, 3L, 3L, 1L, 3L, 3L, 4L, 2L, 3L, 4L, 2L,
4L, 4L, 4L, 3L, 1L, 3L, 4L, 4L, 4L, 3L, 4L, 3L, 2L, 4L, 4L, 3L,
1L, 4L, 2L, 2L, 3L, 2L, 3L, 1L, 2L, 1L, 2L, 2L, 2L, 2L, 2L, 2L,
2L, 2L, 2L, 1L, 2L), .Label = c("UND-0001", "UND-0012", "UND-0042",
"UND-0075"), class = "factor"), REF = structure(c(8L, 5L, 5L,
4L, 3L, 3L, 4L, 3L, 9L, 5L, 5L, 6L, 4L, 3L, 4L, 4L, 1L, 3L, 4L,
4L, 3L, 5L, 5L, 3L, 4L, 4L, 4L, 3L, 5L, 4L, 4L, 3L, 4L, 4L, 4L,
4L, 5L, 3L, 5L, 3L, 5L, 5L, 3L, 5L, 5L, 3L, 4L, 5L, 5L, 3L, 5L,
4L, 5L, 4L, 5L, 5L, 5L, 4L, 7L, 5L, 5L, 5L, 5L, 4L, 4L, 5L, 3L,
5L, 5L, 4L, 5L, 3L, 5L, 5L, 5L, 7L, 5L, 5L, 5L, 5L, 5L, 5L, 7L,
4L, 5L, 5L, 4L, 2L, 1L, 5L, 4L, 5L, 3L, 5L, 4L, 5L, 3L, 5L, 3L,
5L, 1L, 3L), .Label = c("BRE", "GAB", "GRA", "GRN", "HID", "RIO",
"RIU", "SOL", "UNK"), class = "factor"), COLOR = c(26265L, 0L,
0L, 4737279L, 215L, 215L, 4737279L, 215L, 0L, 0L, 0L, 5014527L,
4737279L, 215L, 4737279L, 4737279L, 5014527L, 215L, 4737279L,
4737279L, 215L, 0L, 0L, 215L, 4737279L, 4737279L, 4737279L, 215L,
0L, 4737279L, 4737279L, 215L, 4737279L, 4737279L, 4737279L, 4737279L,
0L, 215L, 0L, 215L, 0L, 0L, 215L, 0L, 0L, 215L, 4737279L, 0L,
0L, 215L, 0L, 4737279L, 0L, 4737279L, 0L, 0L, 0L, 4737279L, 7602234L,
0L, 0L, 0L, 0L, 4737279L, 4737279L, 0L, 215L, 0L, 0L, 4737279L,
0L, 215L, 0L, 0L, 0L, 7602234L, 0L, 0L, 0L, 0L, 0L, 0L, 7602234L,
4737279L, 0L, 0L, 4737279L, 8454016L, 5014527L, 0L, 4737279L,
0L, 215L, 0L, 4737279L, 0L, 215L, 0L, 215L, 0L, 5014527L, 215L
)), class = "data.frame", row.names = c(NA, -102L))
>
Entrada:
library("ggplot2")
library("broman")
dataset$COLOR = paste0("#",convert2hex(dataset$COLOR))
color = unique(dataset$COLOR)
aux = unique(dataset$REF)
ggplot(dataset, aes(UNIDADES, (INI + FIM)/2*-1, fill= REF)) +
geom_tile(aes(height = (INI - FIM)*-1, width = 0.6), colour="black", size=0.1) +
theme_classic() +
labs(x = "UNIDADES", y = "TOTAL") +
labs(fill = "REF") +
scale_fill_manual (values =dataset$COLOR)
Saída:
> color = unique(dataset$COLOR)
> aux = unique(dataset$REF)
> color
[1] "#006699" "#000000" "#4848ff" "#0000d7" "#4c83ff" "#74003a" "#80ff80"
> aux
[1] SOL HID GRN GRA UNK RIO BRE RIU GAB
Levels: BRE GAB GRA GRN HID RIO RIU SOL UNK
Aparentemente um dos problemas é a possibilidade de haver cores iguais para referências diferentes. A função fun
abaixo resolve esse problema, criando um vetor de cores em que os nomes são valores únicos de ref
e os valores de cor
correspondentes.
fun <- function(ref, cor){
cor <- as.character(cor)
x <- unique(ref)
i <- match(x, ref)
setNames(cor[i], ref[i])
}
Para testar a função,cria-se um conjunto de dados dataset2
com duas novas REF
, de valores BRC
e BRD
. As cores são as de BRE
.
dataset2 <- rbind(dataset, data.frame(REF = c("BRC", "BRD"), COLOR = rep("#bf812d", 2)))
dataset2$REF <- factor(as.character(dataset2$REF))
Agora atribuem-se as cores usando a função fun
.
cores <- with(dataset2, fun(REF, COLOR))
E o resto do código é igual ao da resposta de @Carlos Eduardo Lagosta, só muda a base.
O gráfico será o seguinte, note a cor repetida.
Código do link acima.
set.seed(99)
dataset2$UNIDADES <- LETTERS[1:nrow(dataset2)]
dataset2$var <- sample(1:100, nrow(dataset2))
dataset2$peso <- sample(1:100, nrow(dataset2))
library(ggplot2)
ggplot(dataset2, aes(reorder(UNIDADES, as.numeric(REF)), var)) +
geom_tile(aes(height = peso, fill = REF), width = .6) +
theme_classic() +
labs(x = "UNIDADES", y = "TOTAL") +
scale_fill_manual(values = cores)
Correct answer by Rui Barradas on September 27, 2021
Como apontado por @rui-barradas nos comentários, pode usar setNames
para associar os nomes das cores com o código hexa, só precisa fazer isso como uma lista e garantir que os nomes estejam associados aos códigos corretos.
Também entendi pelo título que quer ordenar as barras pela ordem de REF. Para isso pode usar reorder
.
Como não forneceu seu conjunto completo de dados, estou criando alguns dados mais simples.
# Dados
dataset <- structure(list(REF = structure(c(3L, 5L, 3L, 1L, 3L, 3L, 3L,
4L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 2L), .Label = c("BRE", "GAB",
"HID", "RIU", "UNK"), class = "factor"), COLOR = structure(c(3L,
2L, 3L, 4L, 3L, 3L, 3L, 1L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 5L
), .Label = c("#01665e", "#4d4d4d", "#80cdc1", "#bf812d", "#f6e8c3"
), class = "factor")), class = "data.frame", row.names = c(NA,
-17L))
set.seed(99)
dataset$UNIDADES <- LETTERS[1:nrow(dataset)]
dataset$var <- sample(1:100, nrow(dataset))
dataset$peso <- sample(1:100, nrow(dataset))
#------------------------------------------------------------
library(ggplot2)
cores <- setNames(
as.list(as.character(unique(dataset$COLOR))),
unique(dataset$REF))
ggplot(dataset, aes(reorder(UNIDADES, as.numeric(REF)), var)) +
geom_tile(aes(height = peso, fill = REF), width = .6) +
theme_classic() +
labs(x = "UNIDADES", y = "TOTAL") +
scale_fill_manual(values = cores)
Answered by Carlos Eduardo Lagosta on September 27, 2021
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP