ggplot2:geom_violin 中的平均值和中位数

ggplot2: mean and median in geom_violin

我正在绘制小提琴图以及平均值和中值,如下所示:

test <- read.csv2("http://www.reduts.net/test.csv", sep=",")

ggplot(data = test, aes(y = var, x = as.factor(grp))) +
  geom_violin() +
  stat_summary(fun.y = mean, geom = "point", shape = 23, size = 2)+
  stat_summary(fun.y = median, geom = "point", size = 2, color = "red")+
  xlab("Group") +
  ylab("EUR") +
  scale_y_continuous(limits = c(0,1000), breaks = seq(0,1000,200))+
  ggsave("image.jpg", dpi = 300, units = 'cm', height = 10, width = 22)

library(psych)
describe(test$var)

现在,我的问题是图像中显示的所有组均值都远低于我在所有组上使用 psych::describe() 时得到的均值。

是否有可能,为每个组计算的均值和中位数不包括每个组中的异常值(仅胡须内的值)?如果是这样,我如何为所有数据点绘制 "real" medians/means?

使用scale_y_continuous(limits=)过滤底层数据,所以stat_summary中的mean/median是过滤前的数据。

要简单地放大而不更改基础数据,请使用 coord_cartesian

例如

+ coord_cartesian(ylim=c(0, 1000))

这是一个reproducible example:

library(ggplot2)
p <- ggplot(iris, aes(x=Species, y=Sepal.Length)) + geom_point() +
    stat_summary(fun.y='mean', geom='point', size=2, col='red')
p
# mean(subset(iris, Species == 'setosa')$Sepal.Length) # 5.006

请注意,setosa 的平均萼片长度约为 5。 现在让我们限制 y 轴。

p + scale_y_continuous(lim=c(5, 8), minor_breaks=seq(5, 8, by=0.1))
Warning messages:
1: Removed 22 rows containing non-finite values (stat_summary). 
2: Removed 22 rows containing missing values (geom_point).

注意警告消息,并在结果图中看到 setosa 的平均萼片长度现在略大于 5.2。 确认 scale_y_continuous 确实在计算 stat_summary,

之前过滤数据
mean(subset(iris, Species == 'setosa' & Sepal.Length >= 5)$Sepal.Length)
# 5.23

而如果我只是这样做

p + coord_cartesian(ylim=c(5, 8))

均值与原始数据相同。 (您仍然可以使用 scale_y_continuous 作为休息时间,只是不要使用限制)。