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
相关产品推荐
相关产品推荐

