Matplotlib 后端与事件循环

前言:很多时候,matplot跑出来的是这种静态非交互的,如果想要可以交互,就得设定一个后端,例如

matplotlib.use('TkAgg')

无交互
在这里插入图片描述

Matplotlib 后端 (Backend)

Matplotlib 的设计理念是能够以多种方式输出图形,无论是显示在屏幕上、保存到文件,还是嵌入到各种用户界面(GUI)中。为了实现这一点,Mat它使用了“后端”的概念。

简单来说,后端就是 Matplotlib 用来实际渲染和显示图形的软件模块。 它负责处理从 Matplotlib 的高级绘图命令(如 plt.plot(), plt.scatter())到最终图像(屏幕显示或文件输出)的转换。

Matplotlib 有两种主要类型的后端:

  1. 用户界面后端 (User Interface Backends):也称为交互式后端。它们允许在屏幕上显示图形,并与图形进行交互(如缩放、平移、保存等)。这些后端通常依赖于特定的 GUI 工具包,比如 Tkinter、Qt、GTK、WxWidgets 等。
  2. 非交互式后端 (Non-Interactive Backends):也称为硬拷贝后端。这些后端主要用于将图形保存为各种文件格式(如 PNG, PDF, SVG, JPG),而不显示在屏幕上。它们不需要 GUI 工具包的支持。

如何选择后端?

Matplotlib 会尝试自动选择一个合适的后端,通常会根据安装的 GUI 库和运行环境来决定。但也可以显式地指定后端,最常用的方法是:

Python

import matplotlib
matplotlib.use('backend_name')
import matplotlib.pyplot as plt

注意:matplotlib.use() 必须在 import matplotlib.pyplot as plt 之前调用。

事件循环 (Event Loop)

事件循环是 GUI 应用程序的核心机制。它是一个持续运行的循环,负责监听来自操作系统和用户的各种事件(如鼠标点击、键盘输入、窗口调整大小、绘图刷新请求等),然后将这些事件分派给相应的处理函数。

在 Matplotlib 中,交互式后端需要一个事件循环来:

  1. 显示图形窗口: 只有事件循环在运行,图形窗口才能被创建和显示。
  2. 响应用户交互: 缩放、平移、保存等操作都需要事件循环来捕获并处理。
  3. 刷新和更新图形: 当图形内容发生变化时,事件循环会负责调度重绘操作。

如果在一个非 GUI 环境(如纯 Python 脚本)中使用交互式后端,并且没有显式地启动事件循环,那么图形窗口可能不会显示,或者程序会立即退出,因为没有东西来保持它运行和响应事件。

交互式后端 (Interactive Backends)

交互式后端主要用于在屏幕上显示图形并允许用户进行实时操作。

常见交互式后端:

  • 'TkAgg': 基于 Tkinter GUI 工具包。它通常是 Python 安装自带的,因此在许多系统上默认可用。在的原始代码中使用的就是它。
  • 'QtAgg' / 'Qt5Agg' / 'Qt4Agg': 基于 Qt GUI 工具包(PyQt 或 PySide)。提供更现代、功能更丰富的 GUI。
  • 'WxAgg': 基于 WxPython GUI 工具包。
  • 'GTK3Agg' / 'GTK4Agg': 基于 GTK GUI 工具包。
  • 'macosx' (macOS) / 'webagg' (Web) 等。

特点:

  • 需要 GUI 工具包: 必须安装相应的 GUI 库才能使用。
  • 需要事件循环: 要使图形窗口持续显示和响应,需要一个正在运行的事件循环。在交互式 Python 会话(如 IPython 或 Jupyter Notebook)中,事件循环通常会自动启动或以某种方式集成。但在独立脚本中,可能需要手动调用 plt.show(),这会启动一个简单的事件循环并阻塞程序,直到窗口关闭。
  • 内存管理: 由于需要维护 GUI 状态和图形对象,这些后端可能会在内存中保留更多资源。如果在循环中重复创建和关闭图形而不让事件循环充分清理,就容易导致内存泄漏或累积。plt.close() 尝试关闭图形,但底层 GUI 库的资源清理可能不是立即的或完全的,尤其是在没有活跃事件循环的情况下。

非交互式后端 (Non-Interactive Backends)

非交互式后端不显示图形窗口,它们的主要目的是将图形直接渲染到文件或内存缓冲区中。它们通常被称为“硬拷贝”后端,因为它们生成的是最终的、不可交互的图像。

常见非交互式后端:

  • 'Agg': Matplotlib 的默认非交互式后端,也是最常用的。它使用 Anti-Grain Geometry (AGG) 库来生成位图(raster)图像,如 PNG、JPEG。
  • 'PDF': 生成 PDF 文件。
  • 'SVG': 生成可缩放矢量图形 (SVG) 文件。
  • 'PS' / 'EPS': 生成 PostScript 或 Encapsulated PostScript 文件。

特点:

  • 不显示窗口: 不会打开任何图形窗口。
  • 不需要 GUI 工具包: 它们通常不依赖于任何外部 GUI 库,因此在没有桌面环境的服务器或批量处理脚本中非常有用。
  • 不涉及事件循环: 由于没有 GUI 窗口,也就没有事件循环的需求。绘图完成后,图形资源可以直接被释放。
  • 内存管理: 相对于交互式后端,非交互式后端在内存管理上通常更简洁和高效。它们创建图形对象,渲染到文件,然后可以更快、更彻底地释放内存。在批量生成大量图片时,使用非交互式后端能显著减少内存堆积的问题。

一个内存释放的问题

在批量处理数据并生成大量图片。如果使用的是 'TkAgg' 这样的交互式后端,即使调用了 plt.close(),也可能发生以下情况:

  1. GUI 资源未及时释放: 'TkAgg' 会与 Tkinter 库交互。尽管 plt.close() 关闭了 Matplotlib 的 Figure 对象,但 Tkinter 内部可能仍然保留了一些相关的窗口句柄、上下文或像素缓冲区等资源,这些资源在没有 Tkinter 事件循环积极运行时,可能不会立即被垃圾回收或释放给操作系统。
  2. 事件循环缺失: 在你的独立脚本中,没有一个持久运行的 Tkinter 事件循环来处理这些底层资源的清理任务。每次 extract_hef_features 函数执行完毕,它可能只是短暂地创建并关闭了一个 Tkinter 窗口,但 Tkinter 的内部状态可能没有完全重置。
  3. Python GC 的惰性: Python 的垃圾回收器在某些情况下可能会显得“懒惰”,它不会在内存达到临界点之前或在资源被“完全”释放(在 GUI 后端中可能需要事件循环的参与)之前主动回收内存。

解决方案:

将后端从 TkAgg 切换到 Agg

  • Agg 是为离屏渲染(off-screen rendering)设计的,它不涉及任何 GUI 窗口或事件循环。它直接将图形绘制到内存缓冲区中,然后保存到文件。
  • Agg 的设计使其在渲染完成后,相关的内存资源可以更直接、更迅速地被 Matplotlib 和 Python 垃圾回收器识别并释放。它避免了与外部 GUI 库(如 Tkinter)的复杂交互和它们可能存在的内存管理问题。

另外还有涉及到MNE可视化后端的问题,可以看这个

MNE后端循环

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/pingmian/82255.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【JAVA】中文我该怎么排序?

📘 Java 中文排序教学文档(基于 Collator) 🧠 目录 概述Java 中字符串排序的默认行为为什么需要 Collator使用 Collator 进行中文排序升序 vs 降序排序自定义对象字段排序多字段排序示例总结对比表附录:完整代码示例 …

k8s-NetworkPolicy

在 Kubernetes 中,NetworkPolicy 是一种资源对象,用于定义 Pod 之间的网络通信策略。它允许你控制哪些 Pod 可以相互通信,以及如何通信。通过使用 NetworkPolicy,可以实现更细粒度的网络访问控制,增强集群的安全性。 1…

LAN(局域网)和WAN(广域网)

你的问题非常清晰!我来用一个直观的比喻实际拓扑图帮你彻底理解LAN(局域网)和WAN(广域网)如何协同工作,以及路由器在其中的位置。你可以把整个网络想象成一座城市: 1. 比喻:城市交通…

idea 插件开发自动发布到 nexus 私服中(脚本实例)

如下脚本内容为 idea 插件开发项目中的 build.gradle.kts 文件示例,其中自定了 updatePluginsXmlToNexus 和 uploadPluginToNexus 两个任务,一个用来自动修改 nexus 中的配置文件,一个用来自动将当前插件打包后的 zip 文件上传到 nexus 私服中…

SpringBoot-11-基于注解和XML方式的SpringBoot应用场景对比

文章目录 1 基于注解的方式1.1 @Mapper1.2 @select1.3 @insert1.4 @update1.5 @delete2 基于XML的方式2.1 namespace2.2 resultMap2.3 select2.4 insert2.5 update2.6 delete3 service和controller3.1 service3.2 controller4 注解和xml的选择如果SQL简单且项目规模较小,推荐使…

C++复习核心精华

一、内存管理与智能指针 内存管理是C区别于其他高级语言的关键特性,掌握好它就掌握了C的灵魂。 1. 原始指针与内存泄漏 先来看看传统C的内存管理方式: void oldWay() {int* p new int(42); // 分配内存// 如果这里发生异常或提前return&#xff0c…

期货反向跟单软件—提高盘手杠杆的方式及剖析

在期货反向跟单领域,期货跟单软件对盘手杠杆的调节,是整个策略运作的核心环节之一。其背后蕴含着科学的金融逻辑。​ 期货跟单软件提高盘手杠杆主要通过两种方式。第一种是降低期货保证金。在盘手资金总量固定的情况下,保证金降低&#xff0…

【计算机网络】基于UDP进行socket编程——实现服务端与客户端业务

🔥个人主页🔥:孤寂大仙V 🌈收录专栏🌈:Linux 🌹往期回顾🌹: 【Linux笔记】——网络基础 🔖流水不争,争的是滔滔不息 一、UDPsocket编程UDPsocket编…

ae卡通打架烟雾特效

1、创建一个合成(合成1),右键创建形状图层,使用椭圆工具,长按shift键拖动鼠标左键画出圆形,同时按ctrlalthome三个键使圆形中心锚点对齐圆心,关闭描边,圆形图层填充白色。 2、选择形…

UE5 Va Res发送请求、处理请求、json使用

文章目录 介绍发送一个Get请求发送Post请求设置请求头请求体带添json发送请求完整的发送蓝图 处理收到的数据常用的json处理节点 介绍 UE5 自带的Http插件,插件内自带json解析功能 发送一个Get请求 只能写在事件图表里 发送Post请求 只能写在事件图表里 设置…

SQL 结构化模型设计与现代技术融合深度解读

摘要 本文系统展示了基于 JSON Schema 的 SQL 结构化模型设计,包括通用定义、四大基本操作(SELECT、INSERT、UPDATE、DELETE)的模型规范,以及面向现代场景的设计扩展。重点结合数据权限控制、乐观锁并发控制、表单自动化、自定义…

el-dialog 组件 多层嵌套 被遮罩问题

<el-dialog title"提示" :visible.sync"dialogBindUserVisible" width"30%" append-to-body :before-close"handleClose"> <span>这是一段信息</span> <span slot"footer" class"dialog-footer&q…

【KWDB 2025 创作者计划】_KWDB时序数据库特性及跨模查询

一、概述 数据库的类型多种多样&#xff0c;关系型数据库、时序型数据库、非关系型数据库、内存数据库、分布式数据库、图数据库等等&#xff0c;每种类型都有其特定的使用场景和优势&#xff0c;KaiwuDB 是一款面向 AIoT 场景的分布式、多模融合、支持原生 AI 的数据库…

学习心得(12-13)HTML 是什么 abort函数and自定义异常

一. abort函数 将后端的数据给到前端 二. 自定义异常 要结合abort函数使用 1.编写的时候都在abort的函数这个文件里面 错误信息在前端页面的展示&#xff1a; 如果想要在出现异常的时候返回一个页面&#xff1a; 1. 新建一个HTML文件 例如命名为404 2.将图库里的图片拖入…

理解全景图像拼接

1 3D到2D透视投影 三维空间上点 p 投影到二维空间 q 有两种方式&#xff1a;1&#xff09;正交投影&#xff0c;2&#xff09;透视投影。 正交投影直接舍去 z 轴信息&#xff0c;该模型仅在远心镜头上是合理的&#xff0c;或者对于物体深度远小于其到摄像机距离时的近似模型。…

Linux基本指令篇 —— whoami指令

whoami 是 Linux 和 Unix 系统中一个简单但实用的命令&#xff0c;全称 Who Am I&#xff08;我是谁&#xff09;。它的功能是显示当前登录用户的用户名。以下是关于 whoami 的详细解析&#xff1a; 目录 1. 基本用法 2. 命令特点 3. 实际应用场景 场景 1&#xff1a;脚本中…

华为OD机试真题——仿LISP运算(2025B卷:200分)Java/python/JavaScript/C/C++/GO最佳实现

2025 B卷 200分 题型 本专栏内全部题目均提供Java、python、JavaScript、C、C++、GO六种语言的最佳实现方式; 并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析; 本文收录于专栏:《2025华为OD真题目录+全流程解析+备考攻略+经验分…

创建dummy

访客_dc1fc4 class Solution { public: int minSubArrayLen(int target, vector<int>& nums) { int left0;int right0;int n nums.size(); int sum0;int ans100001; for(right0;right<n;right) { sumnums[right]; //每次更新右端点之后&#xff0c;立即向右移动…

面向恶劣条件的道路交通目标检测----大创自用(当然你也可以在里面学到很多东西)

全部内容梳理 目标检测的两个任务&#xff1a; 预测标签 边界框 语义分割 实力分割 一个是类别 一个是实例级别 分类任务把每个图像当作一张图片看待 所有解决方法是先生成候选区域 再进行分类 置信度&#xff1a; 包括对类别和边界框预测的自信程度 输出分类和IOU分数的…

需求管理工具使用不当,如何优化?

要优化需求管理工具的使用&#xff0c;需从选择合适工具、规范使用流程、加强用户培训、统一数据结构、定期审查与优化使用配置五个方面着手。其中&#xff0c;选择合适工具是前提。错误的工具选择往往会导致项目沟通效率低、需求追踪失效甚至造成交付物偏离客户预期。因此&…