如何在 Python Shiny 中绘制 Matplotlib 直方图

如何在 python shiny 中绘制 matplotlib 直方图

本文详细介绍了在 Python Shiny 应用中正确渲染 Matplotlib 直方图的方法。核心在于理解 `render.plot` 如何处理 Matplotlib 对象的返回机制。我们探讨了两种有效的解决方案:通过隐式捕获当前 Matplotlib 图形或显式返回 `plt.hist()` 产生的图形艺术家集合,并提供了完整的代码示例和最佳实践建议,帮助开发者避免常见错误并高效地在 Shiny 中展示数据可视化

引言

Python Shiny 提供了一个强大的框架,用于构建交互式 Web 应用程序。结合 Matplotlib 这样的流行绘图库,开发者可以轻松地在 Shiny 应用中展示复杂的数据可视化。然而,对于初学者来说,在 Shiny 中集成 Matplotlib 图形时可能会遇到一些挑战,尤其是在处理像直方图这类返回特定元组而非直接图形对象的函数时。本文将深入探讨如何在 Python Shiny 中正确绘制 Matplotlib 直方图,并提供两种解决方案。

理解问题:为什么直接返回 plt.hist() 会出错?

在 Matplotlib 中,plt.scatter() 等函数通常会直接在当前活动的 Axes 上绘制图形,并且 render.plot 能够很好地捕获这些操作。然而,plt.hist() 函数的行为略有不同。它不仅绘制直方图,还会返回一个包含三个元素的元组:

n: 直方图每个 bin 的计数。bins: bin 的边界。patches: 构成直方图的矩形(bar)的 Matplotlib Patch 对象集合。

当尝试直接 return plt.hist(random_data()) 时,render.plot 接收到的是这个元组,而不是一个可以直接渲染的 Matplotlib Figure 或 Axes 对象,因此会导致渲染失败或错误。

立即学习“Python免费学习笔记(深入)”;

解决方案一:隐式捕获当前 Matplotlib 图形(推荐)

这是最简洁且推荐的方法,尤其适用于简单的绘图场景。@render.plot 装饰器具有一个特性:如果被装饰的函数没有明确返回任何 Matplotlib 对象(如 Figure 或 Axes),它会自动尝试捕获当前活动的 Matplotlib 图形并进行渲染。这意味着我们只需要调用 plt.hist() 来绘制图形,而无需返回其结果。

示例代码:

Supermoon Supermoon

The AI-Powered Inbox for Growing Teams

Supermoon 126 查看详情 Supermoon

import matplotlib.pyplot as pltimport numpy as npfrom shiny import App, ui, reactive, render# ... (app_ui 部分与原代码相同) ...def server(input, output, session):  @reactive.Calc  def random_data():    return np.random.rand(input.nr_of_observations())  @output  @render.plot  def my_scatter():    # plt.scatter() 隐式地在当前 Axes 上绘制    plt.scatter(random_data(), random_data())    # 无需返回任何内容,render.plot 会捕获当前图形  @output  @render.plot  def my_histogram():    # 只需调用 plt.hist() 进行绘制,无需返回其结果    plt.hist(random_data())    # render.plot 会自动捕获当前 Matplotlib 图形并渲染  @output  @render.text  def my_summary():    return str(random_data()) # 将 numpy 数组转换为字符串以便显示app = App(app_ui, server)

工作原理:当 my_histogram 函数被调用时,plt.hist(random_data()) 会在 Matplotlib 的当前活动 Figure 和 Axes 上绘制直方图。由于函数没有显式返回任何值,@render.plot 会检测到这一点,并自动获取当前活动的 Matplotlib Figure 对象,然后将其渲染到 Shiny UI 中。

解决方案二:返回特定的 Matplotlib 艺术家集合

虽然不如第一种方法通用,但这种方法也能够解决问题。它利用了 plt.hist() 返回元组中的第三个元素 patches,这是一个 BarContainer 对象,包含构成直方图的所有矩形(bar)的 Matplotlib Patch 对象集合。render.plot 有时能够直接渲染这类艺术家集合。

示例代码:

import matplotlib.pyplot as pltimport numpy as npfrom shiny import App, ui, reactive, render# ... (app_ui 部分与原代码相同) ...def server(input, output, session):  @reactive.Calc  def random_data():    return np.random.rand(input.nr_of_observations())  @output  @render.plot  def my_scatter():    plt.scatter(random_data(), random_data())  @output  @render.plot  def my_histogram():    # 返回 plt.hist() 返回元组的第三个元素 (patches)    return plt.hist(random_data())[2]  @output  @render.text  def my_summary():    return str(random_data())app = App(app_ui, server)

工作原理:此方法显式地从 plt.hist() 的返回值中提取 patches 集合并将其返回。@render.plot 能够识别并渲染这些 Matplotlib 艺术家对象。虽然这种方法有效,但它对 plt.hist() 的返回值结构有特定的依赖,不如第一种方法那样通用,特别是当你需要对整个 Figure 或 Axes 进行更复杂的控制时。

完整的 Shiny 应用示例

为了提供一个完整的上下文,以下是使用推荐的第一种解决方案的完整 Shiny 应用代码:

from shiny import App, ui, reactive, renderimport numpy as npimport matplotlib.pyplot as plt# 定义 UI 布局app_ui = ui.page_fluid(    ui.panel_title("My Shiny Test Application"),    ui.layout_sidebar(      ui.panel_sidebar(        ui.input_slider(          "nr_of_observations",           "Number of observations",          min = 0,          max = 100,          value = 30        )      ),      ui.panel_main(        ui.navset_tab(          ui.nav(            "Scatter",            ui.output_plot("my_scatter")          ),          ui.nav(            "Histogram",            ui.output_plot("my_histogram")          ),          ui.nav(            "Summary",            ui.output_text_verbatim("my_summary"),          )        )      )    )  )# 定义服务器逻辑def server(input, output, session):  # 响应式计算,生成随机数据  @reactive.Calc  def random_data():    return np.random.rand(input.nr_of_observations())  # 渲染散点图  @output  @render.plot  def my_scatter():    # 直接调用 Matplotlib 绘图函数,render.plot 会自动捕获当前图形    plt.scatter(random_data(), random_data())  # 渲染直方图  @output  @render.plot  def my_histogram():    # 直接调用 Matplotlib 绘图函数,render.plot 会自动捕获当前图形    plt.hist(random_data())  # 渲染摘要文本  @output  @render.text  def my_summary():    # 将 numpy 数组转换为字符串以便在文本输出中显示    return str(random_data())# 创建 Shiny 应用实例app = App(app_ui, server)

总结与最佳实践

在 Python Shiny 中使用 Matplotlib 绘制图形时,理解 render.plot 的工作机制至关重要。

隐式捕获是首选: 对于大多数简单的 Matplotlib 绘图,如 plt.scatter() 或 plt.hist(),最简洁且推荐的方法是直接调用绘图函数,而不要从 render.plot 装饰的函数中返回任何内容。render.plot 会自动捕获当前活动的 Matplotlib Figure 对象并进行渲染。显式创建和返回 Figure: 对于更复杂的场景,例如在同一个输出中绘制多个子图,或者需要对 Figure 和 Axes 对象进行精细控制时,最佳实践是显式地创建 Matplotlib Figure 和 Axes 对象,然后将 Figure 对象返回。例如:

@output@render.plotdef my_complex_plot():    fig, ax = plt.subplots()    ax.hist(random_data())    ax.set_title("My Custom Histogram")    return fig # 显式返回 Figure 对象

清理 Matplotlib 状态: 尽管 Shiny 的 render.plot 通常能很好地管理图形状态,但在某些复杂情况下,手动清理 Matplotlib 的全局状态(例如 plt.clf() 或 plt.close())可能有助于避免意外行为,尤其是在显式创建 Figure 时。

通过遵循这些指南,您将能够有效地在 Python Shiny 应用中集成和展示各种 Matplotlib 图形,为用户提供丰富的数据可视化体验。更多详细信息和高级用法,请参考 Shiny for Python 的官方文档。

以上就是如何在 Python Shiny 中绘制 Matplotlib 直方图的详细内容,更多请关注创想鸟其它相关文章!

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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月29日 04:55:15
下一篇 2025年11月29日 04:56:34

相关推荐

  • 区块链中STO是什么意思?通俗解释区块链STO

    binance币安交易所 注册入口: APP下载: 欧易OKX交易所 注册入口: APP下载: 火币交易所: 注册入口: APP下载: 在区块链的世界里,各种缩写词层出不穷,STO就是其中一个备受关注的概念。STO的全称是Security Token Offering,中文译为“证券化代币发行”。通…

    2025年12月8日
    000
  • CEX和DEX是什么意思?CEX与DEX有什么区别?

    在加密货币的世界中,交易是核心活动之一。用户需要平台来买卖、交换不同的数字资产。执行这些功能的平台主要分为两类:中心化交易所(CEX)和去中心化交易所(DEX)。这两种交易所代表了两种截然不同的理念和技术架构,它们为用户提供了不同的交易体验、安全模型和控制级别。 CEX,即Centralized E…

    2025年12月8日
    000
  • 稳定币收益真的“稳定”吗?入门前必须了解的风险与机遇

    许多新手用户在接触币圈时,通常会认为“稳定币”就代表绝对安全,但真相远没有这么简单。虽然稳定币如 usdt、usdc 等锚定美元,有较小的价格波动,但当我们用这些稳定币进行存币生息、质押借贷或链上投资时,背后的风险机制就不再那么“稳定”了。 币安官网地址:https://www.binance.co…

    2025年12月8日
    000
  • ok交易所v6.130.1最新版本APP下载 ok欧交易平台官网下载APP教程

    ok交易所v6.130.1最新版本APP 是一款由全球领先的数字资产服务平台推出的官方应用,提供安全、便捷和高效的数字货币交易体验。本文将为您提供官方APP的下载安装教程,并附上官方下载链接。您只需点击本文提供的下载链接,即可轻松完成安装与使用。 下载安装步骤 1、点击本文提供的  ,进入下载页面。…

    2025年12月8日 好文分享
    000
  • 欧意易交易官网v6.130.1下载并安装(OKX下载安装注册)

    欧意易交易是一款功能完善的数字资产交易平台,提供便捷、安全的交易体验,支持多种主流数字货币。通过该平台,用户不仅能够轻松完成买卖操作,还可以享受行情查看、资产管理等实用功能。本文提供官方app下载链接,用户只需点击本文提供的下载链接即可下载,操作简单高效,方便快速开始体验。 下载安装准备 在开始下载…

    2025年12月8日 好文分享
    000
  • 欧意(oyi)官方app最新下载地址及注册方法(2025完整教程)

    欧意(oyi)是一款功能齐全的数字资产服务应用,集交易、行情查看、安全管理和资产理财于一体,为用户提供稳定、便捷的操作体验。本文提供官方app下载链接,点击即可直接下载,帮助大家快速完成安装与注册。 一、下载安装步骤 为了确保顺利体验欧意(oyi),推荐按照以下步骤进行: 1、点击本文提供的,即可进…

    2025年12月8日 好文分享
    000
  • 以太坊和sol哪个更值得买

    以太坊(ETH)与Solana(SOL)的选择需综合技术、生态与风险回报三方面,1. ETH技术稳健、生态主导但成本高,SOL性能强、费用低但经历多次宕机;2. 生态上ETH在DeFi和NFT交易占优,SOL在DePIN和链游NFT增长迅猛;3. 投资回报方面SOL历史收益高但波动更大,ETH估值更…

    2025年12月8日
    000
  • 什么是Succinct Network(PROVE币)?是一项好的投资吗?关于PROVE币上市指南

    目录 介绍摘要框(简要事实)什么是Succinct Network?Succinct Prover NetworkMission$PROVE有一个$PROVE代币多少?$PROVE 的作用是什么?Succinct Network背后的技术核心功能$PROVE 有何不同?团队与起源重要新闻与事件$PR…

    2025年12月8日
    000
  • 解析加密货币的共识机制:PoW、PoS 等详解

    共识机制是区块链网络中确保节点对交易达成一致的核心算法,其主要目标包括安全性、去中心化、效率和最终性。1. PoW(工作量证明)通过矿工竞争解决数学难题来验证交易,具有高安全性和去中心化特性,但存在能源消耗大、交易速度慢和中心化风险等缺点,比特币采用此机制。2. PoS(权益证明)根据持有代币数量和…

    2025年12月8日
    000
  • 2025现货交易开户流程是怎样的?现货交易开户新手教程

    现货交易,顾名思义,是指买卖双方在约定的时间内,按照约定的价格,进行数字资产的实际交割。与期货等衍生品交易不同,现货交易更侧重于对数字资产本身的持有和价值判断。了解现货交易的基本概念,熟悉交易平台的操作,并掌握风险管理技巧,是成功入门的关键。 准备工作:基础知识与平台选择 在开始现货交易之前,务必做…

    2025年12月8日
    000
  • 2025年Web3交易所排行榜 五大最具潜力的交易平台推荐

    web3技术的迅速发展带动了去中心化金融生态的整体演进,也让数字资产交易平台迎来了新的竞争格局。在这一趋势下,具备技术创新能力、用户基础强大、合规布局完善的交易所正在逐步脱颖而出。相比传统平台,web3交易平台更加注重链上透明度、用户隐私和资产自主性。 以下为目前被广泛认可的五大最具潜力的Web3交…

    2025年12月8日 好文分享
    000
  • 加密货币中的稳定币:稳定价值的秘密

    稳定币是通过锚定法定货币或资产来实现价格稳定的加密货币,主要分为三类:1. 法币抵押型稳定币通过等额法币储备支持,如USDT,但存在中心化和透明度风险;2. 加密货币抵押型稳定币如Dai,采用超额抵押和智能合约机制,具备去中心化优势但面临清算和抵押品波动风险;3. 算法稳定币依赖算法调节供需维持锚定…

    2025年12月8日
    000
  • meme币龙头币有哪些?2025下半年该关注哪些meme币龙头币

    2025年下半年Meme币投资应聚焦具备可持续生态与链上活跃度的龙头项目。1. DOGE凭借特斯拉支付场景和120万+月均交易地址维持领先地位,关注其与X平台整合进展;2. SHIB依托Shibarium链500万+日交易量及300万游戏玩家,追踪.shib域名生态采用率;3. PEPE以10万+独…

    2025年12月8日
    000
  • 加密货币 ICO 的兴衰:历史回顾与教训总结

    ICO的兴衰揭示了技术创新与金融投机的复杂关系,其教训包括:1.监管缺失导致欺诈横行,必须建立合理监管框架;2.项目需有实际价值而非仅靠概念炒作;3.投资者教育至关重要,需提升风险识别能力;4.代币经济模型设计影响长期价值;5.去中心化融资模式持续演变,IEO、IDO等新模式在合规与透明度上不断改进…

    2025年12月8日 好文分享
    000
  • 币安币未来价格如何?有望升至 900 美元吗?一文分析

    目录 市值里程碑,加密资产的新分水岭多重引擎,驱动 BNB 创历史新高生态扩张创造价值根基机构抢筹提供资金动能通缩机制强化稀缺属性战略转型重构估值逻辑技术图景,900 美元路径逐渐清晰价格预测,机构目标差异中显共识短期动能(2025 年 8-12 月)中期展望(2026-2029 年)长期愿景(20…

    2025年12月8日
    000
  • 币安交易所注册奖励多少钱

    币安是全球领先的加密货币交易平台,提供现货、合约等多种交易服务,新用户注册可享交易返现、邀请奖励及限时活动奖励;1、打开币安App点击注册;2、选择邮箱、手机号或第三方账户注册;3、设定安全密码并完成验证码验证;4、进行身份认证(KYC)后即可解锁全部功能,奖励政策以官网为准,中国大陆用户需遵守当地…

    2025年12月8日 好文分享
    000
  • 新手玩币圈为什么一直亏钱?玩币圈合约怎么赚钱?

    新手亏损主要因情绪化交易、知识不足、盲从“大神”和高杠杆操作所致,1、应避免追涨杀跌,2、补足基础知识,3、培养独立判断能力,4、合理控制仓位与杠杆;在合约交易中提升盈利概率的核心方法包括:1、学习技术分析,2、制定并执行交易纪律,3、做好仓位与杠杆管理,4、保持良好心态与耐心;建议新手先通过模拟盘…

    2025年12月8日
    000
  • 币圈常用术语有哪些?币圈小白基础知识,新手必看!

    本文首先明确回答了新手进入数字资产领域需掌握的核心术语,并系统梳理了三大类基础概念:1、区块链是去中心化的公开账本,数字代币为区块链上的加密凭证,智能合约实现自动执行,公链允许无许可参与,去中心化确保权力分散;2、牛市指价格上涨的乐观市场,熊市为持续下跌的悲观行情,建仓是首次买入资产,HODL代表长…

    2025年12月8日
    000
  • BAS币是什么?如何运作?BAS代币经济与未来前景分析

    目录 什么是BNB Attestation Service(BAS)BNB Attestation Service解决了哪些问题1. 数据真实性和验证挑战2. 用户数据所有权危机3.访问控制和隐私限制4. Web3 应用限制BNB Attestation Service背后的故事BNB Attest…

    2025年12月8日 好文分享
    000
  • 为什么比特币、以太坊都涨山寨币不涨

    比特币、以太坊上涨而山寨币不涨,主要因资金虹吸效应导致流动性集中于主流币,1.机构优先配置高市值资产,2.避险情绪加剧资金向主流币聚集,3.比特币作为市场风向标吸引多数新增资金;叠加风险偏好周期影响,1.牛市初期资金偏好低风险资产,2.主流币上涨引发山寨币多头强制平仓;且主流币与山寨币存在流动性断层…

    2025年12月8日
    000

发表回复

登录后才能评论
关注微信