向网格中的每个构面添加一条线

时间:2019-06-24 09:48:26

标签: r ggplot2 facet facet-grid

假设我具有以下数据框:

from django.http import JsonResponse

return JsonResponse(filtered_data, safe=False)

我将其可视化为具有3个小平面(每种类型分别为a,b和c)的一个网格,并具有一个公共的X轴(日期):

  dates          types vals
1 2018-02-01     a     10
2 2018-03-01     a     11
3 2018-04-01     a     12
4 2018-05-01     b     20
5 2018-06-01     b     21
6 2018-07-01     b     22
7 2018-08-01     c     30
8 2018-09-01     c     31
9 2018-10-01     c     32

enter image description here

现在,我想为每个构面添加一条水平线,以使每个构面都有自己的y轴截距。基于类似的问题,我尝试创建一个带有一列截距的数据框:

gg <- ggplot(df, aes(x = dates, y = vals)) + 
  geom_line(aes(color = df$types)) +
  geom_point() +
  facet_grid(types ~ ., scales = "free_y") +
  scale_color_manual(values =c("blue", "orange", "green"))

并使用lower = seq(10,30,10); upper = seq(12,32,10) bounds <- data.frame(lower, upper) 添加它:

geom_hline

但是结果是每个方面都是三行,而不是它自己的行(我也想在gg + geom_hline(aes(yintercept = lower), data = bounds, color = 'red') 列中添加一行,但我猜解决方案是对称的)。

enter image description here

2 个答案:

答案 0 :(得分:3)

您需要添加lower规范以匹配多面数据,如下所示:

library('dplyr')
df <- df %>% mutate(lower = rep(c(10,20,30), each =3))
df
       dates types vals lower
1 2018-02-01     a   10    10
2 2018-03-01     a   11    10
3 2018-04-01     a   12    10
4 2018-05-01     b   20    20
5 2018-06-01     b   21    20
6 2018-07-01     b   22    20
7 2018-08-01     c   30    30
8 2018-09-01     c   31    30
9 2018-10-01     c   32    30

然后像以前一样指定图并像这样添加geom_hline到带有lower列的已更改df上,如下所示:

gg + geom_hline(aes(yintercept = lower), color = 'red')

然后您将得到如下内容:

enter image description here

答案 1 :(得分:1)

尽管有一个accepted answer,但这是loading bounds from another dataframe的一种方式,就像OP在评论中要求的那样。

首先,查看types在数据帧bounds中的位置。

cbind(bounds, types = c('a', 'b', 'c'))
#  lower upper types
#1    10    12     a
#2    20    22     b
#3    30    32     c

与原始df合并后的结果是什么。

merge(cbind(bounds, types = c('a', 'b', 'c')), df)
#  types lower upper      dates vals
#1     a    10    12 2018-02-01   10
#2     a    10    12 2018-03-01   11
#3     a    10    12 2018-04-01   12
#4     b    20    22 2018-05-01   20
#5     b    20    22 2018-06-01   21
#6     b    20    22 2018-07-01   22
#7     c    30    32 2018-08-01   30
#8     c    30    32 2018-09-01   31
#9     c    30    32 2018-10-01   32

似乎正确,就在types所在的位置。
因此将其绘制出来,以适应问题中的代码。

gg + geom_hline(data = merge(cbind(bounds, types = c('a', 'b', 'c')), df),
             aes(yintercept = lower), 
             color = 'red')

enter image description here