我有以下数据集:
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单独运行良好,但我不知道是否可以将它们组合在一个图中以获得: 这三条线在背景中有三条水平带。
提前多多感谢。
答案 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