Matplotlib subplots 轴对象解包错误解析与修正

Matplotlib subplots 轴对象解包错误解析与修正

本文旨在解决在使用 matplotlib.pyplot.subplots 创建多子图时,因轴对象解包不当导致的 AttributeError: ‘numpy.ndarray’ object has no attribute ‘bar’ 错误。通过详细分析 subplots 的返回值机制,本文将展示如何正确地解包和访问单个轴对象,从而有效避免此类常见的绘图问题,确保Seaborn等库的绘图函数能够正确调用轴方法。

在使用 matplotlib.pyplot 和 seaborn 进行数据可视化时,attributeerror: ‘numpy.ndarray’ object has no attribute ‘bar’ 是一个常见的错误,尤其是在创建包含多个子图的图形布局时。这个错误通常发生在尝试在一个 numpy.ndarray 类型的对象上调用绘图方法(如 bar、countplot 等)时,而这些方法实际上应该在 matplotlib.axes.axes 对象上调用。问题的根源在于对 plt.subplots 返回值的误解和不正确的解包操作。

理解 plt.subplots 的返回值

plt.subplots 函数用于创建一个包含多个子图的图形。它的返回值是一个元组,通常包含两个元素:

fig: 一个 matplotlib.figure.Figure 对象,代表整个图形窗口。ax: 一个或一组 matplotlib.axes.Axes 对象,代表图中的一个或多个子图(坐标系)。

关键在于 ax 的类型取决于你如何调用 plt.subplots:

单个子图: 当 nrows=1 和 ncols=1 (或省略这些参数,因为它们默认都是1) 时,ax 将直接是一个 matplotlib.axes.Axes 对象。

fig, ax = plt.subplots() # ax 是一个 Axes 对象

多个子图 (一维排列): 当 nrows > 1 且 ncols = 1,或 nrows = 1 且 ncols > 1 时,ax 将是一个 numpy.ndarray 对象,其中包含多个 Axes 对象。

fig, axes = plt.subplots(nrows=2, ncols=1) # axes 是一个包含两个 Axes 对象的 NumPy 数组fig, axes = plt.subplots(nrows=1, ncols=2) # axes 是一个包含两个 Axes 对象的 NumPy 数组

多个子图 (二维网格): 当 nrows > 1 且 ncols > 1 时,ax 将是一个二维的 numpy.ndarray 对象,其形状与 (nrows, ncols) 对应。

fig, axes = plt.subplots(nrows=2, ncols=2) # axes 是一个 2x2 的 NumPy 数组

错误示例分析

考虑以下导致 AttributeError 的代码片段:

import matplotlib.pyplot as pltimport seaborn as snsimport pandas as pdimport numpy as np# 假设 dataset 是一个 DataFrame,包含 'class_label' 列# 这里创建一个示例数据集data = {'class_label': np.random.choice(['A', 'B', 'C', 'D'], 100)}dataset = pd.DataFrame(data)# 错误的代码示例fig, (ax1) = plt.subplots(ncols=2, figsize=(25, 7.5), dpi=100)fig.suptitle(f'Counts of Observation Labels in ciciot_2023 ', fontsize=25)sns.countplot(x="class_label", palette="OrRd_r", data=dataset, order=dataset['class_label'].value_counts().index, ax=ax1)ax1.set_title('ciciot2023', fontsize=20)ax1.set_xlabel('label', fontsize=15)ax1.set_ylabel('count', fontsize=15)ax1.tick_params(labelrotation=90)plt.show()

在这个例子中,plt.subplots(ncols=2, …) 明确要求创建两个列的子图。根据上面的解释,plt.subplots 会返回一个 fig 对象和一个包含两个 Axes 对象的 numpy.ndarray。然而,代码中使用了 fig, (ax1) = … 这样的解包方式。这里的 (ax1) 仅仅是给变量 ax1 加上了括号,它并没有实现数组的解包。因此,ax1 变量实际上接收到的是整个 numpy.ndarray 对象,而不是第一个 Axes 对象。

当 sns.countplot 函数尝试在 ax=ax1 上绘图时,它会内部调用 ax1.bar 方法。但由于 ax1 是一个 numpy.ndarray 对象,它并没有 bar 这个方法,从而引发 AttributeError: ‘numpy.ndarray’ object has no attribute ‘bar’。

正确的解包与修正方法

要解决这个问题,关键在于正确地解包 plt.subplots 返回的 Axes 数组。当 ncols=2 时,你需要提供两个变量来接收这两个 Axes 对象。

import matplotlib.pyplot as pltimport seaborn as snsimport pandas as pdimport numpy as np# 假设 dataset 是一个 DataFrame,包含 'class_label' 列data = {'class_label': np.random.choice(['A', 'B', 'C', 'D'], 100)}dataset = pd.DataFrame(data)# 正确的代码示例# 当 ncols=2 时,需要解包为两个 Axes 对象,例如 (ax1, ax2)fig, (ax1, ax2) = plt.subplots(ncols=2, figsize=(25, 7.5), dpi=100)fig.suptitle(f'Counts of Observation Labels in ciciot_2023 ', fontsize=25)# 现在 ax1 是一个 Axes 对象,可以正确地传递给 seabornsns.countplot(x="class_label", palette="OrRd_r", data=dataset, order=dataset['class_label'].value_counts().index, ax=ax1)ax1.set_title('ciciot2023', fontsize=20)ax1.set_xlabel('label', fontsize=15)ax1.set_ylabel('count', fontsize=15)ax1.tick_params(labelrotation=90)# 如果有第二个子图,可以在 ax2 上进行绘图# sns.countplot(x="another_label", data=dataset, ax=ax2)# ax2.set_title('Another Plot')plt.tight_layout(rect=[0, 0.03, 1, 0.95]) # 调整布局以避免标题重叠plt.show()

通过将 fig, (ax1) 修改为 fig, (ax1, ax2),我们正确地将 plt.subplots 返回的 Axes 数组解包为两个独立的 Axes 对象 ax1 和 ax2。这样,ax1 就不再是 numpy.ndarray,而是真正的 matplotlib.axes.Axes 对象,其上所有绘图方法(如 bar)都可正常调用。

注意事项与最佳实践

匹配解包数量: 始终确保你用于解包 Axes 对象的变量数量与 plt.subplots 创建的子图数量相匹配。plt.subplots(nrows=1, ncols=1) -> fig, ax = plt.subplots()plt.subplots(nrows=1, ncols=N) 或 plt.subplots(nrows=N, ncols=1) -> fig, axes = plt.subplots(…),然后通过 axes[0], axes[1] 等访问,或者 fig, (ax1, ax2, …, axN) = plt.subplots(…) 进行解包。plt.subplots(nrows=N, ncols=M) -> fig, axes = plt.subplots(…),然后通过 axes[i, j] 访问。灵活使用索引: 当子图数量较多或布局复杂时,使用 axes 数组的索引(如 axes[0] 或 axes[1, 0])来访问特定的 Axes 对象通常比解包到大量单独的变量更方便。squeeze=False: 如果你总是希望 ax 返回一个二维数组,即使是单行单列的布局,可以使用 plt.subplots(…, squeeze=False)。这可以使代码在不同布局下更具一致性,但需要始终使用索引访问 ax[0, 0]。导入规范: 习惯性地导入 matplotlib.pyplot 为 plt,seaborn 为 sns,以保持代码的简洁性和可读性。

总结

AttributeError: ‘numpy.ndarray’ object has no attribute ‘bar’ 错误通常源于对 matplotlib.pyplot.subplots 返回值(特别是 Axes 对象)的误解和不当解包。通过理解 plt.subplots 如何根据 nrows 和 ncols 参数返回单个 Axes 对象或 Axes 对象的 numpy.ndarray,并采用正确的解包或索引访问方式,可以有效地避免此类错误,确保绘图代码的顺利执行。始终记住,绘图函数如 sns.countplot 需要一个 matplotlib.axes.Axes 对象作为其 ax 参数。

以上就是Matplotlib subplots 轴对象解包错误解析与修正的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1376228.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
Python Turtle图形库:解决GIF形状下点击事件失效的问题
上一篇 2025年12月14日 15:43:39
SQLAlchemy异步会话与PostgreSQL连接池管理深度解析
下一篇 2025年12月14日 15:43:49

相关推荐

  • 微博pc版和手机版什么区别_微博pc版与手机版功能对比分析

    微博pc版和手机版什么区别_微博pc版与手机版功能对比分析微博pc版和手机版什么区别_微博pc版与手机版功能对比分析微博pc版和手机版什么区别_微博pc版与手机版功能对比分析微博pc版和手机版什么区别_微博pc版与手机版功能对比分析

    微博PC版与手机版在界面布局、功能设置、链接结构和使用场景上存在明显差异。1、PC版采用三栏式布局,信息密度高,支持复杂操作如多图上传和定时发布;2、手机版为单栏垂直滚动设计,界面简洁,集成拍照上传、地理位置等移动专属功能;3、PC端链接结构复杂,手机端多用短链或weibo://协议,跨设备访问时可…

    2026年9月28日 • 用户投稿
    100
  • 微信视频号如何变现?微信视频号如何变现有几种变现方式

    微信视频号如何变现?微信视频号如何变现有几种变现方式微信视频号如何变现?微信视频号如何变现有几种变现方式微信视频号如何变现?微信视频号如何变现有几种变现方式微信视频号如何变现?微信视频号如何变现有几种变现方式

    随着微信用户数量的不断攀升,微信视频号逐渐成为了一个热门的社交平台。许多内容创作者通过微信视频号吸引了大量粉丝,但如何将这些粉丝转化为实际收益,成为了大家关注的焦点。本文将为大家揭秘微信视频号如何变现的高效盈利之道。 一、了解微信视频号变现的途径 1. 广告变现:广告是目前微信视频号变现的主要途径之…

    2026年9月28日 • 用户投稿
    100
  • JNA高级教程:如何高效映射C语言嵌套结构体与联合体

    JNA高级教程:如何高效映射C语言嵌套结构体与联合体JNA高级教程:如何高效映射C语言嵌套结构体与联合体JNA高级教程:如何高效映射C语言嵌套结构体与联合体JNA高级教程:如何高效映射C语言嵌套结构体与联合体

    本教程深入探讨了JNA在Java与C语言之间进行复杂数据类型映射的机制,特别是针对包含嵌套结构体和联合体(Union)的场景。文章通过分析一个实际的错误案例,详细阐述了JNA对Java类继承Structure或Union的严格要求,并提供了两种核心解决方案:一是直接构建与C语言定义精确对应的JNA映…

    2026年9月28日 • 用户投稿
    100
  • JNA高级教程:深入理解原生结构体与联合体映射

    JNA高级教程:深入理解原生结构体与联合体映射JNA高级教程:深入理解原生结构体与联合体映射JNA高级教程:深入理解原生结构体与联合体映射JNA高级教程:深入理解原生结构体与联合体映射

    本教程详细探讨了JNA在与原生库交互时,如何正确映射包含嵌套结构体或联合体的复杂数据类型。文章首先分析了IllegalArgumentException的常见原因——非Structure类型字段导致JNA无法确定原生大小,随后提供了两种解决方案:一是直接通过JNA的Structure和Union类精…

    2026年9月28日 • 用户投稿
    100
  • Java中List of Lists按指定列排序与查找教程

    Java中List of Lists按指定列排序与查找教程Java中List of Lists按指定列排序与查找教程Java中List of Lists按指定列排序与查找教程Java中List of Lists按指定列排序与查找教程

    本教程详细介绍了如何在Java中处理List<List>数据结构,以实现按指定“列”进行排序,并在此基础上高效查找包含特定值的“行”。文章通过自定义Comparator来对行数据进行比较和排序,并提供了识别目标列索引的策略,从而解决了在复杂嵌套列表中进行数据组织和检索的常见挑战。 1. …

    2026年9月28日 • 用户投稿
    200
  • 传小米17系列仅标准版和Ultra版有国际版 背屏特供国内

    传小米17系列仅标准版和Ultra版有国际版 背屏特供国内传小米17系列仅标准版和Ultra版有国际版 背屏特供国内传小米17系列仅标准版和Ultra版有国际版 背屏特供国内传小米17系列仅标准版和Ultra版有国际版 背屏特供国内

    近日,有博主透露,小米17系列中仅有标准版和ultra版将推出国际版本,而配备背屏的pro系列则为中国市场专属。 小米17 Pro系列 根据CNMO掌握的消息,小米将于9月25日19点举行新品发布会,届时将发布小米17系列、小米平板8系列等多款新产品。其中,小米17 Pro系列新增“妙享背屏”功能,…

    2026年9月28日 • 用户投稿
    000
  • 豆瓣APP怎么看小组里自己的帖子_小组内个人发帖查找方法

    豆瓣APP怎么看小组里自己的帖子_小组内个人发帖查找方法豆瓣APP怎么看小组里自己的帖子_小组内个人发帖查找方法豆瓣APP怎么看小组里自己的帖子_小组内个人发帖查找方法豆瓣APP怎么看小组里自己的帖子_小组内个人发帖查找方法

    通过个人主页动态可直接查看按时间倒序排列的小组发帖与回复;2. 在小组内使用搜索功能输入用户名或关键词筛选个人发帖;3. 借助爱豆搜等外部工具输入ID和关键词高效检索历史帖子。 如果您在豆瓣小组中发布了多个帖子,但无法快速找到自己之前的发言记录,可能是因为缺少直接的“我的帖子”聚合功能。以下是几种在…

    2026年9月28日 • 用户投稿
    000
  • 通过MySQL开发实现数据可视化与报表分析的项目经验分享

    通过MySQL开发实现数据可视化与报表分析的项目经验分享通过MySQL开发实现数据可视化与报表分析的项目经验分享通过MySQL开发实现数据可视化与报表分析的项目经验分享通过MySQL开发实现数据可视化与报表分析的项目经验分享

    在当今数据大爆炸的时代,数据分析和数据可视化成为了企业决策的重要工具。作为一名开发人员,在MySQL数据库上开发实现数据可视化与报表分析的项目经验,我想和大家分享一下。 首先,我想提到的是选择MySQL作为数据库的原因。MySQL是一款开源的关系型数据库管理系统,它具有稳定性高、性能优秀以及可扩展性…

    2026年9月28日 • 用户投稿
    100
  • 怎么删除微信公众号_微信公众号内容与账号删除教程

    怎么删除微信公众号_微信公众号内容与账号删除教程怎么删除微信公众号_微信公众号内容与账号删除教程怎么删除微信公众号_微信公众号内容与账号删除教程怎么删除微信公众号_微信公众号内容与账号删除教程

    删除微信公众号内容或账号需谨慎操作。删除文章后,用户通过原链接只能看到“内容已删除”提示,但链接仍存在;注销账号则需满足无违规、无资金未结清等条件,并经历15天冷静期,一旦完成,所有数据将永久清空,名称可能被释放,且无法恢复。批量删除文章需手动逐页操作,效率较低,建议提前分类管理。操作前应备份重要内…

    2026年9月28日 • 用户投稿
    100
  • 整理桌面图标win10方法

    整理桌面图标win10方法整理桌面图标win10方法整理桌面图标win10方法整理桌面图标win10方法

    想要让自己的windows 10桌面更加整洁美观,但又不知道如何下手?别担心,接下来就为大家详细介绍如何在win10系统中整理桌面图标,让你的桌面焕然一新! 如何让Win10桌面图标整齐排列: 首先,在桌面上单击鼠标右键,然后选择顶部菜单中的“查看”选项。 在弹出的菜单中,你可以看到诸如“自动排列图…

    2026年9月28日 • 用户投稿
    100
  • 巴别塔圣歌笔记本答案怎么获取 笔记本谜题详细解答

    巴别塔圣歌笔记本答案怎么获取 笔记本谜题详细解答巴别塔圣歌笔记本答案怎么获取 笔记本谜题详细解答巴别塔圣歌笔记本答案怎么获取 笔记本谜题详细解答巴别塔圣歌笔记本答案怎么获取 笔记本谜题详细解答

    游戏第一章的初始谜题涉及“开关门”的符号排列,需将开关符号置于左侧,门符号放在右侧。完成此步骤后,进入水阀控制系统,正确操作顺序为“上、上、下、上、下”,可成功关闭左侧的三个出水口。 第二章谜题复杂度上升,首先需解开“隐藏、孩童”与“寻找、孩童”两组关键词。随后面对“推倒、石柱、道路”的图示组合,以…

    2026年9月28日 • 用户投稿
    100
  • 十一小长假肆意畅玩!华硕RTX5060甜品卡全力助能

    十一小长假肆意畅玩!华硕RTX5060甜品卡全力助能十一小长假肆意畅玩!华硕RTX5060甜品卡全力助能十一小长假肆意畅玩!华硕RTX5060甜品卡全力助能十一小长假肆意畅玩!华硕RTX5060甜品卡全力助能

    十一假期的脚步渐近,想想即将到来的悠闲小长假,小伙伴们准备怎样度过呢?宅家开启电竞狂欢才是明智之选!在这个假期,有诸多佳作等你来战,准备好投身一场热血沸腾的电竞之旅了吗~ 想要顺利畅享游戏大作带来的极致体验,DLSS技术的支持至关重要。DLSS是一套创新性的神经网络渲染技术,借助AI提升帧率、降低延…

    2026年9月28日 • 用户投稿
    400
  • 显卡散热风扇的轴承技术如何影响噪音与寿命?

    显卡风扇的噪音和寿命主要由轴承类型决定,含油轴承成本低但寿命短、易变吵;滚珠轴承寿命长、稳定性好,但可能有轻微机械噪音;流体动压轴承(FDB/HDB)静音效果最佳、寿命最长,是高端显卡首选。此外,风扇叶片设计、电机品质、散热结构、安装方式及线圈啸叫等也影响整体噪音。通过定期除尘、优化风道、自定义风扇…

    2026年9月27日
    100
  • iPhone 18 Pro超前曝光:2nm心片加持 屏下Face ID无望

    iPhone 18 Pro超前曝光:2nm心片加持 屏下Face ID无望iPhone 18 Pro超前曝光:2nm心片加持 屏下Face ID无望iPhone 18 Pro超前曝光:2nm心片加持 屏下Face ID无望iPhone 18 Pro超前曝光:2nm心片加持 屏下Face ID无望

    虽然距离iphone 18 pro和iphone 18 pro max正式亮相还有一年时间,但关于这两款机型的传闻已陆续浮现。据cnmo整理外媒最新爆料消息,以下是一些备受关注的潜在升级亮点: iPhone 17 Pro系列 灵动岛或将缩小 有知名数码博主透露,iPhone 18标准版及Pro系列有…

    2026年9月27日 • 用户投稿
    000
  • mysql中explain用法

    mysql中explain用法mysql中explain用法mysql中explain用法mysql中explain用法

    MySQL中的EXPLAIN用法详解及代码示例 在MySQL中,EXPLAIN是一个非常有用的工具,用于分析查询语句的执行计划。通过使用EXPLAIN,我们可以了解到MySQL数据库是如何执行查询语句的,从而帮助我们优化查询性能。 EXPLAIN的基本语法如下: EXPLAIN SELECT 列名 …

    2026年9月27日 • 用户投稿
    300
  • Java Swing GUI:构建交互式逻辑门(AND门示例)

    Java Swing GUI:构建交互式逻辑门(AND门示例)Java Swing GUI:构建交互式逻辑门(AND门示例)Java Swing GUI:构建交互式逻辑门(AND门示例)Java Swing GUI:构建交互式逻辑门(AND门示例)

    本文详细介绍了如何使用Java Swing构建一个简单的AND逻辑门GUI应用。通过结合JCheckBox作为输入和JLabel作为视觉输出,并利用ChangeListener监听组件状态变化,实现当两个复选框都被选中时显示“绿色”,否则显示“红色”的功能。教程涵盖了组件创建、事件监听以及将自定义面…

    2026年9月27日 • 用户投稿
    200
  • laravel怎么在 Eloquent 中使用 DB::raw() 执行原生表达式_laravel Eloquent DB::raw原生表达式使用方法

    laravel怎么在 Eloquent 中使用 DB::raw() 执行原生表达式_laravel Eloquent DB::raw原生表达式使用方法laravel怎么在 Eloquent 中使用 DB::raw() 执行原生表达式_laravel Eloquent DB::raw原生表达式使用方法laravel怎么在 Eloquent 中使用 DB::raw() 执行原生表达式_laravel Eloquent DB::raw原生表达式使用方法laravel怎么在 Eloquent 中使用 DB::raw() 执行原生表达式_laravel Eloquent DB::raw原生表达式使用方法

    在 Laravel Eloquent 中可使用 DB::raw() 实现复杂查询,1. 在 select 中添加计算字段如 COUNT;2. 用 whereRaw 配合参数绑定安全过滤数据;3. 通过 orderByRaw 按表达式排序;4. 使用 havingRaw 对聚合结果筛选;5. 注意避免…

    2026年9月27日 • 用户投稿
    1100
  • Word文档怎么插入可以打勾的方框_Word可勾选复选框插入与使用教程

    Word文档怎么插入可以打勾的方框_Word可勾选复选框插入与使用教程Word文档怎么插入可以打勾的方框_Word可勾选复选框插入与使用教程Word文档怎么插入可以打勾的方框_Word可勾选复选框插入与使用教程Word文档怎么插入可以打勾的方框_Word可勾选复选框插入与使用教程

    1、通过启用“开发工具”可插入可点击打勾的复选框控件;2、使用Wingdings 2字体插入静态方框与对勾符号实现手动标记;3、利用表格单元格模拟方框并输入对勾符号用于打印或数字勾选;4、结合ActiveX控件与VBA实现高级交互功能,需保存为.docm格式。 如果您需要在Word文档中创建可打勾的…

    2026年9月27日 • 用户投稿
    100
  • Kafka批处理监听器中反序列化异常的重试策略与实现

    Kafka批处理监听器中反序列化异常的重试策略与实现Kafka批处理监听器中反序列化异常的重试策略与实现Kafka批处理监听器中反序列化异常的重试策略与实现Kafka批处理监听器中反序列化异常的重试策略与实现

    本文详细介绍了如何在Spring Kafka批处理监听器中有效处理并重试反序列化异常。通过修改DefaultErrorHandler以取消对DeserializationException的致命标记,并结合监听器内部对带有null载荷的消息进行异常信息提取和重新抛出,实现对整个批次消息的重试,从而提…

    2026年9月27日 • 用户投稿
    100
  • Real RGB OLED 屏手机将量产上市 猜猜是华为还是小米?

    Real RGB OLED 屏手机将量产上市 猜猜是华为还是小米?Real RGB OLED 屏手机将量产上市 猜猜是华为还是小米?Real RGB OLED 屏手机将量产上市 猜猜是华为还是小米?Real RGB OLED 屏手机将量产上市 猜猜是华为还是小米?

    供应链消息:real rgb oled屏幕即将量产,手机显示技术迎来革新! 手机屏幕显示效果有望迎来重大突破!据数码闲聊站爆料,Real RGB OLED屏幕将于今年正式量产。该屏幕采用完整RGB子像素排列,每个子像素独立发光,显著提升清晰度,并有效降低像素密度损失,在同分辨率下显示效果可与LCD屏…

    2026年9月27日 • 用户投稿
    000

发表回复

登录后才能评论
关注微信