You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 22:24:53