You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R ggplot2绘制NMDS图时DF2图层geom_point的fill参数不生效问题

问题根源

你为DF2点图层指定的shape=18(实心菱形)属于无填充属性的基础形状,这类形状的颜色仅由colour参数控制,仅编号为21~25的带边框形状才支持fill(填充色)、colour(边框色)双参数设置,因此你当前写的fill = Order映射不会生效,点默认显示为黑色。

解决方案

方案1:更换为支持fill属性的形状(无需额外依赖包)

将DF2的点形状更换为21~25之间的数值即可,示例调整后的完整代码如下:

ggplot(DF1, aes(x = NMDS1, y = NMDS2)) + 
    geom_point(aes(colour= Deep), size = 3.5, alpha=0.7) + 
    scale_colour_manual(values = c("cyan4", "blue", "orange", "red", "darkgreen")) +
    # 替换shape为21(实心圆带边框),可根据喜好换成22/23/24/25
    geom_point(data = DF2, aes(x=NMDS1, y=NMDS2, fill = Order), size = 2.5, alpha=0.7, shape=21, colour = "gray20") + 
    scale_fill_manual(values = MyPalette20) +
    geom_segment(data = DF2, aes(x = 0, xend=NMDS1, y=0, yend=NMDS2), 
                 arrow = arrow(length = unit(0.25, "cm")),
                 colour = "#CCCCCC",
                 lwd=0.3, linetype="dashed")

如果不需要点边框,直接把colour = "gray20改成colour = NA即可。

方案2:保留shape=18,使用ggnewscale新建颜色标度

如果你坚持要用shape=18的菱形样式,由于第一层已经用colour参数映射了Deep字段,需要用ggnewscale包新增独立的颜色标度给DF2的点使用,代码调整如下:
首先安装加载包:

install.packages("ggnewscale")
library(ggnewscale)

调整绘图代码:

ggplot(DF1, aes(x = NMDS1, y = NMDS2)) + 
    geom_point(aes(colour= Deep), size = 3.5, alpha=0.7) + 
    scale_colour_manual(values = c("cyan4", "blue", "orange", "red", "darkgreen")) +
    # 新增颜色标度,后续的colour参数会使用新的标度,不会和第一层冲突
    new_scale_colour() +
    # 将fill改为colour,shape保留18
    geom_point(data = DF2, aes(x=NMDS1, y=NMDS2, colour = Order), size = 2.5, alpha=0.7, shape=18) + 
    # 把scale_fill_manual改为scale_colour_manual
    scale_colour_manual(values = MyPalette20) +
    geom_segment(data = DF2, aes(x = 0, xend=NMDS1, y=0, yend=NMDS2), 
                 arrow = arrow(length = unit(0.25, "cm")),
                 colour = "#CCCCCC",
                 lwd=0.3, linetype="dashed")

内容的提问来源于stack exchange,提问作者abraham

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 17:27:02