如何基于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
相关产品推荐
相关产品推荐

