【问题标题】:Overlay ggplot2 stat_density2d plots with alpha channels constant across groups覆盖 ggplot2 stat_density2d 图,具有跨组的 alpha 通道常数
【发布时间】:2015-05-16 02:21:48
【问题描述】:

我想在 stat_density2 图中绘制多个组,其中 alpha 值与每个组中的观察计数相关。然而,由 stat_density2d 形成的水平似乎被归一化为每组中的观察数。例如,

temp <- rbind(movies[1:2,],movies[movies$mpaa == "R" | movies$mpaa == "PG-13",])
ggplot(temp, aes(x=rating,y=length)) + 
stat_density2d(geom="tile", aes(fill = mpaa, alpha=..density..), contour=FALSE) + 
theme_minimal()

创建一个这样的图:

因为我只包括了 2 个没有评级的点,所以它们导致密度看起来比其他两个更紧/更强,因此会洗掉其他两个密度。我试过查看Overlay two ggplot2 stat_density2d plots with alpha channelsSpecifying the scale for the density in ggplot2's stat_density2d,但它们并没有真正解决这个具体问题。

最终,我试图用我的真实数据完成的是,我有来自离散二维位置的“功率”样本,用于多种条件,并且我试图绘制它们的相对功率/空间分布是什么。我在相对于其功率的位置复制点,但这导致了低功率条件,在使用 stat_density2d 时只有几个位置看起来最强。如果有更好的方法,请告诉我!

谢谢!

【问题讨论】:

  • 灰色背景上的绿色和蓝色混合得非常好。也许为 mpaa 尝试不同的颜色?

标签: r plot ggplot2 kernel-density


【解决方案1】:

stat_hexbin,除了..density..,还可以理解..count..,可能对你有用:

ggplot(temp, aes(x=rating,y=length)) + 
    stat_binhex(geom="hex", aes(fill = mpaa, alpha=..count..)) + 
    theme_minimal()

虽然您可能想要调整 bin 宽度。

【讨论】:

  • 谢谢!在某些情况下,这肯定会更好。不幸的是,我需要在数据点之间进行更平滑插值的东西,比如通过 stat_density2d 提供的东西。
  • 明白。不幸的是,目前这似乎是不可能的。您可以通过在第 78 行插入例如 df$count &lt;- sapply(split(df, df$group), length) 并对来自 ggplot2 源的 stat-density-2d.r 中的第 82 行进行适当的更改来破解它
  • 糟糕,应该是df$count &lt;- sapply(split(df, df$group), nrow),但无论如何这个建议似乎不起作用(也许并不奇怪)。
【解决方案2】:

不是最优雅的 r 代码,但这似乎可行。我标准化我的真实数据与这有点不同,但这得到了我找到的解决方案。我使用 for 循环找到条件的平均功率,并添加一个新的 stat_density2d 层,其 alpha 按该平均功率缩放。

temp <- rbind(movies[1:2,],movies[movies$mpaa == "R" | movies$mpaa == "PG-13",])
mpaa = unique(temp$mpaa)
p <- ggplot() + theme_minimal()
for (ii in seq(1,3)) {
  ratio = length(which(temp$mpaa == mpaa[ii]))
  p <- p + stat_density2d(data=temp[temp$mpaa == mpaa[ii],], 
                          aes(x=rating,y=length,fill = mpaa, alpha=..level..),
                      geom="polygon", 
                      contour=TRUE, 
                      alpha = ratio/20, 
                      lineType = "none") 
}
print(p)

【讨论】:

    猜你喜欢
    • 2014-07-27
    • 1970-01-01
    • 2012-11-30
    • 2012-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-01
    相关资源
    最近更新 更多