【问题标题】:Fill colour vector based on unique columns基于唯一列填充颜色向量
【发布时间】:2020-10-01 12:32:26
【问题描述】:

我正在使用 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 &lt;- c("#800000", "#800000", "#4363d8","#4363d8"),如图所示。

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

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

【问题讨论】:

    标签: r


    【解决方案1】:

    每列的哈希值可用于将列映射到颜色。

    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"
    

    【讨论】:

      猜你喜欢
      • 2020-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-08
      • 2014-11-02
      • 1970-01-01
      • 1970-01-01
      • 2012-04-24
      相关资源
      最近更新 更多