我正在寻找一种方法来获得回归线和其他我想在图表上叠加的东西,从调色板中获取下一个可用的颜色。例如,假设我正在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
你得到这个情节:
我希望回归线颜色与主题保持一致。我可以弄清楚这个系列中的下一个颜色应该是C77CFF
,但如果我改变主题怎么办?
p + scale_fill_brewer(palette = "Set1")
有没有办法让geom_smooth
自动抓取调色板中的下一个颜色?或者只是抓住Nth颜色怎么样?在探索性数据分析之后,我知道我的数据中有多少个类,我对硬编码很好。我喜欢通过不同调色板的简单方法。
答案 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))
但是如果你想在同一个调色板中混合填充和颜色,你需要使用像我上面评论的解决方案。
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)
答案 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")