我开始非常喜欢小提琴情节,因为当你有趣的发行时,它们会给我一个更好的感觉。我喜欢自动化很多东西,因此遇到了一个问题: 当一个变量的方差为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)
右边的情节是否是“全零”的适当表示?我不这么认为。最好是修剪产生一条线以显示数据没有变化。
解决方法解决方案:添加+ 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(例如,正面+倾斜或不正面)。
答案 0 :(得分:3)
在解决ggplot2
问题之前处理此问题的三个选项:
geom_violin
将起作用。 vioplot
设置,请查看ggplot2
包。当您为它提供一堆相同的值时,vioplot
不会抛出错误。 Hmisc
包中包含panel.bpplot
(百分位图)功能,可以使用bwplot
包中的lattice
函数创建小提琴图。请参阅?panel.bpplot
的示例部分。当您向它提供相同值的向量时,它会生成一条线。