首页 > 解决方案 > ggplot 上 geom_point 和 geom_smooth 的不同色阶

问题描述

我正在尝试绘制观察结果及其分组回归线ggplot,如下所示:

ggplot(df, aes(x = cabpol.e, y = pred.vote_share, color = coalshare)) +
  geom_point() +
  scale_color_gradient2(midpoint = 50, low="blue", mid="green", high="red") +
  geom_smooth(aes(x = cabpol.e, y = pred.vote_share, group=coalshare1, fill = coalshare1), se = FALSE, method='lm') +
  scale_fill_manual(values = c(Junior="blue", Medium="green", Senior="red"))

在此处输入图像描述 问题是来自的线条geom_smooth都是相同的颜色。我尝试使用scale_fill_manual以便没有两种不同的色标,并手动确定每个组对应的颜色。但相反,所有线条都显示为蓝色。如何使每条线具有不同的颜色?

根据要求,这是一组具有相同问题的可复制数据:

set.seed(1000)
dff <- data.frame(x=rnorm(100, 0, 1),
                  y=rnorm(100, 1, 2),
                  z=seq(1, 100, 1),
                  g=rep(c("A", "B"), 50))
ggplot(dff, aes(x = x, y = y, color = z, group = g, fill = g)) +
  geom_point() +
  scale_color_gradient2(midpoint = 50, low="blue", high="red") +
  geom_smooth(se = FALSE, method='lm')

在此处输入图像描述

标签: rggplot2colors

解决方案


我对这个问题的解决方案是创建多个 geom_smooth 调用,并且每次都将数据子集化为所需的因子水平。这样,您就可以将不同的颜色传递给 geom_smooth 的每个调用。只要你没有很多因素,这个解决方案并不是非常低效的。

dff <- data.frame(x=rnorm(100, 0, 1),
                  y=rnorm(100, 1, 2),
                  z=seq(1, 100, 1),
                  g=rep(c("A", "B"), 50))

ggplot(dff, aes(x = x, y = y,
                color = z,
                group = g)) +
    geom_point() +
    scale_color_gradient2(midpoint = 50, low="blue", high="red") + 
    geom_smooth(
     aes(x = x, y =y),
     color = "red",
     method = "lm",
     data = filter(dff, g == "A"),
     se = FALSE
    )  + 
    geom_smooth(
        aes(x = x, y =y),
        color = "blue",
        method = "lm",
        data = filter(dff, g == "B"),
        se = FALSE
    )

在此处输入图像描述


推荐阅读