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

Python中如何绘制值为set类型的字典的直方图并解决报错

问题描述

我有一个值为set类型的字典,想要为其绘制直方图。我尝试将字典内容转换为列表,但仍然出现和set相关的报错,使用的实现代码如下:

#Plot histogram for the first 10
keys = [key for key in frequency.keys()]
val = [value for value in frequency.values()]
values = list(val)
print(type(keys))
print(type(values))

fig, ax = plt.subplots()
ax.bar(np.arange(len(keys)) - 0.2, [value[0] for value in values],
   width=0.2, color='b', align='center')
ax.bar(np.arange(len(keys)) + 0.2,
   [value[1] if len(value) == 2 else 0 for value in values],
   width=0.2, color='g', align='center')
ax.set_xticklabels(keys)
ax.set_xticks(np.arange(len(keys)))
plt.show()

运行上述代码后抛出错误,错误截图如下:
set类型下标索引报错截图

报错原因
  • 你只把存放所有值的外层容器转成了列表,但列表内的每个元素依然是set类型
  • set是无序不支持下标索引的结构,代码中value[0]、value[1]的下标取值操作对set类型无效,因此触发'set' object is not subscriptable报错
修复方案

在取值绘图前,先把每个set类型的value转为支持索引的list/tuple类型即可,修正后的核心代码如下:

keys = list(frequency.keys())
# 遍历所有value,将每个set转为list后再存入集合
values = [list(value) for value in frequency.values()]

fig, ax = plt.subplots()
ax.bar(np.arange(len(keys)) - 0.2, [value[0] for value in values],
   width=0.2, color='b', align='center')
ax.bar(np.arange(len(keys)) + 0.2,
   [value[1] if len(value) == 2 else 0 for value in values],
   width=0.2, color='g', align='center')
ax.set_xticks(np.arange(len(keys)))
ax.set_xticklabels(keys)
plt.show()

注意:set本身是无序结构,直接转list后的元素顺序不固定,如果对两组柱子对应的数值匹配顺序有要求,建议在转list时手动指定排序规则,避免数值和图例对应错位。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 06:15:35