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

Rez*_*mad 3 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:每组仅包含一个观察值。群体审美需要调整吗?

谁能建议我如何实现这一目标?提前致谢。

Bri*_*ian 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)
Run Code Online (Sandbox Code Playgroud)

这就是你想要的。您需要x成为连续日期变量(不像as.factor您的代码中那样)。这样,两个数据集中 x 轴期望的数据类型是相同的。您需要添加该group =行,以便它知道为每个日期和 f_type 创建一个单独的框。然后添加该行就很简单了。

在此输入图像描述

如果您不想x成为连续日期,那么您的使用是正确的as.factor,但是您需要向 中添加 a 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)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

另请注意,我删除了width第二张图中的选项(这意味着我只是使用默认的 ggplot 值)。您可以尝试使用该值,看看什么最适合您的数据。

最后,在我的两个示例中,我将数据和美学转移到geom将要使用它们的语句中。在复杂的图形中,有时很难记住哪些层使用哪些数据和哪些美学,因此在调试和故障排除时,最好不要在主ggplot()调用中使用任何数据。