如何缩放(标准化)每列内的 ggplot2 stat_bin2d 值(按 X 轴)

Mar*_*inT 7 r normalize ggplot2

我有一个 ggplot stat_bin2d“热图”。

library(ggplot2)
value<-rep(1:5, 1000)
df<-as.data.frame(value)    
df$group<-rep(1:7, len=5000)
df<-df[sample(nrow(df), 3000), ]
ggplot(df, aes(factor(group), factor(value))) +stat_bin2d()
Run Code Online (Sandbox Code Playgroud)

我尝试向 aes 添加填充:

aes(factor(group), factor(value),fill = (..count..)/mean(..count..))
Run Code Online (Sandbox Code Playgroud)

作为模仿..密度..(不接受)的一种方式似乎不被接受,但这不是我想要的 - 它似乎除以整个 df 的计数总和。我希望每组中的值计数(按 x 轴)按组内的平均值(或总和或其他统计数据)进行归一化。不幸的是, sum(..count..) 似乎给出了整个 df 的总和,而不仅仅是列的总和。

小智 1

我知道这篇文章很古老,但我在尝试做同样的事情时遇到了它,并且不想使用geom_tile. 我能够使用after_stat标准化函数来实现它:

norm_across_y <- function(v, x, y){
    data.frame(v=v, x=x, y=y) %>%
        group_by(x) %>%
        mutate(v=v/((max(y)-min(y))/n()*sum(v))) %>%
        ungroup() %>%
        pull(v)
}

ggplot(data, aes(x=xvar, y=yvar)) +
    stat_density_2d_filled(aes(fill=after_stat(norm_across_y(density, x, y))), geom="raster", contour=FALSE, n=500) +
    geom_point(color="red", shape="x") +
    scale_x_continuous(expand=c(0,0)) +
    scale_y_continuous(expand=c(0,0)) +
    scale_fill_viridis_c(limits=c(0,NA))
Run Code Online (Sandbox Code Playgroud)

它标准化了 x 轴的每个切片,使得沿 y 轴的积分将为 1,这是我的用例。