R编程:如何使用ggplot将堆栈与线图结合起来

时间:2017-01-08 04:08:21

标签: r plot ggplot2

我有以下数据集:

yr  v1  v2  v3
1   18  17  34
2   23  36  31
3   29  34  30
4   37  16  25
5   31  22  19

yr =年/时变量。我想绘制三个线图(对于v1,v2和v3)。然后在绘图区域引入三个水平条带,以显示基于此范围的高/中,低:

 >= 20 : LOW
 <20 and >= 30 : Medium
 >30: High

我用ggplot继续这样做:

首先我将所有值堆叠在一列中并创建了一个&#34; id&#34; &#34; var1&#34;,var2&#34;,&#34; var3&#34;的列获得三个线图:

TEST1:

yr  values  id
1   18  var1
2   23  var1
3   29  var1
4   37  var1
5   31  var1
1   17  var2
2   36  var2
3   34  var2
4   16  var2
5   22  var2
1   34  var3
2   31  var3
3   30  var3
4   25  var3
5   19  var3


ggplot(data = test1, aes(x = year, y = values, color = id)) + geom_line(aes(group = id)) + geom_point()

下一步:我为该范围创建了一个堆积图。

我将值40分配给&#34;高&#34;,将范围内的所有3个值(20,30,40)组合在一起。然后我添加了一个新专栏&#34; name&#34;显示高/中/低。

TEST2:

yr  values  name
1   20  low
2   20  low
3   20  low
4   20  low
5   20  low
1   30  med
2   30  med
3   30  med
4   30  med
5   30  med
1   40  high
2   40  high
3   40  high
4   40  high
5   40  high

ggplot(data = test2, aes(x = year, y = values, fill = name)) + geom_area(position = 'stack')

虽然这两个ggplots单独运行良好,但我不知道是否可以将它们组合在一个图中以获得: 这三条线在背景中有三条水平带。

提前多多感谢。

1 个答案:

答案 0 :(得分:2)

要一次绘制所有线条,您需要收集到长格式,这样您就可以将所有变量作为一个整体传递给y美学。要从单独的data.frame绘制波段,您需要传递geom_area新的数据参数和美学映射,而不是依赖于继承的数据。

没有test2这是一个近似值,但总的来说,大致是

library(tidyr)    # for `gather`
library(ggplot2)

test1 %>% gather(variable, value, -yr) %>%    # gather to long form
    ggplot(aes(yr, value, color = variable)) + 
    geom_area(data = expand.grid(yr = test1$yr,    # new data.frame for bands
                                 y = 10, 
                                 band = c('very low', 'low', 'medium', 'high')), 
              aes(yr, y, color = NULL, fill = band),    # new aesthetic for bands
              alpha = 0.2) + 
    geom_line() + geom_point()    # these can inherit aes from ggplot

multi-line plot with bands