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
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/82255.shtml
英文地址,請注明出處:http://en.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;選擇合適工具是前提。錯誤的工具選擇往往會導致項目溝通效率低、需求追蹤失效甚至造成交付物偏離客戶預期。因此&…