ggplot2 geom_violin,方差为0

Inf*_*tor 11 r ggplot2

我开始非常喜欢小提琴情节,因为当你有趣的发行时,它们给我一个更好的感觉.我喜欢自动化很多东西,因此遇到了一个问题:当一个变量的方差为0时,boxplot只会给你一条线.然而,Geom_violin以错误终止.我喜欢什么样的行为?好吧,要么排成一行,要么没有,但请给我其他变量的分布.

好的,快速的例子:

dff=data.frame(x=factor(rep(1:2,each=100)),y=c(rnorm(100),rep(0,100)))
ggplot(dff,aes(x=x,y=y)) + geom_violin()
Run Code Online (Sandbox Code Playgroud)

产量

Error in `$<-.data.frame`(`*tmp*`, "n", value = 100L) : 
  replacement has 1 row, data has 0
Run Code Online (Sandbox Code Playgroud)

但是,有效的是:

ggplot(dff,aes(x=x,y=y)) + geom_boxplot()
Run Code Online (Sandbox Code Playgroud)

更新:

该问题从昨天开始解决:https://github.com/hadley/ggplot2/issues/972

更新2 :(来自问题作者)哇,哈德利自己回应了!geom_violin现在表现与geom_densityR基本一致density.

但是,我不认为这种行为是最优的.

(1)'零'问题

只需使用我的原始示例运行它:

dff=data.frame(x=factor(rep(1:2, each=100)), y=c(rnorm(100), rep(0,100)))
ggplot(dff,aes(x=x,y=y)) + geom_violin(trim=FALSE)
Run Code Online (Sandbox Code Playgroud)

产生这个: 在此输入图像描述

右边的情节是否是"全零"的适当表示?我不这么认为.最好是修剪产生一条线以显示数据没有变化.解决方法解决方案:添加+geom_boxplot()

(2)我可能真的想要TRIM=TRUE.

例:

dff=data.frame(x=factor(rep(1:2, each=100)), y=c(rgamma(100,1,1), rep(0,100)  ))
ggplot(dff,aes(x=x,y=y)) + geom_violin(trim=FALSE)
Run Code Online (Sandbox Code Playgroud)

现在我有非零数据,标准内核密度估计不能正确处理.随着trim=T我可以很快看到数据是严格积极的.

我并不认为当前的行为是"错误的",因为它与其他功能一致.但是,geom_violin可以在不同的上下文中使用,用于探索具有异构数据类型的不同data.frames(例如,正面+倾斜或不正面).

eip*_*i10 3

ggplot2在问题得到解决之前处理此问题的三种选择:

  1. 作为一种快速破解方法,您可以将其中一个 y 值设置为 0.0001(而不是零)并且geom_violin可以正常工作。
  2. vioplot如果您不打算使用 ,请查看该软件包ggplot2vioplot当你给它提供一堆相同的值时,不会抛出错误。
  3. Hmisc包包含一个panel.bpplot(箱形百分位数图)函数,可以使用包bwplot中的函数创建小提琴图lattice。请参阅 的示例部分?panel.bpplot。当你向它提供相同值的向量时,它会生成一条线。