繁体   English   中英

ggplot2 中两种不同颜色美学映射的不同调色板

[英]Different colour palettes for two different colour aesthetic mappings in ggplot2

我的问题与thisthis以及this question非常相似。 我有一个散点图(使用geom_point ),使用特定的调色板按因子着色。 我正在使用stat_smooth通过点绘制某些平滑线,按另一个因素分组。 我希望这些线条使用不同的调色板。

这是一些示例数据Dropbox 链接 做一个

currDT <- read.table("SO_data", sep = "|", header = TRUE, strip.white = TRUE)

我通常将我的数据放在 data.table 中,因此您可能会发现更改它也很有帮助。 哦,这是我目前正在使用的配色方案,您可以使用scale_colour_brewer生成自己的配色方案,我只是为了完整性而将其包含在内。

my_col_scheme <- c("#e41a1c", "#377eb8", "#4daf4a", "#984ea3", "#ff7f00", "#7B8A7B",
    "#0B29D6", "#f781bf", "#999999", "black")

希望这已经足够清楚了。 下面是一些示例代码:

icorr_elec <- ggplot(currDT,
                aes(x = EFP, y = SAPT), na.rm = TRUE) +
    geom_point(aes(colour = Anion, shape = Cation),  size = 3, alpha = 0.4) +
    scale_colour_manual(values = my_col_scheme) +
    stat_smooth(method = "lm", formula = y ~ x + 0, aes(linetype = Halide, colour = Halide), 
            alpha = 0.8, size = 0.5, level = 0) +
    scale_linetype_manual(name = "", values = c("dotdash", "F1"),
                      breaks = c("hal", "non-hal"), labels = c("Halides", "Non-Halides"))

这如何在 ggplot2 中完成? 从我收集的其他问题中,我可以手动指定每一行,但我想避免这种情况。

您可以通过对点使用填充点标记并将其映射到fill美学,同时将线条映射到colour美学,为线条和点获得单独的颜色映射。 填充点标记是编号为 21 到 25 的标记(参见?pch )。 这是一个例子,改编@RichardErickson 的代码:

ggplot(currDT, aes(x = EFP, y = SAPT), na.rm = TRUE) +
  stat_smooth(method = "lm", formula = y ~ x + 0, 
              aes(linetype = Halide, colour = Halide), 
              alpha = 0.8, size = 0.5, level = 0) +
  scale_linetype_manual(name = "", values = c("dotdash", "F1"),
                        breaks = c("hal", "non-hal"), labels = c("Halides", "Non-Halides")) +
  geom_point(aes(fill = Anion, shape = Cation),  size = 3, alpha = 0.4, colour="transparent") +
  scale_colour_manual(values = c("blue", "red")) +
  scale_fill_manual(values = my_col_scheme) +
  scale_shape_manual(values=c(21,24)) +
  guides(fill = guide_legend(override.aes = list(colour=my_col_scheme[1:8],
                                                 shape=15, size=3)),
         shape = guide_legend(override.aes = list(shape=c(21,24), fill="black", size=3)),
         colour = guide_legend(override.aes = list(linetype=c("dotdash", "F1"))),
         linetype = FALSE)

这是我所做的解释:

  1. geom_point ,将colour更改为fill 另外,将colour="transparent"放在aes之外。 这将摆脱点周围的边界。 如果您想要边框,请将其设置为您喜欢的任何边框颜色。
  2. scale_colour_manual ,我已将颜色设置为蓝色和红色,但您当然可以将它们设置为您喜欢的任何颜色。
  3. 添加scale_fill_manual以使用fill美学设置点的颜色。
  4. 添加scale_shape_manual并将值设置为 21 和 24(分别为实心圆和三角形)。
  5. guides()所有内容都是修改图例。 我不知道为什么,但没有这些覆盖,填充和形状的图例是空白的。 请注意,我为shape图例设置了fill="black" ,但它显示为灰色。 我不知道为什么,但没有fill="somecolor" shape图例是空白的。 最后,我覆盖了colour图例,以便在colour图例中包含线型,这让我摆脱了多余的linetype图例。 我对这个传说并不完全满意,但这是我能想出的最好的方法,而无需求助于特殊用途的grobs。

在此处输入图片说明

注意:我将color=NA更改为color="transparent" ,因为color=NA (在 ggplot2 的第 2 版中)会导致点完全消失,即使您使用具有单独边框和填充颜色的点。 感谢@aosmith 指出这一点

我认为ggplot2不会让您更改颜色两次并更新图例。 我似乎记得读过你不能在一个情节中改变scale_color_manual两次。 我找不到那个网页,但这篇文章触及了这个话题。 我也尝试使用这篇文章中的建议,但这没有用。 可能是因为我们试图混合geoms (但这只是一个猜测)。

我可以得到回归线的颜色:

part1 <- 
    ggplot(currDT,
           aes(x = EFP, y = SAPT), na.rm = TRUE) +
    stat_smooth(method = "lm", formula = y ~ x + 0, 
                aes(linetype = Halide, colour = Halide), 
                alpha = 0.8, size = 0.5, level = 0) +
    scale_linetype_manual(name = "", values = c("dotdash", "F1"),
                          breaks = c("hal", "non-hal"), 
                          labels = c("Halides", "Non-Halides")) +
    scale_color_manual(name = "", values = c("red", 'blue'),
                       labels = c("Halides", "Non-Halides"))
    ggsave('part1.jpeg', part1)

在此处输入图片说明 或者要绘制的数据点:

part2 <-           
    ggplot(currDT,
           aes(x = EFP, y = SAPT), na.rm = TRUE) +     
    geom_point(aes(color = Anion, shape = Cation),  size = 3, alpha = 0.4) +
    scale_linetype_manual(name = "", values = c("dotdash", "F1"),
                          breaks = c("hal", "non-hal"), 
                          labels =c("Halides", "Non-Halides")) +
    scale_colour_manual(values = my_col_scheme)   
    ggsave('part2.jpeg', part2)                      

在此处输入图片说明 但不是两者:

both <- 
    ggplot(currDT,
           aes(x = EFP, y = SAPT), na.rm = TRUE) +
    stat_smooth(method = "lm", formula = y ~ x + 0, 
                aes(linetype = Halide, colour = Halide), 
                alpha = 0.8, size = 0.5, level = 0) +
    scale_linetype_manual(name = "", values = c("dotdash", "F1"),
                      breaks = c("hal", "non-hal"), labels = c("Halides", "Non-Halides")) +
    geom_point(aes(color = Anion, shape = Cation),  size = 3, alpha = 0.4) +
    scale_colour_manual(values = my_col_scheme)                    
ggsave('both.jpeg', both)   

在此处输入图片说明

我认为您将需要添加每行手册。 希望其他人知道如何回答这个问题,但我认为@hadley 不允许改变两种颜色。 幸运的是,你是data.table所以应该很容易做到:-)

对试图解决这个问题的其他人发表评论希望我的部分回答可以帮助您回答这个问题。 此外,我的第三张图显示了ggplot2如何没有按照 OP 的要求获得 正确 的图例颜色。 作为另一个提示,您可以尝试使用图例选项。

为了完整起见 - 现在使用ggnewscale包可以轻松地为相同的美学添加两个比例

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM