You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于嵌套字典绘制带数值标签的分组柱状图

子键不一致的嵌套字典柱状图实现方案

现有如下嵌套字典,其中每个子字典的键(水果类别)并不完全一致:

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()

关键逻辑说明

  1. 固定颜色映射:通过集合推导式收集所有唯一水果类别,提前为每个类别绑定固定颜色,确保同一水果在不同分组颜色统一。
  2. 动态位置计算:针对每个分组的水果数量,自动计算柱子的位置偏移量,保证同组内柱子居中对齐,避免重叠。
  3. 图例去重:利用字典去重特性,确保每个水果在图例中仅显示一次。
  4. 数值标签:通过ax.text在柱子顶部添加对应数值,偏移量可根据数据范围调整。

预期效果

x轴为分组1、2、3,每个分组下显示该组存在的水果柱子,所有apples柱子为统一红色,bananas为黄色,以此类推;每个柱子上方标注对应数量值,图例清晰展示水果与颜色的对应关系。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 05:25:24