用matplotlib绘制字典多子柱状图时'numpy.ndarray'无bar属性报错如何解决
问题核心原因
执行plt.subplots(nrows=3, ncols=1)时,返回的ax变量是形状为(3,)的numpy数组,数组内每个元素才是对应位置的单个坐标轴实例。你直接对整个数组调用.bar()方法,自然会触发'numpy.ndarray' object has no attribute 'bar'的报错。
解决步骤
- 遍历循环时,根据当前循环索引
i,从ax数组中取出对应位置的单个坐标轴对象,再调用绘图方法。 - 直接使用每个序列自带的索引作为柱状图的x轴值,不需要手动生成range序列,避免索引和实际数据错位。
- 为每个子图添加对应字典键名的标题,方便区分不同序列。
- 动态根据字典内的序列总数设置子图数量,避免硬编码nrows导致的和字典长度不匹配问题。
完整可运行代码
import matplotlib.pyplot as plt import pandas as pd # 复现与题目结构完全一致的示例数据 data = { 'df_A': pd.Series([0, 0, 0, 0, 0, 14343, 14343, 0, 8107, 11, 0, 2276, 0]), 'df_B': pd.Series([0, 0, 0, 6692]), 'df_C': pd.Series([323059, 0, 0, 0]) } # 按字典内序列总数动态创建垂直排列的子图 fig, ax = plt.subplots(nrows=len(data), ncols=1, figsize=(8, 9)) for i, key in enumerate(data): # 取出当前索引对应的独立坐标轴 current_ax = ax[i] # 绘制柱状图:使用序列自带索引为x轴,序列值为柱高 current_ax.bar(x=data[key].index, height=data[key].values) # 为子图添加对应序列的标题 current_ax.set_title(f'序列 {key} 柱状图') # 自动调整布局,避免元素重叠 fig.tight_layout() plt.show()
灵活适配说明
- 代码会自动根据字典长度匹配子图数量,后续如果字典内新增或删除序列,不需要手动修改
subplots的参数。 - 由于不同序列长度存在差异,每个子图会自动适配对应序列的x轴范围,不会出现短序列柱子被挤在边角的问题。
- 如果需要统一所有子图的x轴尺度,可以在循环中为每个坐标轴添加统一的x轴范围设置,例如
current_ax.set_xlim(-0.5, 12.5),保证所有子图的横向刻度完全对齐。
内容的提问来源于stack exchange,提问作者Sasa
相关产品推荐
相关产品推荐

