R ggplot2绘制柱线组合图无图例 如何强制显示图例
ggplot2柱线组合图强制显示图例方案
根本原因
ggplot2的图例是基于美学映射自动生成的,只有当你在aes()函数内将分类属性映射到color、fill、shape这类美学参数时,才会触发图例生成。你原有代码仅为两个系列单独指定了y轴数值,没有绑定分类标识,因此即便设置show.legend = TRUE也不会生成图例。
解决方案
方案1:手动映射分类名(无需修改原数据结构)
直接在各图层的aes()内为不同系列指定自定义分类名,即可触发图例生成:
library(ggplot2) data <- data.frame( A = c(1, 2, 3), B = c(1, 2, 3), C = c(2, 3, 4) ) ggplot(data, aes(x = A)) + geom_line(aes(y = C, color = "C系列")) + geom_point(aes(y = C, color = "C系列")) + geom_col(aes(y = B, fill = "B系列")) + # 自定义图例名称、颜色 labs(fill = "指标类型", color = "指标类型") + scale_fill_manual(values = "steelblue") + scale_color_manual(values = "tomato")
方案2:转换为长格式数据(tidyverse推荐写法)
将宽格式原始数据转换为长格式后,通过变量映射生成图例,代码可维护性更强:
library(tidyverse) data <- data.frame( A = c(1, 2, 3), B = c(1, 2, 3), C = c(2, 3, 4) ) # 转换为长格式 data_long <- data %>% pivot_longer(cols = c(B, C), names_to = "series", values_to = "value") ggplot() + geom_col(data = filter(data_long, series == "B"), aes(x = A, y = value, fill = series)) + geom_line(data = filter(data_long, series == "C"), aes(x = A, y = value, color = series)) + geom_point(data = filter(data_long, series == "C"), aes(x = A, y = value, color = series)) + labs(fill = "指标类型", color = "指标类型")
提示:如果需要将柱形和折线的图例合并为一个,只要保证
labs()中fill和color的参数值完全相同即可;如果需要分开显示两个图例,设置不同的参数值即可。
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

