为多个饼图统一颜色的最优高效实现方案
多饼图标签颜色统一的最优高效实现方案
要实现不同饼图中同一标签颜色一致,最高效的方式是构建全局的「标签-颜色」映射字典,结合matplotlib的颜色映射生成足够多的区分色,确保100个标签都有唯一对应颜色。具体实现步骤如下:
- 收集所有饼图的唯一标签:把所有饼图的标签列表合并后去重,得到完整的标签集合,确保每个标签只分配一次颜色。
- 生成标签-颜色映射:使用matplotlib的颜色映射(如
hsv或rainbow)生成与唯一标签数量匹配的颜色序列,再将标签和颜色一一对应存入字典,适配大量标签的颜色区分需求。 - 绘制饼图时调用颜色映射:每个饼图绘制时,根据自身的标签列表,从映射字典中提取对应的颜色列表,传递给
pie函数的colors参数。
修改后的完整代码
import pandas as pd import numpy as np import matplotlib.pyplot as plt # 原始数据 labels1 = ['John', 'Jerry', 'Sharon'] labels2 = ['Jerry', 'Sharon', 'Shaun'] y1 = [12, 8, 5] y2 = [10, 5, 10] # ---------------------- 核心颜色映射构建 ---------------------- # 收集所有唯一标签 all_labels = list(set(labels1 + labels2)) # 生成对应数量的颜色(hsv映射支持大量标签的颜色区分) cmap = plt.cm.get_cmap('hsv', len(all_labels)) # 构建标签-颜色字典 label_color_map = {label: cmap(i) for i, label in enumerate(all_labels)} # ---------------------- 绘图部分 ---------------------- fig, axs = plt.subplots(nrows=2, ncols=2, figsize=(15, 20)) fig.subplots_adjust(left=0.05, right=0.95, bottom=0.05, top=0.95, wspace=0.1, hspace=0.2) ax1 = axs[0,0] ax2 = axs[0,1] # 绘制时从映射字典中提取对应颜色 ax1.pie(y1, labels=labels1, colors=[label_color_map[label] for label in labels1]) ax2.pie(y2, labels=labels2, colors=[label_color_map[label] for label in labels2]) plt.show()
补充说明
- 颜色映射选择:针对100个标签,
hsv、rainbow这类循环色彩映射能提供足够的区分度;若偏好柔和配色,可替换为viridis或plasma。 - 扩展性:新增饼图或标签时,只需更新
all_labels的合并逻辑,映射字典会自动适配,无需手动调整颜色分配。 - 高效性:标签去重、颜色生成和字典查找均为线性时间复杂度,处理100个标签完全无性能压力。
内容的提问来源于stack exchange,提问作者BCmonitor
相关产品推荐
相关产品推荐

