Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 在ggplot中添加多个功能区_R_Ggplot2 - Fatal编程技术网

R 在ggplot中添加多个功能区

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

我有一个有三条丝带的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)
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")

嗨,卡米尔,非常感谢你的完美回答。那正是我要找的!工作也很完美!我不知道取消报价的诀窍。。。谢谢