require(ggplot2)
require(cowplot)
d = iris
ggplot2::ggplot(d, aes(factor(0), Sepal.Length)) +
geom_violin(fill="black", alpha=0.2, draw_quantiles = c(0.25, 0.5, 0.75)
, colour = "red", size = 1.5) +
stat_boxplot(geom ='errorbar', width = 0.1)+
geom_boxplot(width = 0.2)+
facet_grid(. ~ Species, scales = "free_x") +
xlab("") +
ylab (expression(paste("Value"))) +
coord_cartesian(ylim = c(3.5,9.5)) +
scale_y_continuous(breaks = seq(4, 9, 1)) +
theme(axis.text.x=element_blank(),
axis.text.y = element_text(size = rel(1.5)),
axis.ticks.x = element_blank(),
strip.background=element_rect(fill="black"),
strip.text=element_text(color="white", face="bold"),
legend.position = "none") +
background_grid(major = "xy", minor = "none")
据我所知,方框图中的方框图分别代表25%和75%的分位数,中位数= 50%。因此,它们应等于geom_violin
参数中draw_quantiles = c(0.25, 0.5, 0.75)
绘制的0.25 / 0.5 / 0.75分位数。
中位数和50%分位数拟合。但是,0.25分位数和0.75分位数都不适合箱线图的箱端(请参见图,尤其是“ virginica”面)。
参考:
此评论太长,因此我将其发布为答案。我看到两个潜在的差异来源。首先,我的理解是boxplot
是指boxplot.stats
,它使用的hinges
非常相似,但不一定与分位数相同。 ?boxplot.stats
说:
这两个“铰链”是第一个和第三个四分位数的版本,即接近分位数(x,c(1,3)/ 4)。铰链等于四分位数等于奇数n(其中n
hinge vs quantile
区别因此可能是差异的一个来源。
第二,geom_violin
是指密度估计。源代码here指向函数StatYdensity
,将我引向here。我找不到函数compute_density
,但我认为(也是由于帮助文件中的某些指针)它本质上是density
,默认情况下使用高斯核估计来估计密度。这可能(也可能不会)解释差异,但是
by(d$Sepal.Length, d$Species, function(x) boxplot.stats(x, coef=5)$stats )
by(d$Sepal.Length, d$Species, function(v) quantile(density(v)$x))
显示确实不同的值。因此,我猜想差异是由于我们是基于观测值的经验分布函数还是基于核密度估计值来查看分位数,尽管我承认我并没有得出结论。
第二因素that @coffeinjunky raised似乎是主要原因。这里有一些证据可以证明这一点。
通过切换到geom_ydensity
,可以凭经验确认差异是由于geom_ydensity
是使用内核密度估计来计算分位数,而不是实际观察值。例如,如果我们强制使用较宽的带宽(geom_violin
),则估计的密度将被过度平滑,并进一步偏离箱线图中使用的基于观测的分位数:
bw=1
<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS8xQUQwNy5wbmcifQ==” alt =“在此处输入图像描述”>
所以,是的,请谨慎使用-密度估计的参数会影响结果!