ggplot2多折线图底部双列图例不显示问题求助
解决ggplot双折线图底部双列图例不显示问题
你的代码里图例不显示有两个核心问题:
- 两条折线的
color参数写在了aes()外面,ggplot无法识别这是需要生成图例的映射关系 - 最后用
guides(fill=guide_legend(ncol=2))控制图例,但你要调整的是**颜色(colour)**图例,不是填充(fill)图例
修正方案(推荐用长格式数据绘图,更符合ggplot逻辑)
先把宽格式数据转换成ggplot推荐的长格式,再统一映射颜色变量:
# 加载需要的包(未安装先执行 install.packages("tidyr")) library(tidyr) library(ggplot2) # 创建向量 MODEL <- c(78, 47, 101) CONTROL <- c(80, 46, 100) Date <- seq(from= as.Date("2003-06-01"), to = as.Date("2003-08-01"), by = "month") # 合并为数据框 my.df <- data.frame(MODEL, CONTROL, Month = Date) # 转换为长格式数据 my.df_long <- pivot_longer(my.df, cols = c(MODEL, CONTROL), names_to = "Group", values_to = "CIMFD") # 绘图 ggplot(my.df_long, aes(x= Month, y = CIMFD, color = Group)) + geom_line(size= 1) + scale_y_continuous(limits= c(40, 110), breaks = seq(40,110,10)) + scale_x_date(limit=c(as.Date("2003-06-01"),as.Date("2003-08-01")), date_breaks= "1 month", date_labels = "%b") + ylab("CIMFD [kg/m²]") + xlab("") + theme_bw() + theme(text= element_text(size= 20), axis.text= element_text(size= 25, color= "black"), legend.position = "bottom") + scale_colour_manual("", values = c("MODEL" = "blue", "CONTROL" = "red")) + guides(colour=guide_legend(ncol=2))
关键修改点说明
- 转换长格式:用
pivot_longer把MODEL和CONTROL列合并成分组变量,仅需一次geom_line即可绘制两条折线,同时自动映射颜色到分组 - 颜色映射到aes内部:把
color放到ggplot()的aes()里,让ggplot识别需要根据Group变量生成图例 - 修正guides参数:将
guides(fill=...)改为guides(colour=guide_legend(ncol=2)),指定颜色图例为双列布局 - 简化颜色配置:直接指定分组对应的颜色,长格式数据会自动识别分组,无需额外设置breaks
不转换长格式的替代方案
如果坚持使用原宽格式数据,需将每条折线的color放入各自的aes()内,并手动指定图例映射:
library(ggplot2) # 创建向量 MODEL <- c(78, 47, 101) CONTROL <- c(80, 46, 100) Date <- seq(from= as.Date("2003-06-01"), to = as.Date("2003-08-01"), by = "month") # 合并为数据框 my.df <- data.frame(MODEL, CONTROL, Month = Date) # 绘图 ggplot(my.df, aes(x= Month)) + geom_line(aes(y= MODEL, color= "MODEL"), size= 1) + # 将color移入aes geom_line(aes(y= CONTROL, color= "CONTROL"), size= 1) + # 将color移入aes scale_y_continuous(limits= c(40, 110), breaks = seq(40,110,10)) + scale_x_date(limit=c(as.Date("2003-06-01"),as.Date("2003-08-01")), date_breaks= "1 month", date_labels = "%b") + ylab("CIMFD [kg/m²]") + xlab("") + theme_bw() + theme(text= element_text(size= 20), axis.text= element_text(size= 25, color= "black"), legend.position = "bottom") + scale_colour_manual("", breaks = c("MODEL", "CONTROL"), values = c("blue", "red")) + guides(colour=guide_legend(ncol=2)) # 调整颜色图例为双列
内容的提问来源于stack exchange,提问作者climsaver
相关产品推荐
相关产品推荐

