ggplot2使用多数据框绘图时scale_color_manual不显示图例如何解决
问题原因
你当前代码无法生成图例的核心原因是:color参数写在了geom_point()的aes()映射外部,属于硬编码指定图层颜色,ggplot不会将这类硬编码配置关联到图例映射体系中。只有将分组标识放到aes()的color参数内,才能触发生成对应图例。
解决方法
这里提供两种可行方案:
方案1(推荐,符合ggplot的tidy数据范式):先合并所有数据框再绘图
先给每个数据框添加分组标识,再合并为一个总数据框,直接映射颜色字段即可:
# 加载dplyr用于数据合并,已安装可跳过第一行 library(dplyr) df_combined <- bind_rows( data2_CY %>% mutate(group = "C&Y"), data2_CN %>% mutate(group = "C&N"), data2_LY %>% mutate(group = "L&Y"), data2_LN %>% mutate(group = "L&N") ) # 绘图代码 ggplot(df_combined, aes(x = Date, y = AVERAGETOTALCOST, color = group)) + geom_point() + labs(title = "Trends Over Time", x = "Time", y = "Average Total Cost", color = "分组") + scale_x_date(breaks = seq(as.Date("2015-01-01"), as.Date("2019-07-01"), by = "6 months"), date_labels = "%b\n%Y") + scale_color_manual(values = c('C&Y' = 'blue', 'C&N' = 'red', 'L&Y' = 'cyan', 'L&N' = 'magenta'))
方案2:不改动现有数据结构,调整每个图层的映射写法
无需合并数据,只需要把每个geom_point()的color参数挪到aes()内部,指定对应分组名即可:
ggplot(data2_CY, aes(x = Date, y = AVERAGETOTALCOST)) + geom_point(aes(color = 'C&Y')) + geom_point(data = data2_CN, aes(color = 'C&N')) + geom_point(data = data2_LY, aes(color = 'L&Y')) + geom_point(data = data2_LN, aes(color = 'L&N')) + labs(title = "Trends Over Time", x = "Time", y = "Average Total Cost", color = "分组") + scale_x_date(breaks = seq(as.Date("2015-01-01"), as.Date("2019-07-01"), by = "6 months"), date_labels = "%b\n%Y") + scale_color_manual(values = c('C&Y' = 'blue', 'C&N' = 'red', 'L&Y' = 'cyan', 'L&N' = 'magenta'))
两种方案都可以正常在右侧生成对应颜色的图例,你可以根据自己的使用习惯选择。
内容的提问来源于stack exchange,提问作者dkim95
相关产品推荐
相关产品推荐

