R语言NMDS排序图点颜色与数据集不匹配问题求助
R语言NMDS排序图颜色与形状匹配问题修复
问题描述
绘制NMDS(非度量多维尺度分析)排序图时,点的颜色、形状与数据集定义不匹配:例如数据集里site 31和site 35同属Group 1,应显示为橙色三角形,但绘图中site 31却显示为蓝色,此类错位问题多次出现。
问题代码
ggplot(terranmds.data_scorestest, aes(x = NMDS1, y = NMDS2)) + geom_point(aes(colour = factor(site), shape = factor(Group)), size = 3, alpha = 0.7) + geom_text(aes(label = site, colour = factor(site)), vjust = 1.7, show.legend = FALSE) + labs( title = "Measured Communities Ordination Plot (August)", colour = "Year Communities", shape = "Temp. Grouping" ) + coord_equal() + scale_colour_manual(values = terranmds.data_scorestest$point_color, guide = "none") + # Remove color legend + theme_classic() + theme( panel.background = element_rect(fill = NA, colour = "black", size = 1, linetype = "solid"), legend.position = c(0.05, 0.05), legend.justification = c(0, 0), legend.text = element_text(size = 12), legend.title = element_text(size = 12, face = "bold"), legend.box.background = element_rect(color = "black"), axis.text = element_text(size = 10), axis.title = element_text(size = 12, color = "grey14", face = "bold") ) + theme(plot.title = element_text(color = "#45ADA8", size = 15, face = "bold", hjust = 0.5)) + geom_hline(yintercept = 0, linetype = "dashed", color = "grey") + geom_vline(xintercept = 0, linetype = "dashed", color = "grey")
问题截图


问题根源与修复方案
核心问题
- 颜色映射逻辑错误:将颜色绑定到
site而非Group,与“同Group点颜色一致”的需求逻辑颠倒。 - 颜色值匹配方式错误:
scale_colour_manual直接传入数据列向量时,ggplot会按因子水平顺序匹配颜色,而非按数据行对应site,导致颜色错位。
修复步骤
- 调整映射关系:将颜色和形状都绑定到
Group,确保同组样式统一。 - 规范颜色值传递:用命名向量指定Group与颜色的对应关系,避免顺序错位。
- 同步标签颜色:让文本标签的颜色与对应点的Group颜色一致。
修正后完整代码
ggplot(terranmds.data_scorestest, aes(x = NMDS1, y = NMDS2)) + # 颜色和形状都映射到Group,同组样式统一 geom_point(aes(colour = factor(Group), shape = factor(Group)), size = 3, alpha = 0.7) + # 标签颜色同步绑定到Group geom_text(aes(label = site, colour = factor(Group)), vjust = 1.7, show.legend = FALSE) + labs( title = "Measured Communities Ordination Plot (August)", colour = "Temp. Grouping", shape = "Temp. Grouping" ) + coord_equal() + # 用命名向量指定Group对应的颜色,确保匹配准确 scale_colour_manual(values = setNames(unique(terranmds.data_scorestest$point_color), unique(terranmds.data_scorestest$Group))) + theme_classic() + theme( panel.background = element_rect(fill = NA, colour = "black", size = 1, linetype = "solid"), legend.position = c(0.05, 0.05), legend.justification = c(0, 0), legend.text = element_text(size = 12), legend.title = element_text(size = 12, face = "bold"), legend.box.background = element_rect(color = "black"), axis.text = element_text(size = 10), axis.title = element_text(size = 12, color = "grey14", face = "bold") ) + theme(plot.title = element_text(color = "#45ADA8", size = 15, face = "bold", hjust = 0.5)) + geom_hline(yintercept = 0, linetype = "dashed", color = "grey") + geom_vline(xintercept = 0, linetype = "dashed", color = "grey")
内容的提问来源于stack exchange,提问作者user390865
相关产品推荐
相关产品推荐

