TransWikia.com

Referenciar uma coluna de cores com base em outra

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

2 Answers

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.

inserir a descrição da imagem aqui


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)

inserir a descrição da imagem aqui

Answered by Carlos Eduardo Lagosta on September 27, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP