基于唯一列填充颜色矢量



我正在使用c3绘制一些线条。如果两行完全相同,C3将覆盖它们,并在图例中使用不同的颜色。我希望传说中的颜色是一样的。

以下是的一些例子

# If two lines are identical, colour them the same
library(tidyverse)
library(c3)
# Dark red, blue, orange, black, purple
cbpal <- c("#800000", "#4363d8", "#f58231", "#000000", "#dcbeff")
# Companies A and B are should be dark red. Companies C and D should be blue
df1 <- tibble(
date = seq(as.Date("2020-01-01"), by = "month", length.out = 4),
comp_A = rep(4, 4),
comp_B = rep(4, 4),
comp_C = rep(2, 4),
comp_D = rep(2, 4)
)
# Company A and B should be dark red. Companies C, D, E, should all be blue
df2 <- tibble(
date = seq(as.Date("2020-01-01"), by = "month", length.out = 4),
comp_A = rep(4, 4),
comp_B = rep(4, 4),
comp_C = rep(3, 4),
comp_D = rep(3, 4),
comp_E = rep(3, 4)
)
# Company A and B should be dark red. Companies C, D, should all be blue
# Companies E, F, should all be orange
df3 <- tibble(
date = seq(as.Date("2020-01-01"), by = "month", length.out = 4),
comp_A = rep(4, 4),
comp_B = rep(4, 4),
comp_C = rep(3, 4),
comp_D = rep(3, 4),
comp_E = rep(2, 4),
comp_F = rep(2, 4)
)
c3(df1)
df1_pal <- c("#800000", "#800000", "#4363d8","#4363d8")
c3(df1) %>% 
c3_color(df1_pal)
c3(df2)
df2_pal <- c("#800000", "#800000", "#4363d8","#4363d8", "#4363d8")
c3(df2) %>% 
c3_color(df2_pal)
c3(df3)
df3_pal <- c("#800000", "#800000", "#4363d8","#4363d8", "#f58231", "#f58231")
c3(df3) %>% 
c3_color(df3_pal)

在第一个数据帧中,有4行,但comp_A和comp_B相同,comp_C和comp_D相同。为了创建颜色向量,我从我的色盲调色板中提取第一种颜色#800000,并将其与comp_A一起使用。我注意到comp_B是相同的,并使其成为相同的颜色#800000。comp_C不同,所以我再次进入cbpal并获取第二种颜色。最终,我得到了调色板df1_pal <- c("#800000", "#800000", "#4363d8","#4363d8"),如图所示。

还有两个例子。在所有情况下,数据帧将按y轴值的降序排列。

如何以编程方式创建这些颜色矢量?

每个列的哈希可以用于将列映射到一种颜色。

get_cols获取每列的散列。散列被映射到一个索引,该索引与cbpal一起使用以获得颜色。

get_cols <- function(df) {
hashes <-
df %>%
select(-date) %>%
map_chr(digest::digest)

cbpal[match(hashes, unique(hashes))]
}
get_cols(df1)
#> [1] "#800000" "#800000" "#4363d8" "#4363d8"
get_cols(df2)
#> [1] "#800000" "#800000" "#4363d8" "#4363d8" "#4363d8"
get_cols(df3)
#> [1] "#800000" "#800000" "#4363d8" "#4363d8" "#f58231" "#f58231"

最新更新