我有一个 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()
我尝试向 aes 添加填充:
aes(factor(group), factor(value),fill = (..count..)/mean(..count..))
作为模仿..密度..(不接受)的一种方式似乎不被接受,但这不是我想要的 - 它似乎除以整个 df 的计数总和。我希望每组中的值计数(按 x 轴)按组内的平均值(或总和或其他统计数据)进行归一化。不幸的是, sum(..count..) 似乎给出了整个 df 的总和,而不仅仅是列的总和。
我知道这篇文章很古老,但我在尝试做同样的事情时遇到了它并且不想使用geom_tile
。我能够用它来实现它after_stat https://ggplot2.tidyverse.org/reference/aes_eval.html和标准化函数:
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))
它标准化了 x 轴的每个切片,使得沿 y 轴的积分将为 1,这是我的用例。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)