格式化在 ggplot 的箱线图中显示为文本的数字。解释箱线图外均值的定位

Posted

技术标签:

【中文标题】格式化在 ggplot 的箱线图中显示为文本的数字。解释箱线图外均值的定位【英文标题】:Formating the numbers appearing as text in a boxplot in ggplot. Explaining the positioning of means outside the boxplots 【发布时间】:2017-08-17 17:50:44 【问题描述】:

我在 ggplot 中为显示平均值的箱线图开发了代码——调用自定义函数。代码如下:

fun_mean <- function(x)
  return(data.frame(y=round(mean(x), digits = 3),label=mean(x,na.rm=T)))
ggplot(my_data, aes(x = as.factor(viotiko), y = pd_1year, fill = as.factor(viotiko))) + geom_boxplot() +
  labs(title="Does the PD differ significantly by 'Viotiko' group?",x="Viotiko Group", y = "PD (pd_1year)") +
  coord_cartesian(ylim = c(0,0.05))  + stat_summary(fun.y = mean, geom="point",colour="darkred", size=3) +
  stat_summary(fun.data = fun_mean, geom="text", vjust=-0.7)

输出的箱线图如下:

如您所见,虽然我已将平均值四舍五入,只包含 3 个十进制数字,但它们看起来很长并且使情节混乱。

我应该怎么做才能将显示的数字限制为 3?

此外,我对大多数组中均值出现在箱线图所描绘的分布之外这一事实感到困惑。这怎么解释?

您的建议将不胜感激。

【问题讨论】:

或许label = round(mean(x,na.rm=T), 3)? 要回答您的第二个问题(并且作为关于 SO 问题的一般规则),请提供minimal reproducible example,例如dput(my_data) 的结果。否则,您的问题可能会被否决或关闭。谢谢。 【参考方案1】:

我伪造了一些数据来重现这个 - 将来你应该在发布之前自己做:

library(ggplot2)

set.seed(1234)

n <- 100

my_data <- data.frame(viotiko=sample(0:8,n,T),pd_1year=exp(rnorm(n,-4.5,0.8)))

fun_mean <- function(x)
  y = mean(x,na.rm=T)
  return(data.frame(y=y,label=round(y,3)))


ggplot(my_data, aes(x = as.factor(viotiko), y = pd_1year, fill = as.factor(viotiko))) + 
  geom_boxplot() +
  labs(title="Does the PD differ significantly by 'Viotiko' group?",
                               x="Viotiko Group", y = "PD (pd_1year)") +
  coord_cartesian(ylim = c(0,0.05))  + 
  stat_summary(fun.y = mean, geom="point",colour="darkred", size=3) +
  stat_summary(fun.data = fun_mean, geom="text", vjust=-0.7)

产生这个:

至于您关于为什么平均值落在 0.25-0.75 四分位数之外的问题,对于长尾数据来说,这是很常见的 - 并且可以预期 - 即使它看起来有点违反直觉。在这种情况下,我使用了对数正态分布,并且在这些四分位数之外有 8 个平均值中的 3 个。

【讨论】:

以上是关于格式化在 ggplot 的箱线图中显示为文本的数字。解释箱线图外均值的定位的主要内容,如果未能解决你的问题,请参考以下文章

如何在ggplot的箱线图中按组绘制平均值

在ggplot2中绘制两个具有相同y变量但不同x变量的箱线图

如何从 ggplot 中的箱线图中删除图例? [复制]

制作一个ggplot箱线图,其中每列都是它自己的箱线图

ggplot2 不会将图例添加到具有多个层的箱线图

ggplot2 按第 80 个百分位重新排列我的箱线图