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

如何基于adespatial包beta.div.comp的输出正确绘制三元图?

问题根源与修复方案

为什么会出现直线?

你用beta.div.comp()得到的三个分量存在严格的线性依赖关系:总beta多样性(beta.d)= 周转(repl)+ 丰富度差异(diff)。不管你用不用quant=T,这三个变量都满足这个等式,所以在三元图里所有点必然落在同一条直线上——因为三元图要求三个变量的和为常数,而你的三个变量天生线性相关,没法分散开。

两种可行的修复方式

方式1:给beta分量搭配独立的群落属性

如果想保留周转和丰富度差异的信息,可以把它们转换成占总beta的比例,再搭配一个独立的群落属性(比如样地的物种丰富度),归一化后再画三元图:

require(vegan)
require(ggtern)
require(adespatial)  # 别忘了加载这个包
data(dune)

# 获取每个样地对的完整beta分量(去掉quant=T)
beta.dens <- beta.div.comp(dune, coef="J", quant=F) 
repl <- beta.dens$repl
diff <- beta.dens$rich
beta.d <- beta.dens$D

# 计算周转、丰富度差异占总beta的比例
repl_prop <- repl / beta.d
diff_prop <- diff / beta.d

# 计算每个样地对的平均物种丰富度
site_rich <- specnumber(dune)
pair_rich <- apply(combn(1:nrow(dune), 2), 2, function(x) mean(site_rich[x]))

# 归一化三个变量,让它们的和为1(满足三元图要求)
total <- repl_prop + diff_prop + pair_rich
df <- data.frame(
  repl_norm = repl_prop / total,
  diff_norm = diff_prop / total,
  rich_norm = pair_rich / total
)

# 绘制三元图
ggtern(data=df,aes(repl_norm, diff_norm, rich_norm)) + 
  geom_mask() +
  geom_point(fill="red",shape=21,size=2) + 
  theme_bw() +
  theme_showarrows() +
  theme_clockwise() + 
  ggtitle("Beta多样性分量与样地丰富度") +
  labs(x="周转占比", y="丰富度差异占比", z="平均样地丰富度(归一化)")

方式2:展示三种独立的beta多样性指数

如果只想聚焦beta多样性本身,可以选三个独立的beta指数(比如Jaccard、Sorensen、Simpson),计算每个样地对的指数后画三元图:

require(vegan)
require(ggtern)
data(dune)

# 计算三种不同的beta多样性距离
beta_jaccard <- vegdist(dune, method="jaccard")
beta_sorensen <- vegdist(dune, method="bray")  # Bray-Curtis等价于Sorensen相异度
beta_simpson <- vegdist(dune, method="simpson")

# 归一化三个指数,使总和为1
total <- beta_jaccard + beta_sorensen + beta_simpson
df <- data.frame(
  jaccard_norm = beta_jaccard / total,
  sorensen_norm = beta_sorensen / total,
  simpson_norm = beta_simpson / total
)

# 绘制三元图
ggtern(data=df,aes(jaccard_norm, sorensen_norm, simpson_norm)) + 
  geom_mask() +
  geom_point(fill="blue",shape=21,size=2) + 
  theme_bw() +
  theme_showarrows() +
  theme_clockwise() + 
  ggtitle("三种Beta多样性指数") +
  labs(x="Jaccard", y="Sorensen", z="Simpson")

复刻论文图的注意事项

如果你的目标是复刻论文里的三元图,一定要仔细核对:

  • 论文是否用了非二元分解的beta多样性方法(比如某些包含三个独立分量的分解框架)
  • 论文里的三元图轴是不是用了归一化后的比例,而不是原始的分量数值

内容的提问来源于stack exchange,提问作者vanguard605

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 10:14:54