如何在geom_raster中通过二元密度设置alpha并通过z填充?

问题描述 投票:0回答:1

我用

geom_raster
制作了热图,如下所示:

mround <- function(x,base){base*round(x/base)} # round to nearest 5
df <- data.frame(x= mround(rnorm(10000, 100, 10), 5),
                 y= mround(rnorm(10000, 100, 10), 5))
df$z <- df$x + df$y
library(ggplot2)
ggplot(df) +
  geom_raster(aes(x= x, y= y, fill= z)) +
  theme_classic()

heat

我想为栅格设置

alpha
参数,它应该取决于二元密度。我们可以像这样可视化栅格的双变量密度:

ggplot() +
  stat_density_2d(data= df, aes(x= x, y= y, alpha = after_stat(density)), geom = "raster", contour= FALSE)

alpha

基本上,我希望第一个图具有第二个图的

alpha
。我尝试了各种方法,比如
geom_raster(aes(x= x, y= y, fill= z, alpha = after_stat(density)))
,但到目前为止没有任何效果。如何同时通过
fill
z
通过 2d 密度设置
alpha

r ggplot2 fill alpha kernel-density
1个回答
0
投票

这很困难,因为为了计算密度,ggplot 必须聚合数据,这会丢失每个唯一点的 z 值。一种选择是仅预先计算密度:

n <- 1 + diff(ranges)/5

dens <- MASS::kde2d(df$x, df$y, n = n, lims = c(ranges, ranges))

cbind(expand.grid(x = dens$x, y = dens$y), 
      dens = c(dens$z), z = dens$x + dens$y) |>
  ggplot(aes(x, y)) +
  geom_tile(aes(fill = z, alpha = dens)) +
  theme_classic() +
  scale_alpha_continuous(range = c(0, 1)) +
  coord_equal()

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.