与ggplot2 geom_violin非常奇怪的图表

Bor*_*lik 3 r ggplot2

我只能用一个非常大的数据集可靠地重建这个问题,所以我将整个代码粘贴到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解决了问题.

Pey*_*ton 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)
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和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))
Run Code Online (Sandbox Code Playgroud)

与coord_cartesian的小提琴情节