ggplot2:geom_violin的平均值和中位数

时间:2019-01-24 09:12:52

标签: r ggplot2 mean median

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

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()时得到的均值。

为每组计算的均值和中位数是否可能不包括每组中的离群值(仅晶须内的值)?如果是这样,我如何绘制所有数据点的“真实”中位数/均值?

1 个答案:

答案 0 :(得分:2)

使用scale_y_continuous(limits=)过滤基础数据,因此stat_summary中的均值/中值属于预先过滤的数据。

要简单地放大而不更改基础数据,请使用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的平均Sepal Length现在略大于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作为休息时间,只是不要使用限制)。