ggplot2中labs(fill=)失效时,如何修改图例标题?
解决ggplot2折线图图例标题修改问题
嘿,我看到你的问题了——你用labs(fill="Temperature")改图例标题没生效,这是因为你的折线图用的是color美学来区分不同温度组,而不是fill呀!fill一般是给条形图、面积图这类有填充区域的图形用的,折线图的颜色对应是color参数,所以针对fill的设置自然不会影响到颜色图例。下面给你几种靠谱的修改方法:
方法1:直接用labs(color = "Temperature")替换原代码的labs(fill)
这是最直接的修正,既然图例是由color美学生成的,那就直接在labs里指定color的标题:
p <- ggplot(data_x, aes(Temp, group=1)) + geom_line(aes(y=X18, color="18°C"), size = 1) + geom_line(aes(y=X20, color="20°C"), size=1) + geom_line(aes(y=X25, color = "25°C"), size=1) + geom_line(aes(y=X27, color = "27°C"), size=1) + geom_line(aes(y=X30, color="30°C"), size=1) + theme_minimal() + scale_x_discrete(expand = c(0,0), labels= c("Day 1-2", "Day 3-4", "Day 5-6", "Day 7-8", "Day 9-10")) + scale_y_continuous(n.breaks = 8) + ggtitle("GPP") + theme (plot.title = element_text(hjust = 0.5)) + xlab("Recording day") + ylab("Dissolved oxygen mg/L/s") + labs(color = "Temperature") # 把fill改成color就好
方法2:通过scale_color_discrete()设置图例名称
因为你是手动指定了离散的颜色标签,也可以直接在颜色刻度函数里设置名称:
p <- ggplot(data_x, aes(Temp, group=1)) + geom_line(aes(y=X18, color="18°C"), size = 1) + geom_line(aes(y=X20, color="20°C"), size=1) + geom_line(aes(y=X25, color = "25°C"), size=1) + geom_line(aes(y=X27, color = "27°C"), size=1) + geom_line(aes(y=X30, color="30°C"), size=1) + theme_minimal() + scale_x_discrete(expand = c(0,0), labels= c("Day 1-2", "Day 3-4", "Day 5-6", "Day 7-8", "Day 9-10")) + scale_y_continuous(n.breaks = 8) + ggtitle("GPP") + theme (plot.title = element_text(hjust = 0.5)) + xlab("Recording day") + ylab("Dissolved oxygen mg/L/s") + scale_color_discrete(name = "Temperature") # 在这里设置图例标题
方法3:重构数据为长格式(推荐的ggplot2最佳实践)
你现在的代码是用多个geom_line来分别绘制不同温度的折线,这种宽格式数据的写法不仅冗余,也不利于后续维护。推荐把数据转成长格式,只需要一个geom_line就能完成绘制,图例标题的设置也会更自然:
步骤1:转换数据格式(用tidyr包的pivot_longer)
library(tidyr) data_long <- data_x %>% pivot_longer(cols = starts_with("X"), # 选择所有以X开头的列(X18、X20等) names_to = "Temperature", # 列名转成Temperature列 values_to = "DO_value") %>% # 数值转成DO_value列 mutate(Temperature = paste0(gsub("X", "", Temperature), "°C")) # 处理成"18°C"这样的格式
步骤2:用长数据绘制折线图
p <- ggplot(data_long, aes(x = Temp, y = DO_value, color = Temperature)) + geom_line(size = 1, group = 1) + # 现在只需要一个geom_line theme_minimal() + scale_x_discrete(expand = c(0,0), labels= c("Day 1-2", "Day 3-4", "Day 5-6", "Day 7-8", "Day 9-10")) + scale_y_continuous(n.breaks = 8) + ggtitle("GPP") + theme(plot.title = element_text(hjust = 0.5)) + xlab("Recording day") + ylab("Dissolved oxygen mg/L/s") + labs(color = "Temperature") # 同样用labs(color)设置标题,或者用scale_color_discrete(name=...)
这种写法更符合ggplot2的“数据驱动”设计理念,后续如果要添加新的温度组,只需要在数据里加列,不需要修改绘图代码,非常方便。
内容的提问来源于stack exchange,提问作者Hugo Ald
相关产品推荐
相关产品推荐

