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

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

 更新時(shí)間:2026年01月24日 10:41:29   作者:牛馬不是牛  
PyQtGraph中的PlotWidget是一個(gè)高級(jí)、即用型的圖表控件,提供了一個(gè)開(kāi)箱即用、功能強(qiáng)大的繪圖區(qū)域,下面通過(guò)本文給大家介紹PyQtGraph中的PlotWidget基本使用和代碼示例,感興趣的朋友一起看看吧

PyQtGraph中的PlotWidget詳解

前言

PlotWidget 確實(shí)是 PyQtGraph 庫(kù)的基石,它提供了一個(gè)開(kāi)箱即用、功能強(qiáng)大的繪圖區(qū)域。為了幫你快速構(gòu)建起對(duì)它的整體認(rèn)知,下面這個(gè)表格匯總了其核心特性和在PyQtGraph類體系中的定位。

特性維度說(shuō)明
核心定位?一個(gè)高級(jí)的、即用型的圖表控件,封裝了完整的圖表組件(坐標(biāo)軸、標(biāo)題、圖例等),易于嵌入PyQt/PySide應(yīng)用程序。
繼承關(guān)系?繼承自 QtWidgets.QGraphicsView,因此可以像標(biāo)準(zhǔn)Qt控件一樣使用。
內(nèi)部核心?內(nèi)部包含一個(gè) PlotItem對(duì)象,真正負(fù)責(zé)管理圖表內(nèi)容(數(shù)據(jù)曲線、坐標(biāo)軸等)。PlotWidget的許多方法直接調(diào)用其內(nèi)部 PlotItem的對(duì)應(yīng)方法。
主要優(yōu)勢(shì)?開(kāi)箱即用:無(wú)需手動(dòng)搭建復(fù)雜場(chǎng)景;性能優(yōu)異:尤其適合需要快速繪制大量數(shù)據(jù)或?qū)崟r(shí)更新的場(chǎng)景。

核心架構(gòu)與協(xié)作

PlotWidget的強(qiáng)大在于其內(nèi)部精密的協(xié)作關(guān)系,下圖直觀地展示了其核心構(gòu)成及數(shù)據(jù)流轉(zhuǎn)路徑:

正如流程圖所示,PlotWidget內(nèi)部包含一個(gè) PlotItem作為圖表的“大腦”。PlotItem則管理著 ViewBox(負(fù)責(zé)顯示數(shù)據(jù)和處理交互)、坐標(biāo)軸(AxisItem)和標(biāo)簽等組件。通過(guò) PlotWidgetplot()方法添加數(shù)據(jù)時(shí),它會(huì)創(chuàng)建 PlotDataItem等對(duì)象并在 ViewBox中渲染 。

基本使用與樣式定制

基本的使用流程非常直接,同時(shí)允許進(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', '時(shí)間', units='s')
plot_widget.setTitle("信號(hào)波形圖", color='b', size='14pt') # 設(shè)置圖表標(biāo)題

線條與數(shù)據(jù)點(diǎn):通過(guò) 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ù)、信號(hào)

下面這個(gè)表格匯總了 PlotWidget 最常用的屬性、函數(shù)和信號(hào)。

類別名稱功能描述常用參數(shù)/值
常用屬性?background設(shè)置圖表區(qū)域的背景顏色。顏色字符串(如 'w'代表白色)、十六進(jìn)制值(如 '#ffffff')、RGB/A元組或 QColor對(duì)象。
antialiasing控制是否開(kāi)啟抗鋸齒,使線條和文本邊緣更平滑。布爾值(TrueFalse),開(kāi)啟可能會(huì)輕微影響性能。
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ù)配合使用。無(wú)參數(shù)或通過(guò) offset參數(shù)設(shè)置圖例位置。
clear()清除圖表上所有的繪圖項(xiàng)。無(wú)參數(shù)。
重要信號(hào)?sigXRangeChanged當(dāng)X軸的顯示范圍發(fā)生變化時(shí)(例如用戶通過(guò)鼠標(biāo)縮放或拖拽)發(fā)出此信號(hào)。
sigYRangeChanged當(dāng)Y軸的顯示范圍發(fā)生變化時(shí)發(fā)出此信號(hào)。

核心功能詳解與代碼示例

下面我們結(jié)合具體代碼,進(jìn)一步了解這些功能如何協(xié)同工作。

基本圖表設(shè)置與繪制

下面的代碼展示了如何創(chuàng)建一個(gè)基本的圖表,包括設(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', '時(shí)間', '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_())

視圖控制與交互

通過(guò)設(shè)置視圖范圍和使用信號(hào),可以實(shí)現(xiàn)圖表的自動(dòng)縮放或聯(lián)動(dòng)。

# 將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)
# 連接信號(hào),當(dāng)視圖范圍改變時(shí)在控制臺(tái)打印新范圍
def on_x_range_changed(view, range_tuple):
   print(f"X軸范圍變?yōu)? {range_tuple}")
plot_widget.sigXRangeChanged.connect(on_x_range_changed)

動(dòng)態(tài)數(shù)據(jù)更新

對(duì)于實(shí)時(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是一個(gè)高級(jí)封裝,其內(nèi)部核心是一個(gè) PlotItem,而 PlotItem又包含一個(gè)負(fù)責(zé)實(shí)際顯示和交互的 ViewBox。當(dāng)你調(diào)用 plot_widget.plot()時(shí),實(shí)際上是在其內(nèi)部的 PlotItem上操作。這種設(shè)計(jì)使得 PlotWidget既易用又強(qiáng)大。

線條與標(biāo)記樣式:通過(guò) 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)建自定義的畫(huà)刷(Brush):綠色填充
custom_brush = pg.mkBrush('g')
plot_widget.plot(x, y, pen=custom_pen, symbol='s', symbolBrush=custom_brush)

多圖表布局:如果需要在一個(gè)窗口中排列多個(gè)圖表,可以使用 GraphicsLayoutWidget,它類似于一個(gè)網(wǎng)格布局,可以輕松地添加和管理多個(gè) 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") # 合并兩列

高級(jí)功能與應(yīng)用

實(shí)時(shí)數(shù)據(jù)更新:這是PyQtGraph的強(qiáng)項(xiàng)。正確做法是更新已有數(shù)據(jù)項(xiàng),而非重繪 。

# 初始化時(shí)獲取曲線引用
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)等高級(jí)交互 。

# 連接鼠標(biāo)點(diǎn)擊事件示例
def on_click(event):
    pos = event.scenePos()
    # 將場(chǎng)景坐標(biāo)轉(zhuǎn)換為數(shù)據(jù)坐標(biāo)...
plot_widget.scene().sigMouseClicked.connect(on_click)

實(shí)用技巧

  • 性能優(yōu)先:處理海量數(shù)據(jù)或需要高頻實(shí)時(shí)更新時(shí),PlotWidget是理想選擇 。
  • 理解層次:明確 PlotWidget(容器) 、PlotItem(圖表管理) 和 ViewBox(數(shù)據(jù)視圖) 的分工,有助于解決復(fù)雜問(wèn)題 。
  • 善用示例:通過(guò)運(yùn)行 import pyqtgraph.examples; pyqtgraph.examples.run()來(lái)探索大量現(xiàn)成案例 。

擴(kuò)展

PlotWidget是如何體現(xiàn)GraphicsView、GraphicsScene、GraphicsItem這三個(gè)核心組件交互的

PlotWidget 的精妙之處在于,它作為一個(gè)高度集成的高級(jí)組件,將 Qt Graphics View 框架中三個(gè)核心組件——GraphicsView(視圖)、GraphicsScene(場(chǎng)景)和 GraphicsItem(圖元)的復(fù)雜交互封裝了起來(lái),為我們提供了一個(gè)開(kāi)箱即用、功能強(qiáng)大的繪圖界面。

為了更直觀地理解這三者是如何在 PlotWidget 內(nèi)部協(xié)同工作的,我們可以參考下面的協(xié)作流程圖:

下面我們來(lái)詳細(xì)解讀這個(gè)協(xié)作過(guò)程。

核心交互流程

1. 視圖(GraphicsView):交互的窗口

PlotWidget 本身繼承自 GraphicsView,它充當(dāng)了觀察窗口的角色。

  • 職責(zé):負(fù)責(zé)將不可見(jiàn)的場(chǎng)景內(nèi)容可視化顯示在屏幕上,并處理最基礎(chǔ)的鼠標(biāo)縮放、平移、鍵盤事件等用戶交互。
  • 在PlotWidget中的體現(xiàn):當(dāng)你創(chuàng)建一個(gè) PlotWidget 時(shí),就已經(jīng)創(chuàng)建了一個(gè)“準(zhǔn)備好了”的視圖窗口。你無(wú)需手動(dòng)創(chuàng)建 QGraphicsView,PlotWidget 已經(jīng)包含了它。

2. 場(chǎng)景(GraphicsScene):圖元的舞臺(tái)

PlotWidget 內(nèi)部自動(dòng)創(chuàng)建并管理著一個(gè) PlotItem(它本身是一種特殊的 GraphicsItem),而 PlotItem又包含一個(gè) ViewBox和一個(gè)默認(rèn)的 GraphicsScene。

  • 職責(zé)GraphicsScene是一個(gè)不可見(jiàn)的容器和管理者。它不負(fù)責(zé)繪制,而是管理所有添加到其中的圖元(GraphicsItem),處理事件的派發(fā)(比如將鼠標(biāo)點(diǎn)擊事件傳遞給正確的圖元),并管理圖元的狀態(tài)(如選擇狀態(tài))。
  • 在PlotWidget中的體現(xiàn):當(dāng)你調(diào)用 PlotWidget.plot()方法繪制一條曲線時(shí),曲線(一個(gè) PlotDataItem)實(shí)際上是被添加到了這個(gè)內(nèi)部的場(chǎng)景中。場(chǎng)景負(fù)責(zé)維護(hù)這條曲線和其他所有圖元(如坐標(biāo)軸、網(wǎng)格、標(biāo)簽)的層次和關(guān)系。

3. 圖元(GraphicsItem):真正的內(nèi)容

在場(chǎng)景中顯示的每一個(gè)獨(dú)立元素都是一個(gè)圖元。

  • 職責(zé):這是具體的內(nèi)容繪制者。一條曲線、一個(gè)數(shù)據(jù)點(diǎn)、一段文字、一個(gè)坐標(biāo)軸刻度,都可以是單獨(dú)的圖元。它們知道自己如何被繪制(通過(guò)重寫(xiě) paint()方法),并能響應(yīng)發(fā)生在其自身范圍內(nèi)的事件。
  • 在PlotWidget中的體現(xiàn)PlotWidget.plot()方法會(huì)創(chuàng)建并返回一個(gè) PlotDataItem(它是 GraphicsItem的子類),它就是你看到的那條曲線。同樣,坐標(biāo)軸(AxisItem)、圖例等也都是圖元。
協(xié)作實(shí)例:一次鼠標(biāo)點(diǎn)擊的旅程

假設(shè)你在 PlotWidget 的曲線圖上點(diǎn)擊了一下鼠標(biāo),這個(gè)過(guò)程清晰地展示了三者的協(xié)作:

  • 視圖接收PlotWidget(作為 GraphicsView)首先接收到原始的鼠標(biāo)點(diǎn)擊視圖坐標(biāo)(以像素為單位,原點(diǎn)在視圖左上角)。
  • 坐標(biāo)轉(zhuǎn)換PlotWidget使用 mapToScene()函數(shù)將視圖坐標(biāo)轉(zhuǎn)換為場(chǎng)景坐標(biāo)。
  • 事件派發(fā):轉(zhuǎn)換后的事件被傳遞給內(nèi)部的 GraphicsScene
  • 定位圖元GraphicsScene根據(jù)場(chǎng)景坐標(biāo),查詢哪個(gè)(些)圖元位于點(diǎn)擊位置之下(例如,你的曲線圖元),這就是所謂的碰撞檢測(cè)。
  • 圖元響應(yīng):事件被派發(fā)給命中了的曲線圖元(PlotDataItem)。這個(gè)圖元可以觸發(fā)相應(yīng)的動(dòng)作,例如發(fā)射一個(gè)包含點(diǎn)擊位置數(shù)據(jù)坐標(biāo)的信號(hào),或者改變自身外觀以示被選中。
開(kāi)發(fā)者視角的簡(jiǎn)化

對(duì)于我們開(kāi)發(fā)者而言,PlotWidget 的偉大之處在于它將底層交互封裝成了簡(jiǎn)單的 API。在絕大多數(shù)情況下,你不需要直接操作 GraphicsScene或底層的 GraphicsItem。

  • 添加內(nèi)容:使用 PlotWidget.plot(), PlotWidget.addItem()等方法。PlotWidget 會(huì)幫你處理將這些圖元添加到正確場(chǎng)景的一切事宜。
  • 設(shè)置樣式:直接調(diào)用 PlotWidget的方法,如 setBackground(), showGrid(), setLabel()。這些調(diào)用最終都會(huì)由 PlotWidget 傳遞給內(nèi)部對(duì)應(yīng)的場(chǎng)景和圖元(如坐標(biāo)軸圖元)來(lái)執(zhí)行。
  • 獲取內(nèi)部組件:在需要更高級(jí)控制時(shí),你可以通過(guò) PlotWidget.getPlotItem(), PlotWidget.getViewBox(), PlotWidget.scene()等方法來(lái)獲取內(nèi)部的組件,從而進(jìn)行深度定制。

總結(jié)

簡(jiǎn)單來(lái)說(shuō),PlotWidget 是一個(gè)“導(dǎo)演”,它搭建了一個(gè)完整的演出舞臺(tái)(整合了 Scene 和 View),并提供了豐富的“劇本”(API)。而我們開(kāi)發(fā)者就像“制片人”,只需要下達(dá)指令(“在這里畫(huà)一條正弦曲線”),導(dǎo)演就會(huì)指揮演員(GraphicsItem)在舞臺(tái)上的正確位置進(jìn)行表演,并處理好觀眾(用戶)與演員之間的所有互動(dòng)。

希望這些介紹能幫助你更好地理解和使用 PlotWidget。它是一個(gè)在功能、易用性和性能之間取得了出色平衡的工具,非常適合用于構(gòu)建交互式科學(xué)計(jì)算應(yīng)用程序的圖形界面。

到此這篇關(guān)于PyQtGraph中的PlotWidget基本使用和代碼示例的文章就介紹到這了,更多相關(guān)PyQtGraph PlotWidget使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

云和县| 吴江市| 东阿县| 弥渡县| 航空| 马公市| 江西省| 阜阳市| 朝阳区| 平乐县| 巢湖市| 嘉义市| 松滋市| 亳州市| 金昌市| 呼和浩特市| 河西区| 宁国市| 马尔康县| 平阴县| 永顺县| 石渠县| 康定县| 久治县| 新和县| 潼关县| 新竹市| 喀喇| 泊头市| 吉木乃县| 龙游县| 农安县| 河北区| 珠海市| 宿州市| 双柏县| 南丹县| 湖口县| 五大连池市| 鲜城| 象州县|