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

如何在ggplot2中添加自定义图例?含同色国家柱状图代码场景

解决ggplot水平柱状图的自定义图例问题

好问题!你现在的情况是多个国家共享同一种颜色,但默认图例是按每个国家单独生成的——这显然不是你想要的效果。要创建符合需求的自定义图例,核心思路是把相同颜色的国家归为一个逻辑分组,让ggplot基于这个分组来生成图例,而不是单个国家。下面是具体的实现步骤和代码:

步骤1:创建颜色-分组-国家的映射表

首先,我们把你现有的颜色规则整理成一个清晰的映射表,给相同颜色的国家赋予一个有意义的分组名称(比如按大洲、经济体类型等,你可以根据需求修改分组名):

# 加载tidyverse工具包(用于数据处理)
library(tidyverse)

# 创建颜色与分组的映射表
color_group <- tibble(
  Country = c("United States", "India", "China", "Germany", "Russia", "Japan",
              "France", "United Kingdom", "Italy", "Brazil", "Spain", "Iran",
              "Mexico", "Poland", "Turkey", "Indonesia", "Saudi Arabia", 
              "NetherLands", "Canada"),
  # 自定义分组名称,可根据你的需求修改
  Group = c("北美&英国", "南亚", "东亚", "西欧", "东欧", "东亚", "西欧", 
            "北美&英国", "南欧", "南美", "南欧", "中东", "北美", "南亚", 
            "中东", "东南亚", "中东", "西欧", "北美"),
  Color = c("#00CCFF", "#33FF00", "#FFFF00", "#000099", "#CC0000", "#FF66CC",
            "#666600", "#00CCFF", "#FF9933", "#FFFF00", "#993300", "orange",
            "#003333", "#33FF00", "orange", "#FFFF00", "#00CCFF", "#993300",
            "#666600")
)

# 将映射表与你的原始数据合并,为每个国家添加分组信息
sample_with_group <- sample %>%
  left_join(color_group, by = "Country")

步骤2:修改ggplot代码,基于分组生成图例

接下来,我们调整ggplot的映射逻辑,把fill从Country替换为新的Group变量,同时更新颜色映射规则:

library(ggplot2)
library(ggpubr)

p <- ggplot(sample_with_group, 
            aes(x = reorder(Country, size), y = size, 
                fill = Group, label = size)) +
  geom_bar(stat = "identity") +
  ggpubr::rotate_x_text() +
  coord_flip() +
  geom_text(hjust = -0.1) +
  # 调整图例位置(可根据需求改为"top"/"bottom"/"none")
  theme(legend.position = "right") +
  # 设置图例标题和颜色映射,确保分组与颜色一一对应
  scale_fill_manual("区域/分组", 
                    values = set_names(unique(color_group$Color), unique(color_group$Group)))

关键逻辑解释

  • 为什么要创建分组?因为你原来的fill = sample$Country会让ggplot为每个国家生成一个图例项,即使颜色重复。用分组变量替代后,相同颜色的国家会被合并到同一个图例项中。
  • 映射表让你可以灵活调整分组规则和颜色,后续如果需要修改某个分组的颜色或新增国家,直接修改color_group即可,不用在ggplot代码里硬编码一大串颜色值。
  • scale_fill_manual里用set_names把分组名称和对应的颜色绑定,确保图例显示的分组名和颜色完全匹配你的原始设置。

内容的提问来源于stack exchange,提问作者Anup Sakpal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 14:12:51