ggplot2箱线图中位数的绘制结果与预期不符

10
所以我有一个相当大的数据集(Dropbox:csv文件),我正在尝试使用geom_boxplot进行绘图。以下内容产生了一个看起来合理的图形:
require(reshape2)
require(ggplot2)
require(scales)
require(grid)
require(gridExtra)

df <- read.csv("\\Downloads\\boxplot.csv", na.strings = "*")
df$year <- factor(df$year, levels = c(2010,2011,2012,2013,2014), labels = c(2010,2011,2012,2013,2014))

d <- ggplot(data = df, aes(x = year, y = value)) +
    geom_boxplot(aes(fill = station)) + 
    facet_grid(station~.) +
    scale_y_continuous(limits = c(0, 15)) + 
    theme(legend.position = "none"))
d

然而,当你深入挖掘时,问题开始出现并使我感到惊慌。当我标注箱线图中位数的值时,会得到以下图形结果。

df.m <- aggregate(value~year+station, data = df, FUN = function(x) median(x))
d <- d + geom_text(data = df.m, aes(x = year, y = value, label = value)) 
d

boxplots-with-medians-labelled

使用geom_boxplot绘制的中位数并不是真正的中位数。标签在正确的y轴值处绘制,但箱线图的中位数明显不在中位数位置上。我已经被这个问题难住了几天。

出现这种情况的原因是什么?如何制作具有正确中位数的此类型显示?如何调试或诊断此图?


1
你的示例代码存在不一致。你正在对temp.m调用geom_text,但中位数是计算在turb.m中的。这可能是问题所在吗? - vpipkt
啊!你说得对,我试图从原始代码中删除不一致之处,但是我错过了那个。那个错误会导致geom_text层失败,但即使在绘图中没有添加geom_text,箱线图上的中位数仍然被错误地绘制。 - Ryan Pugh
你的数据框中 year 是什么数据类型? - vpipkt
我已经尝试将df$year转换为数字、因子和整数,但都没有成功。这很奇怪,因为有些箱线图显示正确,中位数也如预期标记。当我将数据子集缩小到一个年份和站点时,它仍然无法正确绘制箱线图。我已经使用最小数据集仔细检查了数据,但是找不到任何问题! - Ryan Pugh
1
我已经编辑了原始帖子,包括生成分面图的完整代码。正如您可以在这里看到的那样,在标签未能落在箱线图水平线上的地方存在问题。我已经将数据集缩减到单个站点(放电),仅使用2012年的数据,但仍然得到完全相同的箱线图。 - Ryan Pugh
显示剩余3条评论
1个回答

11

解决这个问题的方法在于应用 scale_y_continuous。ggplot2会按照以下顺序执行操作:

  1. 比例变换(Scale Transformations)
  2. 统计计算(Statistical Computations)
  3. 坐标变换(Coordinate Transformations)

在这种情况下,由于调用了比例变换,因此ggplot2会在箱线图上的统计计算中排除超出比例限制的数据。但是使用 aggregate 函数计算并在 geom_text 指令中使用的中位数将使用整个数据集。这可能导致不同的中位数箱和文本标签。

解决方案是省略 scale_y_continuous 指令,改为使用:

d <- ggplot(data = df, aes(x = year, y = value)) +
geom_boxplot(aes(fill = station)) + 
facet_grid(station~.) +
theme(legend.position = "none")) +
coord_cartesian(y = c(0,15))

这使得ggplot2可以使用整个数据集计算箱线图的分位数统计量,同时限制图形的大小。


1
在我看来,这是 ggplot2 的一个主要问题。我已经使用它很长一段时间了,却没有注意到这个问题 - 应该有警告提示。 - ajrwhite
1
这让我对数据的解释变得非常谨慎和紧张。当我第一次遇到这种情况时,我对R的一切都产生了质疑,直到最终理解了发生了什么。我相信有很多偶尔使用R/ggplot的用户并不知道这可能会影响他们的工作。 - Ryan Pugh
@Ryan Pugh,我很感激您能提供在ggplot代码中进行“统计计算”的示例! - Agile Bean

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