如何在R中可视化成对样本化学相似性随空间距离的变化?
在R中展示化学相似性随空间距离变化的基础可视化方案
假设你已经有了Bray-Curtis相异矩阵(记为bray_curtis_dist)和空间Euclidean距离矩阵(记为spatial_dist),下面是几种基础的可视化实现方式:
第一步:把距离矩阵转成成对数据
距离矩阵是对称的,我们只需要提取上三角(排除对角线)的元素,得到每对样本的空间距离和对应的化学相似性(注意:Bray-Curtis是相异度,相似性=1-相异度):
# 提取上三角索引(跳过对角线) upper_tri <- upper.tri(bray_curtis_dist, diag = FALSE) # 提取成对的空间距离和化学相似性 spatial_pairs <- spatial_dist[upper_tri] chem_similarity <- 1 - bray_curtis_dist[upper_tri] # 整理成数据框方便绘图 plot_data <- data.frame( spatial_distance = spatial_pairs, chemical_similarity = chem_similarity )
几种可视化方案
1. 散点图+平滑趋势线
最直观的方式,用散点展示每对样本的关系,再用平滑线呈现整体趋势:
用ggplot2实现(推荐,样式更灵活)
library(ggplot2) ggplot(plot_data, aes(x = spatial_distance, y = chemical_similarity)) + geom_point(alpha = 0.5, size = 1.5) + # 设透明度避免点重叠 geom_smooth(method = "loess", se = TRUE, color = "darkred") + # loess平滑线,带置信区间 labs( x = "空间距离 (Euclidean)", y = "化学相似性 (1 - Bray-Curtis相异度)", title = "化学相似性随空间距离的变化" ) + theme_minimal()
用基础绘图系统实现(无需额外包)
plot(plot_data$spatial_distance, plot_data$chemical_similarity, xlab = "空间距离 (Euclidean)", ylab = "化学相似性 (1 - Bray-Curtis相异度)", main = "化学相似性随空间距离的变化", pch = 16, col = rgb(0,0,0,0.5)) # 半透明黑色点 lines(lowess(plot_data$spatial_distance, plot_data$chemical_similarity), col = "darkred", lwd = 2)
2. 分箱箱线图
如果样本对太多,散点会重叠,把空间距离分成几个区间,看每个区间内相似性的分布:
# 给空间距离分箱(这里分5个区间,可自行调整breaks参数) plot_data$distance_bin <- cut(plot_data$spatial_distance, breaks = 5) ggplot(plot_data, aes(x = distance_bin, y = chemical_similarity)) + geom_boxplot(fill = "lightblue", alpha = 0.7) + labs( x = "空间距离区间", y = "化学相似性 (1 - Bray-Curtis相异度)", title = "不同空间距离区间的化学相似性分布" ) + theme_minimal() + theme(axis.text.x = element_text(angle = 45, hjust = 1)) # 旋转x轴标签避免重叠
3. 距离衰减折线图(带误差线)
计算每个空间距离区间的平均相似性,用折线展示衰减趋势,误差线表示离散程度:
library(dplyr) # 按分箱计算均值、标准差和样本量 summary_data <- plot_data %>% group_by(distance_bin) %>% summarise( mean_sim = mean(chemical_similarity), sd_sim = sd(chemical_similarity), count = n() ) # 绘图 ggplot(summary_data, aes(x = distance_bin, y = mean_sim, group = 1)) + geom_line(color = "darkblue", lwd = 1.2) + geom_point(size = 3) + geom_errorbar(aes(ymin = mean_sim - sd_sim, ymax = mean_sim + sd_sim), width = 0.2) + labs( x = "空间距离区间", y = "平均化学相似性", title = "化学相似性的距离衰减趋势", subtitle = "误差线为标准差" ) + theme_minimal()
小提示
- 如果你的距离矩阵是用
vegan包的vegdist生成的,直接用上面的代码就行,dist类对象支持索引提取。 - 分箱数量可以自定义,比如用
breaks = seq(min(spatial_pairs), max(spatial_pairs), length.out = 6)生成等距的5个分箱。 - 平滑线可以换成线性回归(
method = "lm"),如果想检验线性关系。
内容的提问来源于stack exchange,提问作者Laurence Jeanjean
相关产品推荐
相关产品推荐

