ggplot图例:合并填充、颜色与形状并隐藏指定变量
问题解决代码及说明
针对你提出的三个问题,修改后的代码如下,同时保留柱状图与散点图的合并图例效果:
library(ggplot2) library(data.table) dt <- structure(list(country = c("AA", "BB", "CC", "AA", "BB", "CC", "AA", "BB", "CC", "AA", "BB", "CC", "AA", "BB", "CC", "AA", "BB", "CC", "AA", "BB", "CC", "AA", "BB", "CC"), variable = structure(c(1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L, 4L, 4L, 4L, 5L, 5L, 5L, 6L, 6L, 6L, 7L, 7L, 7L, 8L, 8L, 8L), levels = c("low_2021", "middle_2021", "intermediate_2021", "advanced_2021", "low_2016", "middle_2016", "intermediate_2016", "advanced_2016"), class = "factor"), value = c(25, 17, 19, 67, 75, 70, 75, 83, 81, 8, 8, 11, 19, 13, 14, 70, 76, 75, 81, 87, 86, 11, 11, 11)), row.names = c(NA, -24L), class = c("data.table", "data.frame")) ggplot(mapping = aes(x=value, y=country)) + # 移除middle_2021数据,不绘制该类别柱状图 geom_bar(data=dt[variable%in%c("low_2021", "advanced_2021")], aes(fill=variable), stat="identity" ) + geom_point(data=dt[variable%in%c("intermediate_2016", "advanced_2016")], aes(color=variable, shape=variable), size=3 # 可选:放大散点让形状更清晰 )+ labs(x=NULL, y=NULL) + scale_fill_manual( # 移除middle_2021的breaks项,隐藏该类别 breaks = c("advanced_2021", "low_2021", "advanced_2016", "intermediate_2016"), labels = c("Top 2021", "Low 2021", "Top 2016", "Low 2016"), values = c("#8ED973", "#F1A983", "blue", "red"), aesthetics = c("fill", "color") ) + # 添加shape映射,指定每个类别的形状,Top2016用三角形(shape=17) scale_shape_manual( breaks = c("advanced_2021", "low_2021", "advanced_2016", "intermediate_2016"), labels = c("Top 2021", "Low 2021", "Top 2016", "Low 2016"), values = c(NA, NA, 17, 19) # 柱状图类别设为NA,不显示形状;散点类别指定对应形状 ) + guides( # 合并fill、color、shape到同一图例,移除散点图例的灰色背景 fill=guide_legend( ncol=2, override.aes = list(fill = c("#8ED973", "#F1A983", NA, NA)) ), # 关闭单独的shape和color图例 shape="none", color="none" ) + theme(legend.position = "bottom", legend.title = element_blank())
关键修改说明
- 修复Top2016图例形状错误:新增
scale_shape_manual,为advanced_2016(对应Top2016)指定三角形形状(shape=17),同时为柱状图类别设置NA避免显示多余形状。 - 移除散点图例灰色背景:在
guide_legend的override.aes中,将散点类别的fill设为NA,消除灰色填充。 - 隐藏Middle2021类别:从
geom_bar的数据筛选中移除middle_2021,同时在scale_fill_manual和scale_shape_manual的breaks、labels、values中删除该类别对应的项,彻底隐藏其内容和图例。
内容的提问来源于stack exchange,提问作者gitcanzo
相关产品推荐
相关产品推荐

