如何在使用ggplot2绘制的箱线图中添加一条线

3
我正在尝试使用一些预测数据进行箱形图和须线图的绘制,并想将观测结果添加到图中作为一条线。我在此处提供了数据示例,以便您了解其外观。 $forecasts <- data.frame(f_type=c(rep("A",9),rep("B",9)),Date=c(rep(as.Date("2007-01-31"),3),rep(as.Date("2007-02-28"),3),rep(as.Date("2007-03-31"),3),rep(as.Date("2007-01-31"),3),rep(as.Date("2007-02-28"),3),rep(as.Date("2007-03-31"),3)),value=c(10,50,60,05,90,20,30,46,39,69,82,48,65,99,75,15,49,27)) $observation <- data.frame(Dt=c(as.Date("2007-01-31"),as.Date("2007-02-28"),as.Date("2007-03-31")),obs=c(30,49,57))
利用ggplot2库可以绘制出预测的箱形图,如下所示。 $p <- ggplot(data = forecasts, aes(x=as.factor(Date), y=value)) p <- p + geom_boxplot(aes(fill=f_type))
现在,我想将这些日期的观察结果作为一条线添加到此图中。到目前为止,我已经尝试了以下方法:
1. $p <- p + geom_line(data = observation,aes(x=Dt,y=obs))。 但是会产生错误:Error: Invalid input: date_trans works with objects of class Date only。
2. 将x轴作为因子,如下所示: $p <- p + geom_line(data = observation,aes(x=as.factor(Dt),y=obs))。 但是会产生以下错误:geom_path: Each group consists of only one observation. Do you need to adjust the group aesthetic?
请问有谁可以提供一些方法来实现这个目标吗?提前感谢。
3个回答

5
ggplot() + 
  geom_boxplot(data = forecasts,
               aes(x = Date, y = value, 
                   group = interaction(Date, f_type), 
                   fill = f_type), 
               width = 10) + 
  geom_line(data = observations,
            aes(x = Dt, y = obs), size = 2)

这是您想要的内容。您需要将x变为连续日期变量(而非您代码中的as.factor)。这样,x轴所期望的数据类型在两个数据集中相同。您需要添加group =行,以便它知道为每个日期和f_type制作单独的框。然后添加该行很简单。

enter image description here

如果你不希望 x 成为一个连续的日期,那么你使用 as.factor 是正确的,但是你需要在 geom_line 中添加一个 group,以便它知道如何连接跨越离散因子的点。
ggplot() + 
  geom_boxplot(data = forecasts,
               aes(x = as.factor(Date), y = value, 
                   group = interaction(Date, f_type), 
                   fill = f_type)) + 
  geom_line(data = observations,
            aes(x = as.factor(Dt), y = obs, group = 1), size = 2)

enter image description here

同时请注意,我在第二个图表中删除了width选项(这意味着我只是使用默认的ggplot值)。您可以尝试改变该值以查看哪个值最适合您的数据。
最后,在我的两个示例中,我将数据和美学移入了即将使用它们的geom语句中。在复杂的图形中,有时很难记住哪些层使用哪些数据和美学,因此在调试和故障排除时,没有任何主要的ggplot()调用是很好的。

太好了。我正在寻找像你的第二种方法这样的东西。非常感谢。 - Reza Ahmad
有没有办法为这个图形定义箱线图?我尝试了使用已定义函数和geom="boxplot"的stat_summary。虽然它确实接受了给定的范围定义,但却搞乱了分组。 - Reza Ahmad
如何定义?根据文档 http://ggplot2.tidyverse.org/reference/geom_boxplot.html,箱线图的须延伸到 1.5 倍四分位距,但可以通过在 geom_boxplot 中使用 coef = 进行调整。如果想要须延伸到其他统计量,需要传递一个函数给 stat_summary,就像你尝试的那样,但需要包含上面的 aes(...) 以保持正确的分组。 - Brian

3

尝试这个:

p<- ggplot(data = forecasts, aes(x=as.factor(Date), y=value))
p<- p + geom_boxplot(aes(fill=f_type))

p <- p +  geom_hline(aes(yintercept=12), colour="#990000")
p

这是一个链接:http://www.cookbook-r.com/Graphs/Lines_(ggplot2)/,与 ggplot2 相关的图表制作技术。

我不是想添加一条水平线。我想添加一条代表我的观察的线。 - Reza Ahmad

2
forecasts<- data.frame(f_type = c(rep("A",9), rep("B",9)), Date = c(rep(as.Date("2007-01-31"),3), rep(as.Date("2007-02-28"),3), rep(as.Date("2007-03-31"),3), rep(as.Date("2007-01-31"),3), rep(as.Date("2007-02-28"),3), rep(as.Date("2007-03-31"),3)), value = c(10,50,60,05,90,20,30,46,39,69,82,48,65,99,75,15,49,27))

observation<- data.frame(Dt = c(as.Date("2007-01-31"), as.Date("2007-02-28"), as.Date("2007-03-31")), obs = c(30,49,57))
p <- ggplot(data = forecasts, aes(x = as.factor(Date), y = value))
p <- p + geom_boxplot(aes(fill = f_type))
p <- p + geom_line(data = observation,aes(x = as.factor(Dt), y = obs, group = 1))
print(p)

boxplot with line


谢谢。使用geom_line的group参数似乎解决了这个问题。 - Reza Ahmad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接