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

ggplot2如何设置仅显示2个图例项而非自动生成的6个?

解决方案

优先方案(按教授建议使用substr())

你的问题核心是fill映射了含6个水平的Plot变量,所以生成了6个图例条目,只需新增一个仅包含「常绿林/落叶林」两个水平的分类变量做fill映射即可,用substr()提取Plot字段里的类型标识生成这个新变量:

  • 第一步:新增森林类型字段,根据你实际的Plot命名调整substr的起止位置,比如你的Plot命名为「E1、E2、E3、D1、D2、D3」,取第1位即可区分类型,代码如下:
# 提取Plot标签的指定位置字符生成森林类型列
dbh.full$ForestType <- substr(dbh.full$Plot, start = 1, stop = 1)
# 替换为可读的类型名称
dbh.full$ForestType <- factor(dbh.full$ForestType, levels = c("E", "D"), labels = c("常绿林", "落叶林"))
  • 第二步:修改ggplot映射逻辑,x轴仍用Plot保留6个箱形图,fill映射为新的ForestType变量:
ggplot(data=dbh.full, aes(x=Plot, y=D_2017, fill=ForestType)) + 
  geom_boxplot() +
  labs(x='Plot ID', y='Tree DBH', fill='Forest Type') +
  scale_fill_manual(values = c("常绿林" = "gray45", "落叶林" = "gray69"))

调整后图例只会显示2个条目,对应两类森林的配色。

替代方案(Plot无统一命名规则时使用)

如果你的Plot命名没有可提取的公共标识,可以直接通过样地顺序判断生成类型列:

# 前3个样地为常绿林,后3个为落叶林
dbh.full$ForestType <- ifelse(as.integer(dbh.full$Plot) %in% 1:3, "常绿林", "落叶林")

后续绘图代码和上述方案一致即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 03:18:03