0

我正在尝试按组绘制线图,我想在其中添加下层阴影覆盖minmax类别值。我想复制这样的情节,但灰色阴影覆盖了黑色虚线和实线之间的所有内容(不显示置信区间):

在此处输入图像描述

通常,这是使用geom_ribbon我需要为aes(ymin = ymin, ymax = ymax). 但是如何传递组的值yminymax值(在我的例子中)?ca

这是我的虚拟示例:

# 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()

我的数据是长格式的,我有很多组,所以我会很感激一些自动解决方案。先感谢您。

我的做法:

将数据从长格式转换为宽格式以将参数传递为yminymax. 无法使用两个不同的数据框:

# 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")

预期结果(ac 之间的阴影):

在此处输入图像描述

4

1 回答 1

1

pivot_wider你可以在一个层的data参数上偷偷摸摸。在下面的示例中,我将一些美学从主绘图调用迁移到线层,因为它们在功能区层中发生冲突。

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 包创建于 2021-04-19 (v1.0.0)

于 2021-04-19T13:24:00.977 回答