如何为Pandas DataFrame中各Kanton生成Kat标签颜色统一的饼图?
实现同一Kat值在不同Kanton饼图中颜色一致的方法
需求:我有一个Pandas DataFrame,想要为每个'Kanton'生成一张饼图,展示'Kat'字段值的出现频率。但不是所有'Kat'值都会出现在每个'Kanton'中,需要让相同的'Kat'值始终对应相同的颜色。
原始代码:
import pandas as pd import matplotlib.pyplot as plt df = pd.DataFrame({'Kanton': ['AG', 'AG', 'AG', 'AG', 'AG', 'AG', 'AG', 'ZH', 'ZH', 'ZH', 'ZH', 'ZH', 'ZH'], 'Kat': [1,4,5,6,1,4,2,3,3,3,2,5,1]}) kantone=df['Kanton'].unique() for i in kantone: print(i) df_n=df.loc[df['Kanton'] == i, 'Kat'].value_counts() print(df_n) #define data data = df_n labels = df_n.index.values #plot plt.pie(data, labels = labels, autopct='%.0f%%') plt.title("Kanton " + i) plt.show()
解决方法:
核心思路是提前为所有可能的Kat值分配固定颜色,绘制每个饼图时从这个全局颜色映射中提取对应颜色,就能保证同一Kat值颜色一致。
步骤如下:
- 先获取DataFrame中所有唯一的Kat值,创建一个颜色映射字典(键为Kat值,值为对应的颜色)
- 遍历每个Kanton时,根据当前Kanton包含的Kat值,从颜色映射中筛选出对应的颜色列表
- 绘制饼图时通过
colors参数传入该颜色列表
修改后的完整代码:
import pandas as pd import matplotlib.pyplot as plt from matplotlib import cm df = pd.DataFrame({'Kanton': ['AG', 'AG', 'AG', 'AG', 'AG', 'AG', 'AG', 'ZH', 'ZH', 'ZH', 'ZH', 'ZH', 'ZH'], 'Kat': [1,4,5,6,1,4,2,3,3,3,2,5,1]}) # 获取所有唯一的Kat值,创建全局颜色映射 all_kats = df['Kat'].unique() # 使用matplotlib的colormap生成颜色,也可以手动指定颜色列表 cmap = cm.get_cmap('tab10', len(all_kats)) color_map = {kat: cmap(i) for i, kat in enumerate(all_kats)} kantone = df['Kanton'].unique() for kanton in kantone: print(kanton) df_n = df.loc[df['Kanton'] == kanton, 'Kat'].value_counts() print(df_n) data = df_n labels = df_n.index.values # 提取当前Kanton中Kat值对应的颜色 colors = [color_map[kat] for kat in labels] plt.pie(data, labels=labels, autopct='%.0f%%', colors=colors) plt.title(f"Kanton {kanton}") plt.show()
说明:
- 这里用
tab10色系生成颜色,你也可以替换成其他colormap(比如viridis),或者手动定义颜色列表(如['#FF0000', '#00FF00', ...]) - 颜色映射字典
color_map会把每个Kat值和固定颜色绑定,不管该Kat值出现在哪个Kanton中,颜色都不会变 - 循环中通过列表推导式
[color_map[kat] for kat in labels]获取当前饼图需要的颜色列表,确保只包含当前Kanton存在的Kat值对应的颜色
内容的提问来源于stack exchange,提问作者ghxk
相关产品推荐
相关产品推荐

