geom_hex使用连续alpha参数被丢弃的问题咨询
问题原因与解决方案
为什么geom_hex会丢弃alpha美学?
geom_hex 依赖 stat_bin_hex 做分箱统计变换:它会先将x/y平面划分成六边形网格,统计每个网格内的观测数量,再绘制每个六边形。这个统计过程只会保留分箱后的坐标和计数,不会保留原始数据中每个观测的percentile变量,因此你映射的alpha = percentile会被丢弃——这是它和geom_point/geom_line这类逐行绘制原始数据的geom的核心区别。
两种解决方案(无需rowwise)
方案1:基于分箱汇总的alpha映射(保留geom_hex的分箱特性)
如果你需要的是每个六边形的透明度对应该箱内所有点percentile的汇总值(比如均值、中位数),可以用stat_summary_hex替代geom_hex,它会在分箱时计算指定变量的统计量,再将结果映射到alpha:
library(tibble) library(ggplot2) data <- tibble( x = c(38.8, 27.8875, 32.7375, 47.2875, 25.4625), y = c(42, 35.7, 35.7, 31.5, 39.9), name = rep('John', 5), percentile = c(0.934, 0.932, 0.883, 0.806, 0.2) ) ggplot(data, aes(x, y, z = percentile)) + stat_summary_hex(aes(alpha = after_stat(value)), fun = mean) + scale_alpha_continuous(range = c(0.2, 1)) # 可根据需求调整alpha范围
z = percentile指定要统计的变量fun = mean表示用箱内percentile的均值作为alpha值,你也可以换成median/max等其他统计函数after_stat(value)引用统计变换后的结果
方案2:用六边形形状的点(逐点绘制,无分箱)
如果你其实是想给每个原始数据点绘制六边形符号,而非分箱聚合的六边形,直接用geom_point并指定六边形形状即可,此时alpha可直接映射到每个点的percentile:
ggplot(data, aes(x, y, alpha = percentile)) + geom_point(shape = 12, size = 5) # size参数调整六边形大小
内容的提问来源于stack exchange,提问作者codeweird
相关产品推荐
相关产品推荐

