【问题标题】:Passing stats to geoms with geom_violin in ggplot2在ggplot2中使用geom_violin将统计信息传递给geoms
【发布时间】:2012-05-25 16:12:02
【问题描述】:

以下代码:

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)

将产生这个情节:

但我想实现一种效果,即每个小提琴密度的填充(和颜色,理想情况下)的 alpha 值在密度较低的区域减小。也就是说,小提琴形状在曲线高度较小的地方逐渐消失在背景中,而在曲线高度较高的地方则是黑暗和不透明的。类似这种效果:

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

感谢您提供的任何见解!

【问题讨论】:

  • 不容易。小提琴本身被绘制成一个填充多边形,它只能有一个填充颜色。可以提取定义小提琴的数据(密度估计),然后绘制单独的段(使用单独的颜色/alpha),但您必须自己构建一些东西才能做到这一点。
  • 感谢您的回答;我担心可能是这种情况。

标签: r ggplot2


【解决方案1】:

受到@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()

ggplot2 的早期版本中,绘图显示“带”,但这个问题现在显然已得到修复。

【讨论】:

  • 嗯,我在我的版本中也注意到了其中一些乐队,但在你的版本中它们更加明显。我的猜测是它们与重叠的部分有关。我尝试在 geom 代码中使用linejoinlineend,但我没有成功将乐队带走。
  • 我试图通过改变 size 参数来克服条带问题,使每个段与其相邻段的重叠程度更大,但没有找到令人满意的解决方案。也就是说,这是迄今为止我见过的最好的尝试,非常感谢!
【解决方案2】:

这实际上是可能的,通过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()

【讨论】:

  • 这看起来不对,代码需要更新吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-23
  • 2020-11-15
  • 2013-11-06
  • 2019-02-12
  • 1970-01-01
相关资源
最近更新 更多