如何用R的ggtern修改Beta多样性三元图轴与图例刻度并解决BDL警告
解决ggtern绘制Beta多样性三元图的三个问题
1. 修改轴刻度显示0-1范围
当前breaks_tern()调用未生效,需配合ggtern的轴缩放函数或坐标设置实现。以下两种方式可选:
方式一:单独设置各轴范围与刻度
在绘图代码中添加三个轴的缩放配置,明确指定0-1范围和刻度间隔:
scale_T_continuous(limits = c(0, 1), breaks = seq(0, 1, 0.2)) + scale_L_continuous(limits = c(0, 1), breaks = seq(0, 1, 0.2)) + scale_R_continuous(limits = c(0, 1), breaks = seq(0, 1, 0.2))
注:T/L/R分别对应三元图的三个轴(即代码中的x/Similarity、y/Turnover、z/Nestedness)
方式二:全局设置坐标范围
用coord_tern()统一设定三个轴的0-1范围:
coord_tern(limits = cbind(c(0,1), c(0,1), c(0,1)))
2. 调整图例的刻度与标签
针对stat_density_tern生成的填充图例,通过修改scale_fill_gradient参数自定义刻度和标签:
scale_fill_gradient( low = "blue", high = "red", breaks = c(0, 0.25, 0.5, 0.75, 1), # 自定义刻度位置 labels = c("极低", "低", "中等", "高", "极高"), # 对应刻度的文本标签 name = "密度水平" # 修改图例标题 )
如需更精细控制,可配合guides():
guides( fill = guide_colorbar( title.position = "top", ticks = TRUE, label.position = "bottom" ) )
3. 解决BDL警告
BDL(Below Detection Limit)警告源于密度估计时部分区域数值过低或数据分布问题,可通过以下方法缓解:
- 忽略缺失值:在
stat_density_tern中添加na.rm=TRUE,跳过无效数据点 - 调整密度参数:增加网格数
n提升估计精度,或设置threshold过滤低密度区域 - 预处理数据:过滤掉数值极小的样本对(例如移除
turnover或nestedness小于0.01的行)
修改后的stat_density_tern示例:
stat_density_tern( geom='polygon', base = "ilr", aes(fill=..level.., alpha=..level..), na.rm = TRUE, n = 100, # 增加网格数 threshold = 0.01 # 忽略密度低于0.01的区域 )
整合后的完整代码
library(betapart) library(reshape2) library(ggtern) # 读取物种存在-缺失表 data = read.csv("GBDF_species_presence_absence.csv", row.names = 1, header = TRUE, check.names = FALSE) # 计算Beta多样性核心组分 data.core.s <- betapart.core(data) data.dist.jac <- beta.pair(data.core.s, index.family="jac") # 封装数据提取逻辑 extract_component <- function(mat) { mat <- as.matrix(mat) diag(mat) <- 0 mat[upper.tri(mat)] <- 0 mat <- reshape2::melt(mat) subset(mat, value != 0) } beta <- extract_component(data.dist.jac$beta.jac) turnover <- extract_component(data.dist.jac$beta.jtu) nestedness <- extract_component(data.dist.jac$beta.jne) # 合并数据集 dff = merge(beta, turnover, by=c("Var1", "Var2")) dff = merge(dff, nestedness, by=c("Var1", "Var2")) colnames(dff) = c("site1", "site2", "beta", "turnover", "nestedness") dff$site = paste(dff$site1, dff$site2, sep="_") # 转换数据类型 dff[, c("beta", "turnover", "nestedness")] <- lapply(dff[, c("beta", "turnover", "nestedness")], as.numeric) # 绘制三元图 p = ggtern(data=dff, aes(1-beta, turnover, nestedness)) + geom_point(alpha=0.2, size=3) + stat_density_tern( geom='polygon', base = "ilr", aes(fill=..level.., alpha=..level..), na.rm = TRUE, n = 100, threshold = 0.01 ) + # 若dm是预定义数据集则取消注释,否则删除该行 # geom_point(data=dm, col="green4", size=5) + scale_fill_gradient( low = "blue", high = "red", breaks = seq(0, 1, 0.2), labels = paste0(seq(0, 100, 20), "%"), name = "密度水平" ) + labs(x ="Similarity (1-βjac)", y = "Turnover (βjtu)", z = "Nestedness (βjne)", title = "") + # 设置轴刻度与范围 scale_T_continuous(limits = c(0, 1), breaks = seq(0, 1, 0.2)) + scale_L_continuous(limits = c(0, 1), breaks = seq(0, 1, 0.2)) + scale_R_continuous(limits = c(0, 1), breaks = seq(0, 1, 0.2)) + guides(alpha = "none", fill = guide_colorbar(title.position = "top", label.position = "bottom")) + theme_rgbw() + theme(legend.position = "bottom", legend.key = element_rect(fill = NA), text=element_text(size=16, family="serif")) p
内容的提问来源于stack exchange,提问作者hoja tore
相关产品推荐
相关产品推荐

