如何基于嵌套字典绘制带数值标签的分组柱状图
子键不一致的嵌套字典柱状图实现方案
现有如下嵌套字典,其中每个子字典的键(水果类别)并不完全一致:
data_to_try = { 1: {'apples': 3, 'bananas':5, 'kiwis':9}, 2: {'apples':9, 'oranges':3, 'kiwis':1}, 3: {'apples': 6, 'watermelon':9} }
需要实现以下需求的柱状图:
- 每个水果类别对应固定颜色
- 每个柱体上方添加数值标签
- 适配子字典键不完全一致的场景
原Stack Overflow方案仅适用于子键完全一致的情况,无法满足需求,以下是适配方案:
完整实现代码
import matplotlib.pyplot as plt import numpy as np # 目标数据 data_to_try = { 1: {'apples': 3, 'bananas':5, 'kiwis':9}, 2: {'apples':9, 'oranges':3, 'kiwis':1}, 3: {'apples': 6, 'watermelon':9} } # 收集所有唯一水果类别,并绑定固定颜色 fruit_categories = sorted({fruit for sub_dict in data_to_try.values() for fruit in sub_dict.keys()}) color_map = { 'apples': '#ff6b6b', 'bananas': '#feca57', 'kiwis': '#48dbfb', 'oranges': '#ff9ff3', 'watermelon': '#1dd1a1' } # 获取x轴分组标签 group_labels = list(data_to_try.keys()) num_groups = len(group_labels) base_width = 0.25 # 单根柱子宽度,可按需调整 fig, ax = plt.subplots(figsize=(8, 5)) # 遍历每个分组绘制柱子 for group_idx, group_key in enumerate(group_labels): group_data = data_to_try[group_key] num_fruits = len(group_data) # 计算同组内柱子的位置偏移,保证分组内柱子居中对齐 offsets = np.linspace(-(num_fruits-1)*base_width/2, (num_fruits-1)*base_width/2, num_fruits) # 绘制当前分组的每根柱子并添加数值标签 for fruit_idx, (fruit, count) in enumerate(group_data.items()): x_pos = group_idx + offsets[fruit_idx] bar = ax.bar(x_pos, count, width=base_width, color=color_map[fruit], label=fruit if group_idx == 0 else "") # 在柱子顶部添加数值标签 ax.text(x_pos, count + 0.2, str(count), ha='center', fontsize=10) # 设置x轴刻度 ax.set_xticks(np.arange(num_groups)) ax.set_xticklabels(group_labels) # 去重图例(避免同一水果重复显示) handles, labels = plt.gca().get_legend_handles_labels() by_label = dict(zip(labels, handles)) ax.legend(by_label.values(), by_label.keys()) # 设置轴标签与标题 ax.set_xlabel('分组') ax.set_ylabel('数量') ax.set_title('各分组水果数量统计') plt.tight_layout() plt.show()
关键逻辑说明
- 固定颜色映射:通过集合推导式收集所有唯一水果类别,提前为每个类别绑定固定颜色,确保同一水果在不同分组颜色统一。
- 动态位置计算:针对每个分组的水果数量,自动计算柱子的位置偏移量,保证同组内柱子居中对齐,避免重叠。
- 图例去重:利用字典去重特性,确保每个水果在图例中仅显示一次。
- 数值标签:通过
ax.text在柱子顶部添加对应数值,偏移量可根据数据范围调整。
预期效果
x轴为分组1、2、3,每个分组下显示该组存在的水果柱子,所有apples柱子为统一红色,bananas为黄色,以此类推;每个柱子上方标注对应数量值,图例清晰展示水果与颜色的对应关系。
内容的提问来源于stack exchange,提问作者ali
相关产品推荐
相关产品推荐

