使用ggplot2中的调色板填充/颜色来表示回归线等

时间:2017-07-20 15:34:41

标签: r ggplot2 colors

我正在寻找一种方法来获得回归线和其他我想在图表上叠加的东西,从调色板中获取下一个可用的颜色。例如,假设我正在mpg数据集中绘制cyl vs mtcars。我认为每个cyl都是不同的样本,因此我使用的是定性调色板,但我在燃料效率是柱面的线性函数的假设下添加回归线。

library(ggplot2)
p <- ggplot(mtcars, aes(cyl, mpg)) +
  geom_violin(aes(fill = factor(cyl))) +
  geom_jitter(width = 0.5) +
  geom_smooth(method = "lm") +
  theme(legend.position = "none") +
  scale_x_continuous(breaks = c(4,6,8))
p

你得到这个情节:

plot

我希望回归线颜色与主题保持一致。我可以弄清楚这个系列中的下一个颜色应该是C77CFF,但如果我改变主题怎么办?

p + scale_fill_brewer(palette = "Set1")

stuff

有没有办法让geom_smooth自动抓取调色板中的下一个颜色?或者只是抓住Nth颜色怎么样?在探索性数据分析之后,我知道我的数据中有多少个类,我对硬编码很好。我喜欢通过不同调色板的简单方法。

2 个答案:

答案 0 :(得分:1)

实现它的最简单方法是仅使用颜色美学,而不是颜色和填充。请注意,通过更改小提琴的轮廓而不是填充,我们可以在平滑器的aes()内手动添加另一个颜色级别,称为“回归”。这对于更改调色板也很有用,请参见下面的示例。

ggplot(mtcars, aes(cyl, mpg)) +
  geom_violin(aes(colour = factor(cyl)), size = 2) +
  geom_jitter(width = 0.5) +
  geom_smooth(method = "lm", aes(color = "Regression"), size = 2) +
  scale_x_continuous(breaks = c(4,6,8))

enter image description here

enter image description here

但是如果你想在同一个调色板中混合填充和颜色,你需要使用像我上面评论的解决方案。

numbrk <- 4
# Your number of categories, known a priori, plus one

mypal <- scales::brewer_pal(palette = "YlGnBu")(numbrk)
# Now you just have to put in your chosen palette once
# "#FFFFCC" "#A1DAB4" "#41B6C4" "#225EA8"

fillpal <- mypal[1:(numbrk-1)]
colpal <- mypal[numbrk]

ggplot(mtcars, aes(cyl, mpg)) +
  geom_violin(aes(fill = factor(cyl))) +
  geom_jitter(width = 0.5) +
  geom_smooth(method = "lm", aes(color = "Regression")) +
  scale_x_continuous(breaks = c(4,6,8)) +
  scale_fill_manual(values = fillpal) +
  scale_colour_manual(values = colpal)

enter image description here

答案 1 :(得分:0)

我不确定这是否更容易,但你可以创建一个类似下面的函数来实现你想要的结果:

palette_plot <- function(df, x_var, y_var, chosen_palette) {
  num_levels <- nlevels(as.factor(df[[x_var]]))
  line_color <- scales::brewer_pal(palette = chosen_palette)(num_levels + 1)
  line_color <- line_color[[num_levels + 1]]
  fill_var   <- as.factor(df[[x_var]])

  ggplot(df) +
    aes_string(x_var, y_var) +
    geom_violin(aes(fill = fill_var)) +
    geom_jitter(width = 0.5) +
    geom_smooth(method = "lm", color = line_color) +
    theme(legend.position = "none") +
    scale_x_continuous(breaks = c(4,6,8)) +
    scale_fill_brewer(palette = chosen_palette)
}

测试&#34; Pastel2&#34;调色板。

 palette_plot(mtcars, "cyl", "mpg", "Pastel2")

enter image description here