R语言ggtern三元图如何使用BetaDiv变量作为密度权重
解决方法
你当前的stat_density_tern默认计算的是三元空间内样本点的分布密度,要让密度反映BetaDiv的数值集中程度,只需要给密度计算增加BetaDiv权重映射即可,ggtern的密度统计层原生支持weight参数。
修改后的完整代码如下:
library(ggtern) # 数据集生成逻辑和原有一致 DENSE<-runif(10, min=0, max=100) CROP<-runif(10, min=0, max=100) WILD<-runif(10, min=0, max=100) BetaDiv<-runif(10, min=0, max=1) df<-data.frame(DENSE, CROP, WILD, BetaDiv) # 调整后的绘图代码 ggtern(df[order(-df$BetaDiv),], aes(DENSE, CROP, WILD)) + geom_point(alpha=0.8, aes(color=BetaDiv), size=3) + scale_color_viridis_c(direction = -1) + stat_density_tern(geom = 'polygon', n = 100, aes(fill = ..level.., alpha = ..level.., weight = BetaDiv)) # 新增权重映射行
改动说明:
- 核心修改仅为在
stat_density_tern的美学映射中添加weight = BetaDiv参数:此时密度计算时,每个样本点的贡献权重等于它对应的BetaDiv数值,最终生成的等高线区域就对应BetaDiv数值更高、更集中的三元坐标范围。 - 原有代码里的
ordered(-df$BetaDiv)属于笔误,修正为order(-df$BetaDiv)即可,该排序仅影响散点的绘制层级,不会影响密度计算结果。 - 如果觉得密度层的透明度或者色阶不符合需求,可以额外添加
scale_fill_viridis_c()、scale_alpha(range = c(0, 0.5))这类参数手动调整展示效果。
内容的提问来源于stack exchange,提问作者Ricardo Soto
相关产品推荐
相关产品推荐

