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

R ggplot2中两种不同颜色美学映射的不同调色板,r,colors,ggplot2,R,Colors,Ggplot2,我的问题非常类似于,也是一个问题。我有一个散点图(使用geom_point),使用特定的调色板,按因子着色。我正在使用stat\u smooth通过点绘制某些平滑线,按另一个因子分组。我希望这些线条使用不同的调色板 这是一本书。就做一个 currDT <- read.table("SO_data", sep = "|", header = TRUE, strip.white = TRUE) 希望这足够清楚。下面是一些示例代码: icorr_elec <- ggplot(currDT

我的问题非常类似于,也是一个问题。我有一个散点图(使用
geom_point
),使用特定的调色板,按因子着色。我正在使用
stat\u smooth
通过点绘制某些平滑线,按另一个因子分组。我希望这些线条使用不同的调色板

这是一本书。就做一个

currDT <- read.table("SO_data", sep = "|", header = TRUE, strip.white = TRUE)
希望这足够清楚。下面是一些示例代码:

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"))

icorr\u elec我认为
ggplot2
不会让您更改两次颜色并更新图例。我似乎记得读过这样一篇文章:在一个绘图中,你不能两次更改
scale\u color\u 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)

第1部分您可以通过使用点的填充点标记并将其映射到
填充
美学,同时保持线映射到
颜色
美学,获得线和点的单独颜色映射。填充点标记是编号为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)
以下是我所做的解释:

  • geom_点
    ,将
    颜色
    美感更改为
    填充
    。另外,将
    color=“transparent”
    放在
    aes
    之外。这将消除边境点周围的边界。如果需要边框,请将其设置为您喜欢的任何边框颜色
  • scale\u color\u manual
    中,我已将颜色设置为蓝色和红色,但您当然可以将它们设置为您喜欢的任何颜色
  • 添加
    scale\u fill\u manual
    以使用
    fill
    设置点的颜色
  • 添加
    scale\u shape\u manual
    并将值设置为21和24(分别为填充圆和三角形)
  • guides()
    中的所有内容都是修改图例。我不知道为什么,但没有这些替代,填充和形状的图例是空白的。请注意,我已经为
    形状
    图例设置了
    fill=“black”
    ,但它显示为灰色。我不知道为什么,但是没有
    fill=“somecolor”
    形状
    图例是空白的。最后,我覆盖了
    颜色
    图例,以便在颜色图例中包含线型,这使我能够消除冗余的
    线型
    图例。我对这个传奇并不完全满意,但这是我能想到的最好的,而不必求助于特殊用途的Grob


    注意:我将
    color=NA
    更改为
    color=“transparent”
    ,因为
    color=NA
    (在ggplot2的版本2中)会导致点完全消失,即使使用具有单独边框和填充颜色的点也是如此。感谢@aosmith for.

    为了完整性起见,现在使用
    ggnewscale
    软件包可以很容易地为相同的美学效果添加两个音阶

    您介意添加一个吗?您的问题看起来很有趣,但我不想创建一个虚拟数据集来查看它。@RichardErickson谢谢您的关注,如果您需要更多信息,我很乐意提供,请告诉我。谢谢您的示例。仅供参考,我必须从
    sep=“|”
    中删除空格。我不知道这是我的电脑还是其他错误(我现在在Mac电脑上)。另外,出于好奇,你从哪里得到这些数据?它是来自一种乐器吗?我从来没有见过用
    |
    作为分隔符。@RichardErickson没有,我只是用
    write.table
    将data.table写入文本文件。我知道逗号和空格是更常见的分隔符,但它们有时会出现在数据中,尤其是字符/字符串类型中,而这是一个非常罕见的字符,因此我通常将其用作字段分隔符。我在下面给出了我的最佳尝试,但无法理解。祝你好运(顺便说一句,我也喜欢
    data.table
    )。将正确颜色的卤化物/非卤化物图例打印在
    第一部分的正确位置,然后在禁用该图例、透明背景和阳离子和卤化物图例的情况下打印
    这两个图例,这样它们就不会与第一个图例重叠了?哇,感谢您的努力!是的,在我问这个问题之前,我基本上就是这样结束的;顺便问一下,ggplot2对线条使用了哪些颜色?它似乎没有使用
    my_colu\u scheme
    @geryan你是在建议创建两个情节,然后一个一个地叠在另一个上面吗?这可以在R中完成吗?或者我们将看到一个外部的图像处理程序吗?@SamuelTan,是的,这是我的建议,但我用自己的一些代码尝试了它,但无法使它工作,对不起。是的。我忘了包括你的颜色代码。我正在更改它,但忘了重新添加。干得好!我对你为制作
    ggplot
    而进行的大量黑客攻击印象深刻。我尝试使用fill,但没有意识到我还必须将
    颜色
    更改为
    NA
    。谢谢。大部分作品都是为了与传奇人物搏斗。如果不希望在点周围有边框,只需包含
    color=NA
    。如果您不介意边框,您可以省略
    color=NA
    并获得黑色边框,或者您可以将颜色设置为您喜欢的任何颜色。干杯!使用
    填充
    而不是
    颜色
    非常聪明。我不会在
    指南上玩得太久而得到我想要的传奇。这就行了。至少现在是这样,因为我总是对其他方法持开放态度。有趣的是,对于
    geom_point
    使用
    fill
    而不是
    color
    仅当您同时指定
    shape
    内部或外部时才有效
    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)   
    
    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)