在 ggplot2 中使用组汇总值作为 geom_ribbon?
Use group summary values as geom_ribbon in ggplot2?
我正在尝试按组绘制线图,我想在其中添加覆盖类别 min
和 max
值的底层阴影。我想复制这样的情节,但灰色阴影覆盖了黑色虚线和实线之间的所有部分(未显示置信区间):
通常,这是使用 geom_ribbon
完成的,我需要为 aes(ymin = ymin, ymax = ymax)
指定值。但是如何为组 c
和 a
的值传递 ymin
和 ymax
值(在我的示例中)?
这是我的虚拟示例:
# example for shaded line plot
dd <- data.frame(year = c(1:5),
group = rep(c("a", "b", "c"), each = 5),
vals = c(5, 5.2, 5.6, 5.8, 6,
5, 4.9, 4.8, 4.7, 4.2,
5, 4.8, 4.4, 4, 3))
dd %>%
ggplot(aes(x = year,
y = vals,
shape = group,
color = group,
linetype = group)) +
ylim(0,6.5) +
geom_line(lwd = 1.5) +
theme_bw()
我的数据是长格式的,而且我有很多组,所以我希望能有一些自动解决方案。提前谢谢你。
我的做法:
将数据从长格式转换为宽格式以将参数作为 ymin
和 ymax
传递。无法使用两个不同的数据帧:
# maybe first convert data from long to wide?
library(tidyr)
dd.spread <- spread(dd, group, vals)
dd %>%
ggplot(aes(x = year,
y = vals,
shape = group,
color = group,
linetype = group)) +
geom_line() +
geom_ribbon(dd.spread, aes(ymin = c, ymax = a), color = "grey70")
预期结果(a-c 之间的阴影):
您可以在层的 data
参数处添加一个偷偷摸摸的 pivot_wider
。在下面的示例中,我将一些美学从主绘图调用迁移到线层,因为它们在色带层中存在冲突。
library(ggplot2)
library(tidyr)
#> Warning: package 'tidyr' was built under R version 4.0.3
# example for shaded line plot
dd <- data.frame(year = c(1:5),
group = rep(c("a", "b", "c"), each = 5),
vals = c(5, 5.2, 5.6, 5.8, 6,
5, 4.9, 4.8, 4.7, 4.2,
5, 4.8, 4.4, 4, 3))
dd %>%
ggplot(aes(x = year)) +
ylim(0,6.5) +
geom_ribbon(
data = ~ pivot_wider(., names_from = group, values_from = vals),
aes(ymin = c, ymax = a)
) +
geom_line(aes(y = vals,
color = group,
linetype = group),
lwd = 1.5) +
theme_bw()
由 reprex package (v1.0.0)
于 2021 年 4 月 19 日创建
我正在尝试按组绘制线图,我想在其中添加覆盖类别 min
和 max
值的底层阴影。我想复制这样的情节,但灰色阴影覆盖了黑色虚线和实线之间的所有部分(未显示置信区间):
通常,这是使用 geom_ribbon
完成的,我需要为 aes(ymin = ymin, ymax = ymax)
指定值。但是如何为组 c
和 a
的值传递 ymin
和 ymax
值(在我的示例中)?
这是我的虚拟示例:
# example for shaded line plot
dd <- data.frame(year = c(1:5),
group = rep(c("a", "b", "c"), each = 5),
vals = c(5, 5.2, 5.6, 5.8, 6,
5, 4.9, 4.8, 4.7, 4.2,
5, 4.8, 4.4, 4, 3))
dd %>%
ggplot(aes(x = year,
y = vals,
shape = group,
color = group,
linetype = group)) +
ylim(0,6.5) +
geom_line(lwd = 1.5) +
theme_bw()
我的数据是长格式的,而且我有很多组,所以我希望能有一些自动解决方案。提前谢谢你。
我的做法:
将数据从长格式转换为宽格式以将参数作为 ymin
和 ymax
传递。无法使用两个不同的数据帧:
# maybe first convert data from long to wide?
library(tidyr)
dd.spread <- spread(dd, group, vals)
dd %>%
ggplot(aes(x = year,
y = vals,
shape = group,
color = group,
linetype = group)) +
geom_line() +
geom_ribbon(dd.spread, aes(ymin = c, ymax = a), color = "grey70")
预期结果(a-c 之间的阴影):
您可以在层的 data
参数处添加一个偷偷摸摸的 pivot_wider
。在下面的示例中,我将一些美学从主绘图调用迁移到线层,因为它们在色带层中存在冲突。
library(ggplot2)
library(tidyr)
#> Warning: package 'tidyr' was built under R version 4.0.3
# example for shaded line plot
dd <- data.frame(year = c(1:5),
group = rep(c("a", "b", "c"), each = 5),
vals = c(5, 5.2, 5.6, 5.8, 6,
5, 4.9, 4.8, 4.7, 4.2,
5, 4.8, 4.4, 4, 3))
dd %>%
ggplot(aes(x = year)) +
ylim(0,6.5) +
geom_ribbon(
data = ~ pivot_wider(., names_from = group, values_from = vals),
aes(ymin = c, ymax = a)
) +
geom_line(aes(y = vals,
color = group,
linetype = group),
lwd = 1.5) +
theme_bw()
由 reprex package (v1.0.0)
于 2021 年 4 月 19 日创建