You need to enable JavaScript to run this app. 用matplotlib绘制字典多子柱状图时'numpy.ndarray'无bar属性报错如何解决
优惠活动
大模型
产品
解决方案
定价
更多

用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.24 09:36:02