如何在同一张NMDS图中设置多物种丰度对应geom_point的点大小
实现方案
你只要把合并了NMDS得分的原始宽表转成长表,让每个样本对应多条物种丰度记录,就能直接把不同物种的丰度映射为点大小,同时用颜色或形状区分不同物种,修改后的完整代码如下:
library(tidyverse) library(vegan) # 原始数据构造部分不变 df <- strsplit("Group Estacion Richness Especie1 Especie2 Especie3 Especie4 Especie5 Especie6 Especie7 Agosto E1 6 87 87 89 91 87 94 0 Agosto E2 7 77 78 78 77 95 45 45 Agosto E3 7 85 87 89 89 78 89 95 Agosto E4 3 57 56 54 0 0 0 0 Diciembre E1 6 77 78 78 77 95 45 0 Diciembre E2 7 65 64 68 69 65 64 69 Diciembre E3 7 74 71 75 75 76 81 75 Diciembre E4 2 38 39 0 0 0 0 0 Abril E1 7 81 82 79 82 78 79 82 Abril E2 7 69 71 72 71 68 69 73 Abril E3 7 74 79 78 75 79 75 76 Abril E4 3 51 52 49 0 0 0 0", "\n") %>% unlist() %>% strsplit("\t") %>% unlist() %>% matrix(ncol = 10, byrow = TRUE) %>% {`colnames<-`(data.frame(.[-1,], stringsAsFactors = FALSE), .[1,])} %>% mutate_at(vars(-Group, -Estacion), as.numeric) # NMDS计算部分不变 nmds <- metaMDS(select(df, starts_with("Especie"))) # 核心修改:合并数据后转长表,再绘图 scores(nmds) %>% cbind(df) %>% # 把物种列转为长表,cols参数可以指定你需要的物种,比如只要前3个就写c(Especie1,Especie2,Especie3) pivot_longer(cols = starts_with("Especie"), names_to = "species", values_to = "abundance") %>% ggplot(aes(x = NMDS1, y = NMDS2)) + # 大小映射丰度,颜色映射物种,也可以按需调整为颜色映射Group、形状映射species geom_point(aes(size = abundance, color = species), alpha = 0.7) + stat_ellipse(geom = "polygon", aes(group = Group, color = Group, fill = Group), alpha = 0.15) + annotate("text", x = -2, y = 0.95, label = paste0("stress: ", format(nmds$stress, digits = 4)), hjust = 0) + # 可以自定义点大小范围 scale_size_continuous(range = c(1, 8)) + theme_bw()
可选调整说明
- 只展示指定物种:修改
pivot_longer的cols参数,填入你需要的物种列名即可 - 区分采样分组和物种:可以将
color映射为Group,shape映射为species,同时展示两个维度的信息 - 解决点重叠:调整
geom_point的alpha透明度参数,或者修改scale_size_continuous的range值缩小点的最大尺寸
内容的提问来源于stack exchange,提问作者i.b
相关产品推荐
相关产品推荐

