R 在ggplot中添加多个功能区
我有一个有三条丝带的GGP图。我可以使用以下代码生成此绘图:R 在ggplot中添加多个功能区,r,ggplot2,R,Ggplot2,我有一个有三条丝带的GGP图。我可以使用以下代码生成此绘图: library(ggplot2) library(RColorBrewer) data <- data.frame( date = seq.Date(as.Date("2018-01-01"), as.Date("2018-01-31"), by= "days"), value = runif(min = 0, max = 1, n = 31) ) breaks <- c(0.1, 0.2, 0.3) r
library(ggplot2)
library(RColorBrewer)
data <- data.frame(
date = seq.Date(as.Date("2018-01-01"), as.Date("2018-01-31"), by= "days"),
value = runif(min = 0, max = 1, n = 31)
)
breaks <- c(0.1, 0.2, 0.3)
reds <- brewer.pal(3, "Reds")
pl <- ggplot2::ggplot(data = data,
aes(x = date, y = value)) +
geom_ribbon(
aes(
x = date,
ymin = value * (1 - breaks[1]),
ymax = value * (1 + breaks[1])
),
fill = reds[3],
alpha = 0.4
) +
geom_ribbon(
aes(
x = date,
ymin = value * (1 - breaks[2]),
ymax = value * (1 + breaks[2])
),
fill = reds[2],
alpha = 0.4
) +
geom_ribbon(
aes(
x = date,
ymin = value * (1 - breaks[2]),
ymax = value * (1 + breaks[2])
),
fill = reds[1],
alpha = 0.4
) +
geom_line(size = 1); pl
库(ggplot2)
图书馆(RColorBrewer)
数据如果将打断作为数据集的一部分,则可以重塑数据的形状,使打断成为一个变量,然后可以指定给美学(在本例中为fill)。我记得不久前回答过这个问题,尽管这个问题的计算实际上更复杂
为了使breaks
向量成为数据帧的一列,我只是将其添加为一个列表。每个观察都有相同的一组中断
数据%>%
突变(brk=列表(中断))
#>#A tibble:31 x 3
#>日期值brk
#>
#> 1 2018-01-01 0.0502
#> 2 2018-01-02 0.190
#> 3 2018-01-03 0.409
#> 4 2018-01-04 0.453
#> 5 2018-01-05 0.295
#> 6 2018-01-06 0.170
#> 7 2018-01-07 0.592
#> 8 2018-01-08 0.315
#> 9 2018-01-09 0.118
#> 10 2018-01-10 0.374
#> # ... 还有21行
取消列表列的测试,然后分离这些中断值,以便重复日期值组合,每个中断一次。由于有3个中断,现在有3倍的行
数据%>%
突变(brk=列表(中断))%>%
unnest()
#>#A tibble:93 x 3
#>日期值brk
#>
#> 1 2018-01-01 0.0502 0.1
#> 2 2018-01-01 0.0502 0.2
#> 3 2018-01-01 0.0502 0.3
#> 4 2018-01-02 0.190 0.1
#> 5 2018-01-02 0.190 0.2
#> 6 2018-01-02 0.190 0.3
#> 7 2018-01-03 0.409 0.1
#> 8 2018-01-03 0.409 0.2
#> 9 2018-01-03 0.409 0.3
#> 10 2018-01-04 0.453 0.1
#> # ... 还有83行
为了方便使用这些中断作为离散变量,我创建了一个列,它只是将中断值作为一个因子,并颠倒了顺序。这里比较棘手的一点(在我前面的问题中也是如此)是排序ggplot
层在前一层的基础上构建,因此如果最后绘制最宽的功能区,它将阻止所有较小的功能区。打断的默认顺序是数字顺序,但因为我对它们进行了因子处理,所以我可以反转级别,以便首先绘制最宽的一个(0.3),并因此在下一个图层下面分层
最后,做一行:对于这一行,您只需要日期和值,而不需要像我在取消测试时所做的那样重复它们,因此我在geom\u行中使用日期和值的不同组合。您可以用其他方式来实现这一点,包括创建两个数据帧,一个有重复,一个没有,但我通常更喜欢在一个管道中完成所有工作
数据%>%
突变(brk=列表(中断))%>%
unest()%>%
突变(brk_fct=as.factor(brk)%%>%fct_rev())%%>%
ggplot(aes(x=日期,y=值))+
geom_功能区(aes(ymin=value*(1-brk)、ymax=value*(1+brk)、fill=brk_fct))+
几何图形线(数据=.%>%不同(日期、值))+
比例填充酿酒器(调色板=“红色”)
由(v0.2.1)创建于2018-10-05,我的第一反应是创建一个带有中断的长数据集,作为另一个答案的新列。但是,可以在循环中添加层
添加带有循环的图层可能很棘手,因为ggplot2会延迟计算,直到渲染绘图为止(请参见说明)。我们可以通过tidyeval代码使用“取消引用”强制求值
您将看到我循环了中断的数量,并为每个中断添加了一个层,但是通过使用取消引用强制计算代码>
您将看到,我还使用rev()
反转调色板
reds = brewer.pal(length(breaks), "Reds")
p1 = ggplot(data = data,
aes(x = date, y = value))
for(i in 1:length(breaks)) {
p1 = p1 + geom_ribbon( aes(ymin = value*(1 - !!breaks[i]),
ymax = value*(1 + !!breaks[i])),
fill = rev(reds)[i],
alpha = .4)
}
p1 + geom_line(size = 1)
这基本上是@camille答案的基本版本(我在写作时没有看到)。不管怎样,我还是把它贴出来吧
ggplot(data = data, aes(x = date, y = value)) +
geom_line(size = 1) +
geom_ribbon(data = merge(expand.grid(date = data$date, breaks = breaks), data),
aes(ymin = value * (1 - breaks), ymax = value * (1 + breaks),
fill = factor(breaks, levels = rev(unique(breaks)))), alpha = 0.4) +
scale_fill_brewer(palette = "Reds")
嗨,卡米尔,非常感谢你的完美回答。那正是我要找的!工作也很完美!我不知道取消报价的诀窍。。。谢谢