使用ggplot2中的geom_violin将统计信息传递给geoms

时间:2012-05-25 16:12:02

标签: r ggplot2

以下代码:

library(ggplot2)
theData <- data.frame(category <- sample(LETTERS[1:3], 1000, replace = T),
                  value <- rnorm(1000))
thePlot <- ggplot(theData,
              aes(x = category, y = value))
thePlot <- thePlot + geom_violin(fill = "BLACK")
thePlot <- thePlot + coord_flip()
print(thePlot)

将产生这个情节:

violin plot example

但我希望达到这样的效果,即每个小提琴密度的填充(和理想的颜色)的α值在不太密集的区域中减小。也就是说,小提琴形状逐渐消失在曲线高度较小的背景中,但是在曲线高的地方是暗的和不透明的。像这种效果的东西:

alpha fade example

不幸的是,这些系数图是通过使用非常丑陋的黑客产生的,并且考虑到新geom_violin的灵活性,我想知道是否有一种直接的方法来实现这种使用geom_violin的alpha淡入淡出。

感谢您提供的任何见解!

2 个答案:

答案 0 :(得分:3)

受@ wch的回答启发,我决定再接受一次破解。这跟我一样接近:

ggplot(theData, aes(x = category, y = value)) +
    stat_ydensity(geom="segment", aes(xend=..x..+..scaled../2, 
        yend=..y.., alpha=..scaled..), size=2, trim=FALSE) +
    stat_ydensity(geom="segment", aes(xend=..x..-..scaled../2, 
        yend=..y.., alpha=..scaled..), size=2, trim=FALSE) +
    scale_alpha_continuous(range= c(0, 1)) +
    coord_flip() + theme_bw()

enter image description here

ggplot2的早期版本中,情节显示“乐队”,但此问题现在显然已得到修复。

enter image description here

答案 1 :(得分:1)

通过使用stat_ydensity

的一些技巧,实际上是可能的
library(ggplot2)
theData <- data.frame(category <- sample(LETTERS[1:3], 1000, replace = T),
                  value <- rnorm(1000))

ggplot(theData, aes(x = category, y = value)) +
    stat_ydensity(geom="line", aes(alpha=..scaled..), size=2, trim=FALSE) +
    scale_alpha_continuous(range= c(0, 1)) +
    coord_flip() + theme_bw()