Como padronizar cores de grupo em visualizações de dados em R

cupom com desconto - o melhor site de cupom de desconto cupomcomdesconto.com.br


Uma prática recomendada na visualização é tornar seu esquema de cores consistente entre as figuras.

Por exemplo, se você estiver criando vários gráficos do conjunto de dados (por exemplo, um grupo de cinco empresas), você deseja que cada empresa tenha a mesma cor consistente em todos esses gráficos.

O R possui ótimos recursos de visualização de dados. Particularmente o ggplot2 O pacote facilita a visualização rápida de uma boa aparência.

O padrão em R é observar o número de grupos em seus dados e escolher cores “espaçadas igualmente” em uma roda de cores matiz. Isso parece ótimo logo de cara:

# install.packages('ggplot2')
library(ggplot2)

theme_set(new = theme_minimal()) # sets a default theme

set.seed(1) # ensure reproducibility

# generate some data
n_companies = 5
df1 = data.frame(
  company = paste('Company', seq_len(n_companies), sep = '_'),
  employees = sample(50:500, n_companies),
  stringsAsFactors = FALSE
)

# make a simple column/bar plot
ggplot(data = df1) + 
  geom_col(aes(x = company, y = employees, fill = company))

No entanto, pode ser um desafio tornar a coloração consistente entre as parcelas.

Por exemplo, suponha que desejamos visualizar um subconjunto desses pontos de dados.

index_subset1 = c(1, 3, 4, 5) # specify a subset

# make a plot using the subsetted dataframe
ggplot(data = df1[index_subset1, ]) + 
  geom_col(aes(x = company, y = employees, fill = company))

Como você pode ver, o esquema de cores mudou agora. Com menos um grupo / empresa, R agora seleciona quatro novas cores uniformemente espaçadas ao redor da roda de cores. Todos, exceto o primeiro, são diferentes das cores originais que tínhamos para as empresas.

Uma maneira de lidar com isso em R e ggplot2, é adicionar um scale_* camada para o enredo.

Aqui, configuramos manualmente os valores de cores hexadecimais no scale_fill_manual função. Esses valores hexadecimais que forneci sei serem os valores R padrão para quatro grupos.

# install.packages('scales')

# the hue_pal function from the scales package looks up a number of evenly spaced colors
# which we can save as a vector of character hex values
default_palette = scales::hue_pal()(5)

# these colors we can then use in a scale_* function to manually override the color schema
ggplot(data = df1[index_subset1, ]) +
  geom_col(aes(x = company, y = employees, fill = company)) +
  scale_fill_manual(values = default_palette[-2]) # we remove the element that belonged to company 2

Como você pode ver, as cores agora estão alinhadas com o esquema anterior. Somente a empresa 2 é descartada, mas todas as outras empresas mantêm sua cor.

Leia Também  Instalação do R 4.0 no Ubuntu 20.04 LTS e dicas para pacotes espaciais

No entanto, isso foi muito codificado em nosso programa. Tivemos que especificar qual empresa abandonar usando o default_palette[-2].

Se o subconjunto for alterado, o que geralmente acontece na vida real, nossa solução será interrompida à medida que os valores na paleta não estiverem mais alinhados com os grupos R que encontrar:

index_subset2 = c(1, 2, 5) # but the subset might change

# and all manually-set colors will immediately misalign
ggplot(data = df1[index_subset2, ]) +
  geom_col(aes(x = company, y = employees, fill = company)) +
  scale_fill_manual(values = default_palette[-2])

Felizmente, R é uma linguagem inteligente e você pode contornar isso!

Tudo o que precisamos fazer é criar, o que eu chamo de paleta de cores nomeadas!

É tão simples quanto especificar um vetor de valores de cores hexadecimais! Como alternativa, você pode usar o grDevices::rainbow ou grDevices::colors() funções ou uma das muitas funções incluídas no scales pacote

# you can hard-code a palette using color strings
c('red', 'blue', 'green')

# or you can use the rainbow or colors functions of the grDevices package
rainbow(n_companies)
colors()[seq_len(n_companies)]

# or you can use the scales::hue_pal() function
palette1 = scales::hue_pal()(n_companies)
print(palette1)
[1] "#F8766D" "#A3A500" "#00BF7D" "#00B0F6" "#E76BF3"

Agora precisamos atribuir nomes a esse vetor de valores de cores hexadecimais. E esses nomes devem corresponder aos rótulos dos grupos que queremos colorir.

Você pode usar o names função para isso.

names(palette1) = df1$company
print(palette1)
Company_1 Company_2 Company_3 Company_4 Company_5
"#F8766D" "#A3A500" "#00BF7D" "#00B0F6" "#E76BF3"

Mas eu prefiro usar o setNames para que eu possa executar a inicialização, atribuição e nomeação de forma simultânea. É tudo a mesma coisa.

palette1_named = setNames(object = scales::hue_pal()(n_companies), nm = df1$company)
print(palette1_named)
Company_1 Company_2 Company_3 Company_4 Company_5
"#F8766D" "#A3A500" "#00BF7D" "#00B0F6" "#E76BF3"

Com esse vetor de cores nomeado e o scale_*_manual Agora, podemos substituir manualmente os esquemas de preenchimento e cor de maneira flexível. Isso resulta no mesmo gráfico que tínhamos sem usar o scale_*_manual função:

ggplot(data = df1) + 
  geom_col(aes(x = company, y = employees, fill = company)) +
  scale_fill_manual(values = palette1_named)

No entanto, agora não importa se o quadro de dados está subconjunto, pois dizemos especificamente a R quais cores usar para quais rótulos de grupo por meio da paleta de cores nomeada:

# the colors remain the same if some groups are not found
ggplot(data = df1[index_subset1, ]) + 
  geom_col(aes(x = company, y = employees, fill = company)) +
  scale_fill_manual(values = palette1_named)
# and also if other groups are not found
ggplot(data = df1[index_subset2, ]) + 
  geom_col(aes(x = company, y = employees, fill = company)) +
  scale_fill_manual(values = palette1_named)

Quando você estiver ciente dessas superpotências, poderá fazer muito mais com elas!

Leia Também  LANSA atenua os riscos da Shadow IT com serviço de consultoria gratuito
cupom com desconto - o melhor site de cupom de desconto cupomcomdesconto.com.br

Que tal destacar um grupo específico?

Basta definir todas as outras cores para “cinza” …

# lets create an all grey color palette vector
palette2 = rep('grey', times = n_companies)
palette2_named = setNames(object = palette2, nm = df1$company)
print(palette2_named)
Company_1 Company_2 Company_3 Company_4 Company_5
"grey" "grey" "grey" "grey" "grey"
# this looks terrible in a plot
ggplot(data = df1) + 
  geom_col(aes(x = company, y = employees, fill = company)) +
  scale_fill_manual(values = palette2_named)

… e atribua uma das cores da empresa a uma cor diferente

# override one of the 'grey' elements using an index by name
palette2_named['Company_2'] = 'red'
print(palette2_named)
Company_1 Company_2 Company_3 Company_4 Company_5
"grey" "red" "grey" "grey" "grey"
# and our plot is professionally highlighting a certain group
ggplot(data = df1) + 
  geom_col(aes(x = company, y = employees, fill = company)) +
  scale_fill_manual(values = palette2_named)

Podemos aplicar esses princípios a outros tipos de dados e gráficos.

Por exemplo, vamos gerar alguns dados de séries temporais …

timepoints = 10
df2 = data.frame(
  company = rep(df1$company, each = timepoints),
  employees = rep(df1$employees, each = timepoints) + round(rnorm(n = nrow(df1) * timepoints, mean = 0, sd = 10)),
  time = rep(seq_len(timepoints), times = n_companies),
  stringsAsFactors = FALSE
)

… E visualize-os usando um gráfico de linhas, adicionando a paleta de cores da mesma maneira que antes:

ggplot(data = df2) + 
  geom_line(aes(x = time, y = employees, col = company), size = 2) +
  scale_color_manual(values = palette1_named)

Se sentirmos falta de uma das empresas – vamos pular a empresa 2 – a paleta garante que as outras permaneçam coloridas conforme especificado:

ggplot(data = df2[df2$company %in% df1$company[index_subset1], ]) + 
  geom_line(aes(x = time, y = employees, col = company), size = 2) +
  scale_color_manual(values = palette1_named)

Além disso, a paleta de cores destacada que usamos anteriormente ainda funcionará como um encanto!

ggplot(data = df2) + 
  geom_line(aes(x = time, y = employees, col = company), size = 2) +
  scale_color_manual(values = palette2_named)

Agora, vamos ampliar o problema! Finja que não temos 5, mas 20 empresas.

O código funcionará da mesma forma!

set.seed(1) # ensure reproducibility

# generate new data for more companies
n_companies = 20
df1 = data.frame(
  company = paste('Company', seq_len(n_companies), sep = '_'),
  employees = sample(50:500, n_companies),
  stringsAsFactors = FALSE
)

# lets create an all grey color palette vector
palette2 = rep('grey', times = n_companies)
palette2_named = setNames(object = palette2, nm = df1$company)

# highlight one company in a different color
palette2_named['Company_2'] = 'red'
print(palette2_named)

# make a bar plot
ggplot(data = df1) + 
  geom_col(aes(x = company, y = employees, fill = company)) +
  scale_fill_manual(values = palette2_named) +
  theme(axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1)) # rotate and align the x labels

Também para o gráfico de linha da série temporal:

timepoints = 10
df2 = data.frame(
  company = rep(df1$company, each = timepoints),
  employees = rep(df1$employees, each = timepoints) + round(rnorm(n = nrow(df1) * timepoints, mean = 0, sd = 10)),
  time = rep(seq_len(timepoints), times = n_companies),
  stringsAsFactors = FALSE
)

ggplot(data = df2) + 
  geom_line(aes(x = time, y = employees, col = company), size = 2) +
  scale_color_manual(values = palette2_named)

As possibilidades são infinitas; o poder agora é seu!

Leia Também  Atualização de recuperação de sistemas Travelex

Pense no ganho de eficiência se você criar uma paleta de cores personalizada, como por exemplo cores da marca da empresa!

Para mais truques de R para aumentar a produtividade e a eficácia da programação, visite a página de dicas e truques do R!



Se você chegou até aqui, por que não inscreva-se para atualizações do site? Escolha seu sabor: e-mail, Twitter, RSS ou facebook …



cupom com desconto - o melhor site de cupom de desconto cupomcomdesconto.com.br