我正在绘制小提琴图,平均值和中值如下:
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()
时得到的均值。
为每组计算的均值和中位数是否可能不包括每组中的离群值(仅晶须内的值)?如果是这样,我如何绘制所有数据点的“真实”中位数/均值?
答案 0 :(得分:2)
使用scale_y_continuous(limits=)
过滤基础数据,因此stat_summary中的均值/中值属于预先过滤的数据。
要简单地放大而不更改基础数据,请使用coord_cartesian
例如
+ coord_cartesian(ylim=c(0, 1000))
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
作为休息时间,只是不要使用限制)。