【问题标题】:How to add a line to a boxplot using ggplot2如何使用 ggplot2 在箱线图中添加一条线
【发布时间】:2017-05-04 21:57:58
【问题描述】:

我正在尝试使用一些预测数据绘制箱须图。并希望将观察结果作为一条线添加到图中。我在这里制作了一个数据样本,以便您了解它的样子。

$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&lt;- p + geom_line(data = observation,aes(x=Dt,y=obs)) 。 这给出了一个错误提示:

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

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

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

谁能建议我如何做到这一点?提前致谢。

【问题讨论】:

    标签: r date ggplot2


    【解决方案1】:
    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 创建一个单独的框。然后添加行很简单。

    如果您希望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)
    

    另外请注意,我在第二张图中删除了 width 选项(这意味着我只是使用默认的 ggplot 值)。您可以使用该值来查看与您的数据最匹配的值。

    最后,在我的两个示例中,我将数据和美学移到了将要使用它们的 geom 语句中。在复杂的数字中,有时很难记住哪些层使用了哪些数据以及哪些美学,因此在您进行调试和故障排除时,最好在主要的 ggplot() 调用中没有任何内容。

    【讨论】:

    • 完美。我正在寻找类似你的第二种方法的东西。非常感谢。
    • 有什么方法可以定义这个情节的胡须吗?我尝试使用定义函数和 geom="boxplot" 的 stat_summary。虽然这确实包含给定的范围定义,但会混淆组。
    • 如何定义?根据文档ggplot2.tidyverse.org/reference/geom_boxplot.html,晶须延伸到四分位间距的 1.5 倍,但可以使用 coef =geom_boxplot 内进行调整。如果您希望胡须成为其他统计信息,则需要像您尝试过的那样将函数传递给 stat_summary,但您需要包含上面的 aes(...) 以保持分组正确。
    【解决方案2】:

    试试这个:

    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)/

    【讨论】:

    • 我不想添加水平线。我想添加一条线来代表我的观察结果。
    【解决方案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))
    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)
    

    【讨论】:

    • 谢谢。似乎使用 geom_line 的 group 参数解决了这个问题。
    猜你喜欢
    • 2018-08-09
    • 1970-01-01
    • 2011-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多