【问题标题】:Using palette fill/colors in ggplot2 for regression lines and such在 ggplot2 中使用调色板填充/颜色作为回归线等
【发布时间】:2017-07-20 15:34:40
【问题描述】:

我正在寻找一种方法,让回归线和其他我可能希望覆盖在图表上的东西从调色板中获取下一个可用颜色。例如,假设我在mtcars 数据集中绘制mpgcyl。我将每个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

你得到这个情节:

我希望回归线的颜色与主题保持一致。我可以算出这个系列的下一个颜色应该是C77CFF,但是如果我改变主题呢?

p + scale_fill_brewer(palette = "Set1")

有没有办法让geom_smooth 自动抓取调色板中的下一个颜色?或者只是抓住第 N 个颜色怎么样?在探索性数据分析之后,我知道我的数据中有多少类,并且我可以对它进行硬编码。我只是想要一种更简单的方法来浏览不同的调色板。

【问题讨论】:

  • 您可以使用scale_*_manual 进行颜色和填充,使用scales::brewer.palscales::hue.pal 提供的手动颜色。例如,scales::brewer_pal(palette = "Spectral")(5) 生成一个包含五种颜色的向量,“#D7191C”“#FDAE61”“#FFFFBF”“#ABDDA4”“#2B83BA”。
  • 布赖恩,我认为这不能回答我的问题。我总是可以手动更改填充/颜色,但我正在寻找一种方法让geom_smooth 根据我添加的任何调色板自动更新。这可能吗?

标签: r ggplot2 colors


【解决方案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))

但是,如果您希望能够在同一个调色板中混合填充和颜色,则需要使用类似于我上面评论的解决方案。

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)

【讨论】:

  • 这样就行了。您还可以通过为小提琴图和平滑线设置颜色和填充来扩展它。谢谢!
【解决方案2】:

我不确定这是否更容易,但您可以创建如下函数来实现您想要的结果:

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

测试“Pastel2”调色板。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-12
    • 2015-07-27
    • 1970-01-01
    • 2016-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多