ggplot2绘图添加图例及aes()函数配置问题求助
问题根因
ggplot2只有将图形属性(颜色、形状、填充等)写在aes()函数内部并绑定分类变量时,才会自动生成图例。你当前的代码把所有颜色、形状参数都放在aes()外部,同时提前定义的cols、fills向量也没有被调用,因此无法生成图例。
修正后完整代码
library(readxl) library(ggplot2) library(ggpmisc) Mydata <- read_excel('../...') # 数据文件路径 df <- subset(data.frame(x = Mydata$rc, y = Mydata$`O2 (mol/m^3)`), y > 0.051 & x > 0) # 纳入回归的点 df2 <- subset(data.frame(x = Mydata$rc, y = Mydata$`O2 (mol/m^3)`), y < 0.051 & y > 0) # 排除的点 ggplot() + # 纳入回归的实心点+路径,aes内绑定分类标签 geom_point(data = df, aes(x, y, color = "纳入回归", shape = "纳入回归", fill = "纳入回归")) + geom_path(data = df, aes(x, y, color = "纳入回归")) + # 排除的空心点,aes内绑定分类标签 geom_point(data = df2, aes(x, y, color = "排除回归", shape = "排除回归", fill = "排除回归")) + # 拟合线,aes内绑定分类标签 geom_smooth(data = df, aes(x, y, color = "线性拟合"), formula = y~x, method = 'lm', se = FALSE) + # 回归方程标注 stat_poly_eq(data = df, formula = y~x, rr.digits = 3, coef.digits = 5, aes(x, y, label = paste("atop(", after_stat(eq.label), ",", after_stat(rr.label), ")", sep = "")), parse = TRUE, label.x = 'right') + # 坐标轴标签 xlab(expression('dC'[O2]*'/dt (mol m'^-3*' s'^-1*')')) + ylab(expression('C'['O2']*' (mol m'^-3*')')) + # 坐标范围设置 coord_cartesian(xlim = c(0, 0.00205), ylim = c(0,0.27), expand = c(0,0)) + # 手动匹配图形属性,统一图例 scale_color_manual(values = c("纳入回归" = "blue", "排除回归" = "blue", "线性拟合" = "red"), name = "类型说明") + scale_shape_manual(values = c("纳入回归" = 16, "排除回归" = 1), name = "类型说明") + scale_fill_manual(values = c("纳入回归" = "blue", "排除回归" = "white"), name = "类型说明") + # 主题调整 theme_bw() + theme(panel.border = element_blank(), panel.grid.minor = element_blank(), axis.line = element_line(colour = "black"), # 可按需调整图例位置,可选值:top/bottom/left/right/none legend.position = "top")
关键修改说明
- 把不同图形元素的颜色、形状、填充规则都移到
aes()内部,通过自定义字符串绑定分类,触发图例自动生成 - 用
scale_*_manual系列函数匹配你预设的样式,同时统一图例名称,避免多个图例拆分显示 - 统一了两个数据集的x/y列名,代码更简洁易维护
- 如果需要保留英文图例,只需把分类标签替换为你预先定义的
Included in regression、Excluded from regression即可。
内容的提问来源于stack exchange,提问作者Sollegie
相关产品推荐
相关产品推荐

