如何使用ggplot2向boxplot添加一行

时间:2017-05-04 21:57:59

标签: r date ggplot2

我正在尝试使用一些预测数据来制作盒子和胡须图。并希望将观察结果添加到情节中。我在这里生成一个数据样本,以便您可以理解它的样子。

$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))。 这给出了一个错误说:

      

    错误:输入无效:date_trans仅适用于类Date的对象

  2. 以x轴为因子,如下所示: $p<- p + geom_line(data = observation,aes(x=as.factor(Dt),y=obs))我收到以下错误:

      

    geom_path:每组只包含一个观察。你需要调整群体审美吗?

  3. 任何人都可以建议我如何做到这一点?提前谢谢。

3 个答案:

答案 0 :(得分: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)/

答案 1 :(得分: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

答案 2 :(得分:2)

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是正确的,但是您需要添加groupgeom_line所以它知道如何跨离散因子连接点。

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()调用中使用任何数据。