3

我只能用相当大的数据集可靠地重建这个问题,所以我将整个代码粘贴到一个 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')

为该图设置 y 限制会产生非常丑陋的“小提琴”:

在此处输入图像描述

在此处输入图像描述

这是什么,为什么会发生这种情况以及如何避免这个丑陋的问题?

顺便说一句,设置trim=T解决了问题。

4

1 回答 1

6

经过一番挖掘,我认为问题的技术根源在于:您的y变量几乎不在 [0, 1] 范围内,因此您的密度当然会落在此范围之外。有了stat_density,这个多余的密度就被剪掉了,但是有了geom_violin/ stat_ydensity,多余的就留下了,并且允许尺度扩展。有了你ylimtrim=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)

一个破碎的小提琴情节

有几种方法可以解决这个问题。首先是保留默认值trim=TRUE

ggplot(mapping=aes(1, x)) + geom_violin() + ylim(0, 1)

带有 ylim 和 trim=TRUE 的小提琴图

请注意,在这种情况下, 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))

带有 coord_cartesian 的小提琴情节

于 2013-10-14T14:54:20.350 回答