PyQtGraph中的PlotWidget基本使用和代碼示例
PyQtGraph中的PlotWidget詳解
前言
PlotWidget 確實(shí)是 PyQtGraph 庫的基石,它提供了一個開箱即用、功能強(qiáng)大的繪圖區(qū)域。為了幫你快速構(gòu)建起對它的整體認(rèn)知,下面這個表格匯總了其核心特性和在PyQtGraph類體系中的定位。
| 特性維度 | 說明 |
|---|---|
| 核心定位? | 一個高級的、即用型的圖表控件,封裝了完整的圖表組件(坐標(biāo)軸、標(biāo)題、圖例等),易于嵌入PyQt/PySide應(yīng)用程序。 |
| 繼承關(guān)系? | 繼承自 QtWidgets.QGraphicsView,因此可以像標(biāo)準(zhǔn)Qt控件一樣使用。 |
| 內(nèi)部核心? | 內(nèi)部包含一個 PlotItem對象,真正負(fù)責(zé)管理圖表內(nèi)容(數(shù)據(jù)曲線、坐標(biāo)軸等)。PlotWidget的許多方法直接調(diào)用其內(nèi)部 PlotItem的對應(yīng)方法。 |
| 主要優(yōu)勢? | 開箱即用:無需手動搭建復(fù)雜場景;性能優(yōu)異:尤其適合需要快速繪制大量數(shù)據(jù)或?qū)崟r更新的場景。 |
核心架構(gòu)與協(xié)作
PlotWidget的強(qiáng)大在于其內(nèi)部精密的協(xié)作關(guān)系,下圖直觀地展示了其核心構(gòu)成及數(shù)據(jù)流轉(zhuǎn)路徑:

正如流程圖所示,PlotWidget內(nèi)部包含一個 PlotItem作為圖表的“大腦”。PlotItem則管理著 ViewBox(負(fù)責(zé)顯示數(shù)據(jù)和處理交互)、坐標(biāo)軸(AxisItem)和標(biāo)簽等組件。通過 PlotWidget的 plot()方法添加數(shù)據(jù)時,它會創(chuàng)建 PlotDataItem等對象并在 ViewBox中渲染 。
基本使用與樣式定制
基本的使用流程非常直接,同時允許進(jìn)行豐富的樣式定制。
創(chuàng)建與數(shù)據(jù)繪制:
import pyqtgraph as pg from PyQt5.QtWidgets import QApplication import numpy as np import sys app = QApplication(sys.argv) plot_widget = pg.PlotWidget(title="基礎(chǔ)示例") # 設(shè)置圖表標(biāo)題 # 準(zhǔn)備并繪制數(shù)據(jù) x = np.linspace(0, 10, 100) y = np.sin(x) plot_widget.plot(x, y, pen='b', name='正弦波') # 繪制一條藍(lán)色曲線,并命名 plot_widget.show() sys.exit(app.exec_())
背景與網(wǎng)格:
plot_widget.setBackground('w') # 設(shè)置背景為白色
plot_widget.showGrid(x=True, y=True, alpha=0.3) # 顯示網(wǎng)格并設(shè)置透明度
坐標(biāo)軸與標(biāo)題:
plot_widget.setLabel('left', '幅度', units='V') # 設(shè)置坐標(biāo)軸標(biāo)簽
plot_widget.setLabel('bottom', '時間', units='s')
plot_widget.setTitle("信號波形圖", color='b', size='14pt') # 設(shè)置圖表標(biāo)題
線條與數(shù)據(jù)點(diǎn):通過 pen(線條)、symbol(標(biāo)記點(diǎn))、symbolBrush(標(biāo)記填充色)等參數(shù)自定義 。
# 繪制帶紅色圓形標(biāo)記的實(shí)線 plot_widget.plot(x, y, pen='b', symbol='o', symbolSize=5, symbolBrush='r')
效果如圖:

PlotWidget常用屬性、函數(shù)、信號
下面這個表格匯總了 PlotWidget 最常用的屬性、函數(shù)和信號。
| 類別 | 名稱 | 功能描述 | 常用參數(shù)/值 |
|---|---|---|---|
| 常用屬性? | background | 設(shè)置圖表區(qū)域的背景顏色。 | 顏色字符串(如 'w'代表白色)、十六進(jìn)制值(如 '#ffffff')、RGB/A元組或 QColor對象。 |
antialiasing | 控制是否開啟抗鋸齒,使線條和文本邊緣更平滑。 | 布爾值(True或 False),開啟可能會輕微影響性能。 | |
interactive | 設(shè)置繪圖區(qū)域是否允許用戶交互(如鼠標(biāo)縮放、拖拽)。 | 布爾值(True或 False)。 | |
| 核心函數(shù)? | plot() | 在圖表上繪制曲線或散點(diǎn)圖。 | x, y(數(shù)據(jù)), pen(線條), symbol(數(shù)據(jù)點(diǎn)標(biāo)記), name(圖例名稱)等。 |
setLabel() | 設(shè)置坐標(biāo)軸的標(biāo)簽(標(biāo)題)。 | axis(軸,如 'left', 'bottom'), text(標(biāo)簽文本), units(單位,可選)。 | |
setXRange()/ setYRange() | 設(shè)置X軸或Y軸的顯示范圍。 | min(最小值), max(最大值), padding(邊距,通常設(shè)為0以精確控制)。 | |
showGrid() | 顯示或隱藏背景網(wǎng)格線。 | x(X軸網(wǎng)格), y(Y軸網(wǎng)格), alpha(網(wǎng)格線透明度)。 | |
addLegend() | 在圖表上添加圖例,需要與 plot()函數(shù)中的 name參數(shù)配合使用。 | 無參數(shù)或通過 offset參數(shù)設(shè)置圖例位置。 | |
clear() | 清除圖表上所有的繪圖項(xiàng)。 | 無參數(shù)。 | |
| 重要信號? | sigXRangeChanged | 當(dāng)X軸的顯示范圍發(fā)生變化時(例如用戶通過鼠標(biāo)縮放或拖拽)發(fā)出此信號。 | |
sigYRangeChanged | 當(dāng)Y軸的顯示范圍發(fā)生變化時發(fā)出此信號。 |
核心功能詳解與代碼示例
下面我們結(jié)合具體代碼,進(jìn)一步了解這些功能如何協(xié)同工作。
基本圖表設(shè)置與繪制
下面的代碼展示了如何創(chuàng)建一個基本的圖表,包括設(shè)置背景、標(biāo)題、坐標(biāo)軸標(biāo)簽和網(wǎng)格。
import pyqtgraph as pg
from PyQt5.QtWidgets import QApplication
import sys
import numpy as np
app = QApplication(sys.argv)
# 創(chuàng)建PlotWidget
plot_widget = pg.PlotWidget()
# 設(shè)置背景為白色
plot_widget.setBackground('w')
# 設(shè)置圖表標(biāo)題
plot_widget.setTitle("溫度變化曲線", color='b', size='14pt')
# 設(shè)置坐標(biāo)軸標(biāo)簽
plot_widget.setLabel('left', '溫度', '°C')
plot_widget.setLabel('bottom', '時間', 's')
# 顯示網(wǎng)格
plot_widget.showGrid(x=True, y=True, alpha=0.3)
# 生成示例數(shù)據(jù)并繪圖
x = np.linspace(0, 10, 100)
y = np.sin(x)
# 繪制一條紅色、帶圓形標(biāo)記的曲線,并命名為“示例曲線”
plot_widget.plot(x, y, pen='r', symbol='o', symbolSize=5, name='示例曲線')
# 添加圖例
plot_widget.addLegend()
plot_widget.show()
sys.exit(app.exec_())視圖控制與交互
通過設(shè)置視圖范圍和使用信號,可以實(shí)現(xiàn)圖表的自動縮放或聯(lián)動。
# 將X軸范圍鎖定在0到5,Y軸范圍鎖定在-1.5到1.5,并且不留邊距(padding=0)
plot_widget.setXRange(0, 5, padding=0)
plot_widget.setYRange(-1.5, 1.5, padding=0)
# 連接信號,當(dāng)視圖范圍改變時在控制臺打印新范圍
def on_x_range_changed(view, range_tuple):
print(f"X軸范圍變?yōu)? {range_tuple}")
plot_widget.sigXRangeChanged.connect(on_x_range_changed)動態(tài)數(shù)據(jù)更新
對于實(shí)時數(shù)據(jù)展示,高效的方法是更新已有數(shù)據(jù)項(xiàng),而非清除重繪。
# 初始繪制一條空曲線,并保存其引用 curve = plot_widget.plot(pen='b') # 初始化數(shù)據(jù)容器 data_x = [] data_y = [] # 模擬數(shù)據(jù)更新函數(shù) def update_data(new_value): data_x.append(len(data_x)) # 假設(shè)X軸是數(shù)據(jù)點(diǎn)索引 data_y.append(new_value) # 高效更新曲線數(shù)據(jù) curve.setData(data_x, data_y)
效果如圖:

實(shí)用技巧與進(jìn)階概念
掌握了基本操作后,了解一些進(jìn)階概念和技巧能讓你的圖表更出色。
理解底層架構(gòu):PlotWidget是一個高級封裝,其內(nèi)部核心是一個 PlotItem,而 PlotItem又包含一個負(fù)責(zé)實(shí)際顯示和交互的 ViewBox。當(dāng)你調(diào)用 plot_widget.plot()時,實(shí)際上是在其內(nèi)部的 PlotItem上操作。這種設(shè)計(jì)使得 PlotWidget既易用又強(qiáng)大。
線條與標(biāo)記樣式:通過 pg.mkPen()和 pg.mkBrush()可以創(chuàng)建更復(fù)雜的線條和填充樣式。
# 創(chuàng)建自定義的筆(Pen):藍(lán)色、2像素寬、虛線
custom_pen = pg.mkPen(color='b', width=2, style=pg.QtCore.Qt.DashLine)
# 創(chuàng)建自定義的畫刷(Brush):綠色填充
custom_brush = pg.mkBrush('g')
plot_widget.plot(x, y, pen=custom_pen, symbol='s', symbolBrush=custom_brush)
多圖表布局:如果需要在一個窗口中排列多個圖表,可以使用 GraphicsLayoutWidget,它類似于一個網(wǎng)格布局,可以輕松地添加和管理多個 PlotItem。
layout_widget = pg.GraphicsLayoutWidget() plot1 = layout_widget.addPlot(row=0, col=0, title="圖表1") plot2 = layout_widget.addPlot(row=0, col=1, title="圖表2") plot3 = layout_widget.addPlot(row=1, col=0, colspan=2, title="圖表3") # 合并兩列
高級功能與應(yīng)用
實(shí)時數(shù)據(jù)更新:這是PyQtGraph的強(qiáng)項(xiàng)。正確做法是更新已有數(shù)據(jù)項(xiàng),而非重繪 。
# 初始化時獲取曲線引用 self.curve = plot_widget.plot(pen='y') # ... 數(shù)據(jù)更新邏輯 new_y = np.sin(new_x) self.curve.setData(new_x, new_y) # 高效更新數(shù)據(jù)
鼠標(biāo)交互與事件:默認(rèn)支持縮放和平移。還可以連接鼠標(biāo)事件實(shí)現(xiàn)點(diǎn)擊添加點(diǎn)等高級交互 。
# 連接鼠標(biāo)點(diǎn)擊事件示例
def on_click(event):
pos = event.scenePos()
# 將場景坐標(biāo)轉(zhuǎn)換為數(shù)據(jù)坐標(biāo)...
plot_widget.scene().sigMouseClicked.connect(on_click)
實(shí)用技巧
- 性能優(yōu)先:處理海量數(shù)據(jù)或需要高頻實(shí)時更新時,
PlotWidget是理想選擇 。 - 理解層次:明確
PlotWidget(容器) 、PlotItem(圖表管理) 和ViewBox(數(shù)據(jù)視圖) 的分工,有助于解決復(fù)雜問題 。 - 善用示例:通過運(yùn)行
import pyqtgraph.examples; pyqtgraph.examples.run()來探索大量現(xiàn)成案例 。
擴(kuò)展
PlotWidget是如何體現(xiàn)GraphicsView、GraphicsScene、GraphicsItem這三個核心組件交互的
PlotWidget 的精妙之處在于,它作為一個高度集成的高級組件,將 Qt Graphics View 框架中三個核心組件——GraphicsView(視圖)、GraphicsScene(場景)和 GraphicsItem(圖元)的復(fù)雜交互封裝了起來,為我們提供了一個開箱即用、功能強(qiáng)大的繪圖界面。
為了更直觀地理解這三者是如何在 PlotWidget 內(nèi)部協(xié)同工作的,我們可以參考下面的協(xié)作流程圖:

下面我們來詳細(xì)解讀這個協(xié)作過程。
核心交互流程
1. 視圖(GraphicsView):交互的窗口
PlotWidget 本身繼承自 GraphicsView,它充當(dāng)了觀察窗口的角色。
- 職責(zé):負(fù)責(zé)將不可見的場景內(nèi)容可視化顯示在屏幕上,并處理最基礎(chǔ)的鼠標(biāo)縮放、平移、鍵盤事件等用戶交互。
- 在PlotWidget中的體現(xiàn):當(dāng)你創(chuàng)建一個 PlotWidget 時,就已經(jīng)創(chuàng)建了一個“準(zhǔn)備好了”的視圖窗口。你無需手動創(chuàng)建
QGraphicsView,PlotWidget 已經(jīng)包含了它。
2. 場景(GraphicsScene):圖元的舞臺
PlotWidget 內(nèi)部自動創(chuàng)建并管理著一個 PlotItem(它本身是一種特殊的 GraphicsItem),而 PlotItem又包含一個 ViewBox和一個默認(rèn)的 GraphicsScene。
- 職責(zé):
GraphicsScene是一個不可見的容器和管理者。它不負(fù)責(zé)繪制,而是管理所有添加到其中的圖元(GraphicsItem),處理事件的派發(fā)(比如將鼠標(biāo)點(diǎn)擊事件傳遞給正確的圖元),并管理圖元的狀態(tài)(如選擇狀態(tài))。 - 在PlotWidget中的體現(xiàn):當(dāng)你調(diào)用
PlotWidget.plot()方法繪制一條曲線時,曲線(一個PlotDataItem)實(shí)際上是被添加到了這個內(nèi)部的場景中。場景負(fù)責(zé)維護(hù)這條曲線和其他所有圖元(如坐標(biāo)軸、網(wǎng)格、標(biāo)簽)的層次和關(guān)系。
3. 圖元(GraphicsItem):真正的內(nèi)容
在場景中顯示的每一個獨(dú)立元素都是一個圖元。
- 職責(zé):這是具體的內(nèi)容繪制者。一條曲線、一個數(shù)據(jù)點(diǎn)、一段文字、一個坐標(biāo)軸刻度,都可以是單獨(dú)的圖元。它們知道自己如何被繪制(通過重寫
paint()方法),并能響應(yīng)發(fā)生在其自身范圍內(nèi)的事件。 - 在PlotWidget中的體現(xiàn):
PlotWidget.plot()方法會創(chuàng)建并返回一個PlotDataItem(它是GraphicsItem的子類),它就是你看到的那條曲線。同樣,坐標(biāo)軸(AxisItem)、圖例等也都是圖元。
協(xié)作實(shí)例:一次鼠標(biāo)點(diǎn)擊的旅程
假設(shè)你在 PlotWidget 的曲線圖上點(diǎn)擊了一下鼠標(biāo),這個過程清晰地展示了三者的協(xié)作:
- 視圖接收:
PlotWidget(作為GraphicsView)首先接收到原始的鼠標(biāo)點(diǎn)擊視圖坐標(biāo)(以像素為單位,原點(diǎn)在視圖左上角)。 - 坐標(biāo)轉(zhuǎn)換:
PlotWidget使用mapToScene()函數(shù)將視圖坐標(biāo)轉(zhuǎn)換為場景坐標(biāo)。 - 事件派發(fā):轉(zhuǎn)換后的事件被傳遞給內(nèi)部的
GraphicsScene。 - 定位圖元:
GraphicsScene根據(jù)場景坐標(biāo),查詢哪個(些)圖元位于點(diǎn)擊位置之下(例如,你的曲線圖元),這就是所謂的碰撞檢測。 - 圖元響應(yīng):事件被派發(fā)給命中了的曲線圖元(
PlotDataItem)。這個圖元可以觸發(fā)相應(yīng)的動作,例如發(fā)射一個包含點(diǎn)擊位置數(shù)據(jù)坐標(biāo)的信號,或者改變自身外觀以示被選中。
開發(fā)者視角的簡化
對于我們開發(fā)者而言,PlotWidget 的偉大之處在于它將底層交互封裝成了簡單的 API。在絕大多數(shù)情況下,你不需要直接操作 GraphicsScene或底層的 GraphicsItem。
- 添加內(nèi)容:使用
PlotWidget.plot(),PlotWidget.addItem()等方法。PlotWidget 會幫你處理將這些圖元添加到正確場景的一切事宜。 - 設(shè)置樣式:直接調(diào)用
PlotWidget的方法,如setBackground(),showGrid(),setLabel()。這些調(diào)用最終都會由 PlotWidget 傳遞給內(nèi)部對應(yīng)的場景和圖元(如坐標(biāo)軸圖元)來執(zhí)行。 - 獲取內(nèi)部組件:在需要更高級控制時,你可以通過
PlotWidget.getPlotItem(),PlotWidget.getViewBox(),PlotWidget.scene()等方法來獲取內(nèi)部的組件,從而進(jìn)行深度定制。
總結(jié)
簡單來說,PlotWidget 是一個“導(dǎo)演”,它搭建了一個完整的演出舞臺(整合了 Scene 和 View),并提供了豐富的“劇本”(API)。而我們開發(fā)者就像“制片人”,只需要下達(dá)指令(“在這里畫一條正弦曲線”),導(dǎo)演就會指揮演員(GraphicsItem)在舞臺上的正確位置進(jìn)行表演,并處理好觀眾(用戶)與演員之間的所有互動。
希望這些介紹能幫助你更好地理解和使用 PlotWidget。它是一個在功能、易用性和性能之間取得了出色平衡的工具,非常適合用于構(gòu)建交互式科學(xué)計(jì)算應(yīng)用程序的圖形界面。
到此這篇關(guān)于PyQtGraph中的PlotWidget基本使用和代碼示例的文章就介紹到這了,更多相關(guān)PyQtGraph PlotWidget使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
django框架模板中定義變量(set variable in django template)的方法分析
這篇文章主要介紹了django框架模板中定義變量(set variable in django template)的方法,結(jié)合實(shí)例形式分析了Django框架實(shí)現(xiàn)模板中定義變量與變量賦值相關(guān)操作技巧,需要的朋友可以參考下2019-06-06
Django 允許局域網(wǎng)中的機(jī)器訪問你的主機(jī)操作
這篇文章主要介紹了Django 允許局域網(wǎng)中的機(jī)器訪問你的主機(jī)實(shí)例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-05-05
python寫入數(shù)據(jù)到csv或xlsx文件的3種方法
這篇文章主要為大家詳細(xì)介紹了python寫入數(shù)據(jù)到csv或xlsx文件的3種方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-08-08
Python 字符串大小寫轉(zhuǎn)換的簡單實(shí)例
下面小編就為大家?guī)硪黄狿ython 字符串大小寫轉(zhuǎn)換的簡單實(shí)例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-01-01
PyQt5 QTable插入圖片并動態(tài)更新的實(shí)例
今天小編就為大家分享一篇PyQt5 QTable插入圖片并動態(tài)更新的實(shí)例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-06-06
VSCode搭建Django開發(fā)環(huán)境的圖文步驟
本篇介紹在vscode環(huán)境下搭建Django開發(fā)環(huán)境的詳細(xì)步驟,包括Python、Django、VSCode等,以及它們的安裝和配置方法,具有一定的參考價值,感興趣的可以了解一下2023-09-09

