跨组别叠加 ggplot2 stat_density2d 图形,保持 Alpha 通道不变

4

我想在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()

创建这样的图表:
因为我只包括了两个没有评分的点,所以它们的密度看起来比其他两个更紧密/强烈,因此淡化了其他两个密度。我尝试查看 使用alpha通道叠加两个ggplot2 stat_density2d图表指定ggplot2 stat_density2d中密度的比例,但它们并没有真正解决这个具体问题。
最终,我的真实数据中我想要实现的目标是,我有多种条件下离散2d位置的“功率”样本,并且我试图绘制它们相对功率/空间分布。我根据它们的功率在位置上复制点,但这导致使用stat_density2d时具有仅有少数位置的低功率条件看起来最强。如果有更好的方法,请告诉我!
谢谢!

绿色和蓝色在灰色背景上混合得非常好。也许尝试为mpaa使用不同的颜色? - Georges
2个回答

2

stat_hexbin 是一个能够理解 ..density....count.. 参数的函数,它可能适合你的需求:

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

尽管您可能想调整箱子的宽度。

谢谢!那在某些情况下肯定效果更好。不幸的是,我需要一些更平滑地插值数据点之间的方法,就像stat_density2d所提供的那样。 - Guy
明白了。不幸的是,目前似乎不可能。您可以尝试在第78行插入例如 df$count <- sapply(split(df, df$group), length) 并对ggplot2源代码中的第82行进行适当更改来进行黑客攻击。stat-density-2d.r - jaimedash
糟糕,应该是 df$count <- sapply(split(df, df$group), nrow),但无论如何,这个建议似乎不起作用(也许并不令人惊讶)。 - jaimedash

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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接