ggplot分组错开(dodged)条形图叠加多线的边框与图例异常问题
问题核心原因
- 代码存在列名拼写错误:原始数据集的变量类别列是
var_type、数值列是var_value,你后续筛选和绘图时写的water_type、water_val是不存在的字段,会直接报错。 - 你把
color美学映射写在了ggplot的全局参数中,所有图层都会继承这个映射,导致条形图被自动加上了彩色边框,同时fill和color的图例被合并展示。
修正后可直接运行的代码
library(ggplot2) library(dplyr) mydata <- data.frame(month=c(2,2,2,2,2,2,2,2,6,6,6,6,6,6,6,6, 10,10,10,10,10,10,10,10), year=c(2016,2016,2016,2016,2017,2017,2017,2017, 2016,2016,2016,2016,2017,2017,2017,2017), var_type=c("V1","V2","V3","V4","V1","V2","V3","V4", "V1","V2","V3","V4","V1","V2","V3","V4", "V1","V2","V3","V4","V1","V2","V3","V4"), var_value=c(1,4,4,3,1,5,4,3,3,22,12,16, 3,23,12,16,12,8,7,8,3,8,7,8)) # 修正列名错误,拆分条形、折线数据集 bar_data <- mydata %>% filter(var_type %in% c("V1","V2")) line_data <- mydata %>% filter(var_type %in% c("V3","V4")) # 绘图逻辑调整 ggplot() + # 条形图层:仅映射fill,显式设置color=NA去掉边框 geom_col(data = bar_data, aes(x = month, y = var_value, fill = var_type), position = "dodge", color = NA) + # 折线图层:仅映射color,可按需调整线宽、是否加标记点 geom_line(data = line_data, aes(x = month, y = var_value, color = var_type), size = 1) + geom_point(data = line_data, aes(x = month, y = var_value, color = var_type), size = 2) + ggtitle("V1 and V2") + scale_y_continuous(breaks = seq(0,25,10)) + xlab("Month") + ylab("(cm)") + facet_wrap(~year,nrow=2) + # 自定义配色与图例名称,可按需修改 scale_fill_manual(values = c("V1" = "orange", "V2" = "green"), name = "条形变量") + scale_color_manual(values = c("V3" = "blue", "V4" = "red"), name = "折线变量")
修改说明
- 取消了全局美学映射,将x、y、fill、color分别放到对应图层的
aes中,避免跨图层继承不需要的属性。 - 给
geom_col显式设置color = NA,彻底去掉条形的彩色边框。 - fill映射仅对应V1、V2两个条形变量,color映射仅对应V3、V4两个折线变量,两个图例相互独立,刚好生成4个独立条目,完全匹配需求。
- 代码兼容R 3.6.1版本,无需额外升级依赖包。
内容的提问来源于stack exchange,提问作者E Maas
相关产品推荐
相关产品推荐

