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是无序不支持下标索引的结构,代码中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
相关产品推荐
相关产品推荐

