You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 06:52:10