如何使用ggplot2自定义NMDS蜘蛛图颜色并叠加香农多样性等高线
解决方案
问题原因说明
- 自定义颜色不生效:你当前绘图的美学映射用的是
colour = Habitat,没有用到fill属性,因此scale_fill_manual不会对任何元素生效,需要替换为scale_colour_manual,同时建议先将生境类别转为有序因子,保证渐变顺序符合你的需求。 - 等高线叠加失败:
ordisurf是base绘图体系的函数,不能直接叠加到ggplot2对象上,需要先提取ordisurf拟合的网格数据,再用ggplot2的等高线图层绘制。
完整可运行代码
# 加载所需包 library(vegan) library(ggplot2) # 原有数据处理和NMDS运行代码 data_1 <- dataNMDS[,9:17] data_2 <- dataNMDS[,2:8] NMDS <- metaMDS(data_1, distance = "bray", k = 2) # 提取排序得分 datascores <- as.data.frame(scores(NMDS)) scores <- cbind(datascores, Habitat = data_2$Plot_gradient) # -------------------------- # 1. 预处理生境有序因子(保证渐变顺序正确) scores$Habitat <- factor(scores$Habitat, levels = c("Grassland","EGA","EGB","EGC","EHC","EHB","EHA","Heath"), ordered = TRUE) centroids <- aggregate(cbind(NMDS1, NMDS2) ~ Habitat, data = scores, FUN = mean) seg <- merge(scores, setNames(centroids, c('Habitat','oNMDS1','oNMDS2')), by = 'Habitat', sort = FALSE) # -------------------------- # 2. 预处理香农多样性等高线数据 shannon_div <- diversity(data_1, index = "shannon") # 拟合ordisurf,不直接绘图 surf_fit <- ordisurf(NMDS, shannon_div, plot = FALSE) # 转换为ggplot可用的网格数据框 surf_df <- expand.grid(NMDS1 = surf_fit$grid$x, NMDS2 = surf_fit$grid$y) surf_df$shannon <- as.vector(surf_fit$grid$z) # -------------------------- # 3. 最终绘图 ggplot(scores, aes(x = NMDS1, y = NMDS2, colour = Habitat)) + # 先加等高线,放在最底层 geom_contour(data = surf_df, aes(z = shannon, colour = NULL), color = "gray50", linewidth = 0.5) + # 加等高线数值标注 stat_contour(data = surf_df, aes(z = shannon, label = after_stat(level), colour = NULL), geom = "text", color = "gray30", size = 3, skip = 1) + # 原有蜘蛛图元素 geom_segment(data = seg, aes(xend = oNMDS1, yend = oNMDS2)) + geom_point(data = centroids, size = 4) + geom_point(size = 2) + # 自定义颜色渐变 scale_colour_manual(values = c("darkgreen" , "green4" , "green3" , "green2", "orangered" , "orangered2" , "orangered3" , "orangered4")) + coord_fixed()+ labs(color = "生境类型") + theme_bw()+ theme(legend.position="right", legend.text=element_text(size=10), legend.direction='vertical')
代码说明
- 等高线图层设置了
colour = NULL,避免继承全局的Habitat颜色映射,用灰色独立展示 skip = 1参数控制标注的密度,可根据实际显示效果调整- 有序因子的设置保证了图例中生境的顺序和你指定的渐变顺序完全一致
内容的提问来源于stack exchange,提问作者NathanT
相关产品推荐
相关产品推荐

