我只能用一个非常大的数据集可靠地重建这个问题,所以我将整个代码粘贴到pastebin 这里是没有数据部分的代码:
# read tmp from the pastebin
library(ggplot2)
plt <- ggplot(tmp, aes(region, score))
plt1 <- plt + geom_violin(aes(region, score), scale='width', trim=F) + ylim(0, 1) + ggtitle('with ylim')
plt2 <- plt + geom_violin(aes(region, score), scale='width', trim=F) + ggtitle('without ylim')
Run Code Online (Sandbox Code Playgroud)
设置此图的y限制会产生相当难看的"小提琴":


这是什么,为什么会发生这种情况以及如何避免这个丑陋的问题呢?
BTW,设置trim=T解决了问题.
从一点挖掘,我认为问题的技术来源是:你的y变量几乎不在[0,1]之内,所以你当然会有密度超出这个范围.使用时stat_density,这个过剩的密度就会被切断,但是,使用geom_violin/ stat_ydensity,剩下的是多余的,并且允许比例延长.有了您ylim和trim=FALSE虽然,这些y值外[0,1]保持和刚刚成立的NA,它搞砸了的图纸geom_polygon.您可以使用[0,1]中的数据的较小示例来实际看到这一点:
x <- runif(1e4, 0, 1)
ggplot(mapping=aes(1, x)) + geom_violin(trim=FALSE) + ylim(0, 1)
Run Code Online (Sandbox Code Playgroud)

有几种方法可以解决这个问题.首先是保留默认值trim=TRUE:
ggplot(mapping=aes(1, x)) + geom_violin() + ylim(0, 1)
Run Code Online (Sandbox Code Playgroud)

注意,在这种情况下,ylim(scale_y_continuous)实际上将删除[0,1]之外的原始数据.在你的例子中,除此之外你没有任何要点,我也不在这里.但这是需要注意的事情.顶部和底部也会有一些填充,可能误导观众认为[0,1]之外没有密度.
也许更好的解决方案是使用coord_cartesian,它只是"放大"到图形,保持数据和产生的密度不变:
ggplot(mapping=aes(1, x)) + geom_violin(trim=FALSE) + coord_cartesian(ylim=c(0, 1))
Run Code Online (Sandbox Code Playgroud)

| 归档时间: |
|
| 查看次数: |
1746 次 |
| 最近记录: |