最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

PyQtGraph中的PlotWidget基本使用和代碼示例

 更新時間:2026年01月24日 10:41:29   作者:牛馬不是牛  
PyQtGraph中的PlotWidget是一個高級、即用型的圖表控件,提供了一個開箱即用、功能強(qiáng)大的繪圖區(qū)域,下面通過本文給大家介紹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)簽等組件。通過 PlotWidgetplot()方法添加數(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控制是否開啟抗鋸齒,使線條和文本邊緣更平滑。布爾值(TrueFalse),開啟可能會輕微影響性能。
interactive設(shè)置繪圖區(qū)域是否允許用戶交互(如鼠標(biāo)縮放、拖拽)。布爾值(TrueFalse)。
核心函數(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)文章

最新評論

金昌市| 武宣县| 栾川县| 通许县| 云梦县| 新余市| 灵山县| 肥城市| 葫芦岛市| 永顺县| 常山县| 运城市| 建水县| 锡林浩特市| 阳春市| 东乌珠穆沁旗| 图片| 马关县| 庄河市| 东明县| 峨边| 金昌市| 安西县| 伊吾县| 库伦旗| 枣阳市| 四川省| 东安县| 星子县| 泰兴市| 长泰县| 安新县| 沽源县| 遂昌县| 磴口县| 铜川市| 遂宁市| 随州市| 迁安市| 自贡市| 敖汉旗|