使用ggtern实现基于三角剖分点数值的三元图平滑填充效果
ggtern三元图区域平滑填充解决方案
你需要的点间区域填充/平滑效果可以通过ggtern内置的插值图层实现,以下是可直接运行的修改后代码:
连续平滑渐变填充效果(匹配目标图需求)
核心使用geom_interpolate_tern()实现三角插值生成连续色阶:
a <- c(1.0, 0.0, 0.0, 0.0, 0.0, 0.9, 0.9, 0.1, 0.1, 0.8, 0.0, 0.0, 0.2, 0.2, 0.8, 0.3, 0.7, 0.0, 0.0, 0.3, 0.7, 0.0, 0.4, 0.0, 0.6, 0.6, 0.4, 0.5, 0.0, 0.5, 0.1, 0.1, 0.8, 0.7, 0.1, 0.2, 0.1, 0.7, 0.2, 0.6, 0.1, 0.1, 0.6, 0.3, 0.3, 0.1, 0.5, 0.1, 0.4, 0.5, 0.4, 0.6, 0.2, 0.2, 0.3, 0.5, 0.2, 0.5, 0.2, 0.3, 0.4, 0.4, 0.2, 0.3, 0.3, 0.4) b <- c(0.0, 0.0, 1.0, 0.1, 0.9, 0.0, 0.1, 0.9, 0.0, 0.0, 0.8, 0.2, 0.8, 0.0, 0.2, 0.0, 0.3, 0.7, 0.3, 0.7, 0.0, 0.6, 0.0, 0.4, 0.0, 0.4, 0.6, 0.5, 0.5, 0.0, 0.1, 0.8, 0.1, 0.1, 0.2, 0.7, 0.7, 0.2, 0.1, 0.1, 0.3, 0.6, 0.3, 0.6, 0.1, 0.4, 0.1, 0.5, 0.1, 0.4, 0.5, 0.2, 0.6, 0.2, 0.5, 0.3, 0.3, 0.2, 0.5, 0.2, 0.4, 0.2, 0.4, 0.4, 0.3, 0.3) c <- c(0.0, 1.0, 0.0, 0.9, 0.1, 0.1, 0.0, 0.0, 0.9, 0.2, 0.2, 0.8, 0.0, 0.8, 0.0, 0.7, 0.0, 0.3, 0.7, 0.0, 0.3, 0.4, 0.6, 0.6, 0.4, 0.0, 0.0, 0.0, 0.5, 0.5, 0.8, 0.1, 0.1, 0.2, 0.7, 0.1, 0.2, 0.1, 0.7, 0.3, 0.6, 0.3, 0.1, 0.1, 0.6, 0.5, 0.4, 0.4, 0.5, 0.1, 0.1, 0.2, 0.2, 0.6, 0.2, 0.2, 0.5, 0.3, 0.3, 0.5, 0.2, 0.4, 0.4, 0.3, 0.4, 0.3) value <- c(1.433, 0.251, 0.000, 0.176, 0.000, 1.556, 1.490, 0.087, 0.522, 1.718, 0.000, 0.098, 0.347, 0.772, 1.642, 1.093, 1.762, 0.000, 0.052, 0.713, 1.857, 0.000, 1.367, 0.022, 1.814, 1.726, 1.043, 1.424, 0.001, 1.722, 0.428, 0.122, 1.656, 1.798, 0.330, 0.384, 0.138, 1.777, 0.661, 1.763, 0.271, 0.166, 1.733, 0.753, 0.984, 0.236, 1.574, 0.204, 1.232, 1.471, 1.086, 1.748, 0.409, 0.568, 0.790, 1.505, 0.520, 1.552, 0.451, 0.884, 1.094, 1.180, 0.484, 0.831, 0.859, 1.123) df <- data.frame(a,b,c,value) library(ggtern) ggtern(df,aes(a, b, c, value = value)) + # 插值平滑填充层 geom_interpolate_tern(aes(fill = after_stat(value)), alpha = 0.8, na.rm = TRUE) + # 原始散点层 geom_point(size=2, aes(color=value)) + # 统一填充和散点的色阶,可替换为其他配色方案 scale_color_viridis_c() + scale_fill_viridis_c() + theme_rgbw()
注:如果你使用的ggplot2版本低于3.3.0,把
after_stat(value)替换为..value..即可正常运行。
分块三角填充效果
如果不需要平滑渐变,想要直接对三角剖分后的每个小三角形单独填充,可替换为geom_tri_tern()图层:
# 数据加载部分和上文一致 ggtern(df,aes(a, b, c, value = value)) + geom_tri_tern(aes(fill = value), alpha = 0.8, na.rm = TRUE) + geom_point(size=2, aes(color=value)) + scale_color_viridis_c() + scale_fill_viridis_c() + theme_rgbw()
内容的提问来源于stack exchange,提问作者cblaettle
相关产品推荐
相关产品推荐

