如何绘制标签为字符串而非整数的系列饼图?
如何绘制带字符串分类标签的饼图
你当前代码会报错,核心原因是labels是字符串类型(比如'1b'、'4'),但你在取颜色时写了colors=[colors[k-1] for k in labels]——字符串没法和整数做减法运算,自然会抛出类型错误。下面给你两种可行的修正方案:
方案一:全局统一标签颜色(推荐)
给所有唯一的Kat标签建立索引映射,保证不同Kanton下的相同标签用同一种颜色,视觉上更统一:
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt df = pd.DataFrame({'Kanton': ['AG', 'AG', 'AG', 'AG', 'AG', 'AG', 'AG', 'ZH', 'ZH', 'ZH', 'ZH', 'ZH', 'ZH'], 'Kat': ['1b','4','5','6','1c','4','2a','3','3','3','2b','5','1d']}) # 给所有唯一的Kat标签建立索引映射,确保相同标签对应同一颜色 all_unique_kats = df['Kat'].unique() kat_index_map = {kat: idx for idx, kat in enumerate(all_unique_kats)} # 生成对应数量的颜色 colors = sns.color_palette("bright", len(all_unique_kats)) kantone = df['Kanton'].unique() for kanton in kantone: # 筛选当前州的标签并统计数量 current_data = df.loc[df['Kanton'] == kanton, 'Kat'].value_counts() labels = current_data.index.values # 通过映射获取每个标签对应的颜色 pie_colors = [colors[kat_index_map[kat]] for kat in labels] plt.pie(current_data, labels=labels, colors=pie_colors, autopct='%.0f%%') plt.title(f"Kanton {kanton}") plt.show()
方案二:仅当前州标签分配颜色
如果不需要全局统一颜色,只给当前Kanton的标签临时分配颜色,可以简化成这样:
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt df = pd.DataFrame({'Kanton': ['AG', 'AG', 'AG', 'AG', 'AG', 'AG', 'AG', 'ZH', 'ZH', 'ZH', 'ZH', 'ZH', 'ZH'], 'Kat': ['1b','4','5','6','1c','4','2a','3','3','3','2b','5','1d']}) kantone = df['Kanton'].unique() for kanton in kantone: current_data = df.loc[df['Kanton'] == kanton, 'Kat'].value_counts() labels = current_data.index.values # 仅针对当前州的标签数量生成颜色 pie_colors = sns.color_palette("bright", len(labels)) plt.pie(current_data, labels=labels, colors=pie_colors, autopct='%.0f%%') plt.title(f"Kanton {kanton}") plt.show()
这种方式下,不同Kanton里的相同标签可能会用不同颜色,适合不需要跨组对比的场景。
内容的提问来源于stack exchange,提问作者ghxk
相关产品推荐
相关产品推荐

