【问题标题】:Similar colors for similar data in ggplot2ggplot2中相似数据的相似颜色
【发布时间】:2016-12-08 15:12:04
【问题描述】:

假设我有这样的数据:

Time, variable, value
0, A, 1.2
1, A, 2.3
2, A, 3.4
0, B, 1.1
1, B, 2.4
2, B, 3.7
0, C, 1.2
1, C, 2.1
2, C, 3.3
0, D, 1.4
1, D, 2.5
2, D, 3.5
0, E, 1.8
1, E, 2.9
2, E, 3.1
0, F, 0.8
1, F, 2.2
2, F, 3.3
0, G, 1.7
1, G, 4.3
2, G, 4.4
0, H, 1.0
1, H, 2.2
2, H, 3.1

如果我执行qplot(Time, value, color = variable, data = mydata, geom = "line") 之类的操作,默认情况下我会得到 8 条不同颜色的线条。假设数据 A、B、C、D 相关,数据 E、F、G、H 相关。我想用颜色来表现这种关系。例如,我如何告诉 R 我希望 A、B、C、D 被绘制为类似但可区分的蓝色阴影,而 D、E、F、G 被绘制为类似但可区分的绿色阴影?

【问题讨论】:

  • ggplot 中没有“相似但可区分”颜色的功能。您可以尝试将一些属性附加到 alpha 以稍微改变颜色或映射线型?但是您可能只需要使用 scale_color_manual 手动指定颜色即可获得所需的结果。
  • 那我该怎么做呢?

标签: r ggplot2 colors


【解决方案1】:

您可以通过首先对您的数据集进行分组,然后为您的两个组指定颜色冲煮器来制作自定义比例。 brewer.pal 函数允许您从常见颜色的比例中进行选择。

library(dplyr)
df <- df %>% mutate(groups = factor(as.numeric(df$variable %in%
                                          LETTERS[1:4])))

blues <- RColorBrewer::brewer.pal(6, "Blues")[3:6]
reds <- RColorBrewer::brewer.pal(6, "Reds")[3:6]

    ggplot() + 
      geom_line(data = df, 
                aes(x = value, y = variable, 
                    group = variable, 
                    color = interaction(factor(groups),
                                        variable))) + 
      scale_color_manual("Variable", labels = unique(df$variable),
                         values = c(blues, reds))

【讨论】:

  • 糟糕,我发帖之前没有看到这个。
【解决方案2】:

这就是我最终要做的。我实际上有 10 个时间序列,我想按颜色将它们直观地分成两组,每组五个:

library(RColorBrewer)
# you have to pick the last 5 of 9 colors because if you just specify 5 colors, the first will be way too pale 
blues = brewer.pal(9,"Blues")[5:9] 
greens = brewer.pal(9, "Greens")[5:9] 
mycolors = append(blues, greens)
ggplot(data = mydata, aes(x=Time, y=value, color=variable)) + geom_line() + theme_classic() + scale_colour_manual(values=mycolors)

并不完美 - 您创建的颜色顺序很重要,您必须创建与数据系列相同数量的颜色 - 但它比查找和输入 RGB 值 IMO 更好。

【讨论】:

    【解决方案3】:

    我认为您需要做的只是添加一个新变量并将 A、B、C、D 归为一组,而将 E、F、G、H 归为另一组。

        mydata$variable=as.character(mydata$variable)
        mydata$variable1=mydata$variable
        ifelse(mydata$variable1[]==c('A','B','C'),'a','b')
    

    希望对你有帮助!

    【讨论】:

      猜你喜欢
      • 2015-08-20
      • 2017-11-09
      • 2011-12-12
      • 2010-11-13
      • 1970-01-01
      • 1970-01-01
      • 2015-10-14
      • 1970-01-01
      相关资源
      最近更新 更多