ggplot2 geom_violin,方差为0

时间:2014-06-09 21:59:53

标签: r ggplot2

我开始非常喜欢小提琴情节,因为当你有趣的发行时,它们会给我一个更好的感觉。我喜欢自动化很多东西,因此遇到了一个问题: 当一个变量的方差为0时,箱形图只会在该点给出一条线。然而,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()

产量

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

然而,有效的是:

ggplot(dff,aes(x=x,y=y)) + geom_boxplot()

更新

截至昨天,该问题已得到解决:https://github.com/hadley/ggplot2/issues/972

更新2 : (来自问题作者) 哇,哈德利自己回应了! geom_violin现在与geom_density和基础R 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)

产生这个: enter image description here

右边的情节是否是“全零”的适当表示?我不这么认为。最好是修剪产生一条线以显示数据没有变化。 解决方法解决方案:添加+ 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)

现在我有非零数据,标准内核密度估计值无法正确处理。使用trim=T,我可以很快发现数据是严格肯定的。

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

1 个答案:

答案 0 :(得分:3)

在解决ggplot2问题之前处理此问题的三个选项:

  1. 作为快速入侵,您可以将其中一个y值设置为0.0001(而不是零),geom_violin将起作用。
  2. 如果您未使用vioplot设置,请查看ggplot2包。当您为它提供一堆相同的值时,vioplot不会抛出错误。
  3. Hmisc包中包含panel.bpplot(百分位图)功能,可以使用bwplot包中的lattice函数创建小提琴图。请参阅?panel.bpplot的示例部分。当您向它提供相同值的向量时,它会生成一条线。