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

时间:2015-04-30 01:48:20

标签: r colors ggplot2

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

这是Dropbox link to some example data。做一个

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中完成?从我收集的其他问题中,我可以手动指定每一行,但我想避免这样做。

3 个答案:

答案 0 :(得分:11)

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

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()内的所有内容都是修改图例。我不确定为什么,但没有这些覆盖,填充和形状的图例是空白的。请注意,我为fill="black"图例设置了shape,但它显示为灰色。我不知道为什么,但没有fill="somecolor" shape传奇是空白的。最后,我覆盖了colour图例,以便在颜色图例中包含线型,这样我就可以摆脱多余的linetype图例。我对这个传说并不完全满意,但这是我能想到的最好的,而不是诉诸于特殊用途的丛林。
  6. enter image description here

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

答案 1 :(得分:4)

我不认为scale_color_manual会让你改变颜色两次并更新图例。我似乎记得读到你不能在情节中改变geoms两次。我无法找到该网页,但此post触及了该主题。我也尝试过使用post中的建议,但这并不奏效。可能是因为我们试图混合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)                      

enter image description here 或者数据指向情​​节:

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)   

enter image description here 但不是两个:

data.table

enter image description here

我认为你需要添加每一行手册。希望其他人知道如何回答这个,但我不认为@hadley允许两种颜色都改变。幸运的是,你ggplot2因此应该很容易做到: - )

评论试图解决此问题的任何人希望我的部分答案可以帮助您回答这个问题。另外,我的第三个图显示private void addButton_Click(object sender, EventArgs e) { string newItem = String.Format("{0} - {1} - {2} - {3}", titleTextBox.Text, descriptionTextBox.Text, priorityTrackbar.Value, endDateTimePicker.Value.ToShortDateString() ); this.checkListBox.Items.Add(newItem); } 如何获得传说颜色正确,因为OP想要它。作为另一个提示,您可以尝试使用图例选项。

答案 2 :(得分:1)

出于完整性考虑,使用JENKINS_URL/generic-webhook-trigger/invoke?token=<your-token>包,现在可以很容易地为相同的美感添加两个音阶