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
作为休息时间,只是不要使用限制)。
我正在绘制小提琴图以及平均值和中值,如下所示:
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
作为休息时间,只是不要使用限制)。