You need to enable JavaScript to run this app. Matplotlib双列分组散点饼图实现全局统一颜色与饼块计数标注
优惠活动
大模型
产品
解决方案
定价
更多

Matplotlib双列分组散点饼图实现全局统一颜色与饼块计数标注

带全局统一配色的散点饼图实现指南

问题根因

  • 之前实现出现跨分组颜色不一致的核心原因:颜色映射逻辑是局部生效的,每个Column1+Column2分组下的饼图单独生成本地的Column3-颜色绑定关系,没有建立跨全量数据集的固定映射规则。哪怕手动指定色值、使用自定义色板,只要映射逻辑跟着分组走,就会出现同一Column3取值在不同分组下匹配不同色值的问题。

核心实现步骤

1. 建立全局统一颜色映射(满足同类别同色要求)

  • 先从全量数据中提取Column3的所有去重类别,完成固定顺序排序,不要随分组动态调整类别顺序
  • 按照固定顺序给每个类别绑定唯一的固定色值,生成全局通用的颜色查询字典,后续所有绘图的取色操作必须从这个字典中查询,禁止在单个分组内临时生成色值
  • 参考实现代码:
import pandas as pd
from matplotlib.cm import get_cmap

# 全量提取Column3去重类别并固定顺序
all_col3_classes = sorted(df["Column3"].unique())
# 匹配固定色板生成对应色值
base_cmap = get_cmap("tab10", len(all_col3_classes))
# 生成全局颜色映射字典
global_color_map = {
    class_name: base_cmap(idx) 
    for idx, class_name in enumerate(all_col3_classes)
}

2. 饼块内添加样本计数标注

  • 对每个Column1+Column2的分组,单独计算组内Column3各类别的样本计数
  • 调用饼图绘制接口时,传入计数文本作为内部标注,调整标注的偏移距离保证文本落在对应饼块区域内
  • 参考实现代码:
# 以matplotlib的pie绘图接口为例
group_pie_counts = group_df["Column3"].value_counts()
ax.pie(
    group_pie_counts.values,
    # 强制使用全局颜色映射取色
    colors=[global_color_map[cat] for cat in group_pie_counts.index],
    # 自动计算每个饼块对应的样本计数并标注
    autopct=lambda percent: f"{int(round(percent/100 * group_pie_counts.sum()))}",
    pctdistance=0.6  # 调整标注位置在饼块内部,不贴边
)

常见踩坑提示

  • 不要在每个分组内单独基于本地类别列表匹配色值:哪怕用完全相同的色板,只要每个分组的本地类别顺序不一致,就会出现色值错位。比如分组1的本地类别顺序是["A", "B"],分组2的本地类别顺序是["B", "C"],本地按顺序取色的话,"B"在分组1对应第二个色值、在分组2对应第一个色值,直接造成颜色不一致
  • 不要依赖绘图库的默认循环取色逻辑:默认循环取色是按绘图调用的先后顺序依次取色,没有和类别本身做绑定,跨绘图调用的取色顺序一旦变化,就会打破全局颜色一致性

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.05 06:45:03