使用matplotlib绘制大量整数直方图时触发颜色参数不匹配报错
问题根源
你传入plt.hist()的values是嵌套列表结构:你将字典的每个值单独转成列表存入values,matplotlib会把一级列表中的每个元素识别为独立数据集,最终识别出9342个数据集,因此要求传入和数据集数量一致的颜色值,和你要绘制整数分布直方图的需求不匹配。另外你的代码里还有三处隐性问题:
- 排序后的字典没有赋值回原变量,属于无效代码
- 旧版本的
normed参数在新版matplotlib中已经被废弃,会触发警告 - 普通Python列表没有
.min()/.max()方法,直接调用会触发属性错误
修正方案
如果你的需求是统计字典存储的所有整数的整体频率分布,只需要把嵌套的values展平为一维列表即可,修正后的完整代码如下:
import matplotlib.pyplot as plt # 按值频率排序列表,补上变量赋值 date_frequency = dict(sorted(date_frequency.items(), key=lambda item: item[1])) keys = list(date_frequency.keys()) # 展平所有字典值为一维整数列表,不要生成嵌套结构 values = [] for val_group in date_frequency.values(): values.extend(list(val_group)) fig_per_date = plt.figure() per_date = fig_per_date.add_subplot(111) counts, bins, patches = per_date.hist( values, bins=len(keys), density=False, # 替换已废弃的normed参数 color='g', linewidth=0 ) # 普通Python列表使用内置min/max计算坐标范围 plt.gca().set_xlim(min(values), max(values)) plt.show()
如果你确实需要按字典分组绘制多数据集的分组/堆叠直方图,不需要逐个指定9342个颜色,只要去掉手动传入的color参数,matplotlib会自动调用内置颜色循环为每个数据集分配颜色,示例修改如下:
# 多数据集模式下移除color参数即可自动分配颜色 counts, bins, patches = per_date.hist( values, bins=len(keys), density=False, linewidth=0 )
内容的提问来源于stack exchange,提问作者Niloufar Modir
相关产品推荐
相关产品推荐

