一、介紹
1.1 什么是pyqtgraph?
PyQtGraph是Python的圖形和用戶界面庫,它充分利用PyQt和PtSide的高質量的圖形表現水平和NumPy的快速科學計算與處理能力,在數學、科學和工程領域都有廣泛的應用。 其主要目標是:
為數據(繪圖,視頻等)提供快速可交互式圖形顯示。
提供幫助快速開發應用程序的工具(例如,Qt Designer中使用的屬性樹)。
PyQtGraph被大量應用於Qt GUI平台(通過PyQt或PySide),因為它的高性能圖形和numpy可用於大量數據處理。 特別注意的是,pyqtgraph使用了Qt的GraphicsView框架,它本身是一個功能強大的圖形系統; 我們將最優化和簡化的語句應用到這個框架中,以最小的工作量實現數據可視化。
支持Linux,Windows和OSX系統
1.2 它可以做什么?
pyqtgraph的核心特征是:
基本的2D交互視圖中框繪制
線和散點圖
數據可平移/縮放鼠標
實時數據的顯示和交互的快速繪制
圖像顯示與互動的查找表和電平控制
顯示所有數據類型(int或float;任何比特深度;RGB,RGBA,或亮度)
切片的多維圖像任意角度的函數
快速更新的視頻顯示和實時交互
三維圖形系統(需要Python OpenGL綁定)
體積數據的渲染
三維表面和散點圖
網格的等值面生成渲染
交互式視口旋轉/縮放鼠標
更容易編程的基本的3D場景圖
數據選擇/標記和感興趣的控制區
交互標記垂直/水平的地塊的位置和區域
從圖像中選擇任意區域的部件和自動切片數據匹配
1.3 例子
PyQtGraph包含一系列可通過運行來訪問的示例:
import pyqtgraph.examplespyqtgraph.examples.run()
運行結果:
這將啟動一個啟動器並列出可用的示例。 從列表中選擇一個項目以查看其源代碼,然后雙擊一個項目以運行該示例。 注意如果你已經用python setup.py開發安裝pyqtgraph,那么這些例子就會被錯誤地提示為top-level module。 在這種情況下,使用導入示例:examples.run()。
1.4 與其他繪圖庫對比
matplotlib:對於繪圖而言,pyqtgraph幾乎不像matplotlib完整或者成熟,但運行速度更快。 Matplotlib的目標更多是制作出版質量的圖形,而pyqtgraph則用於數據采集和分析應用。Matplotlib對於matlab程序員來說更直觀。pyqtgraph對python/qt程序員更直觀。Matplotlib(據我所知)並不包含許多pyqtgraph的功能,如圖像交互,體繪制,參數樹,流程圖等。
pyqwt5:大概和pyqwt5一樣快,但對繪圖功能來說不完全一樣。 pyqtgraph中的圖像處理更完整(同樣,qwt中沒有ROI小部件)。 另外,pyqtgraph是用純python編寫的,所以它比pyqwt更易於移植,pyqwt在開發中經常落后於pyqt(我最初使用pyqwt,但認為在我的項目中依賴它是太麻煩了)。 就像matplotlib一樣,pyqwt(據我所知)並不包含很多pyqtgraph的特性,比如圖像交互,體積渲染,參數樹,流程圖等。
二、鼠標交互
大多數使用pyqtgraph數據可視化的應用程序都會生成可交互縮放,平移和使用鼠標配置的小部件。 本節介紹鼠標與這些小部件的交互。
2.1二維圖形
在pyqtgraph中,大多數2D可視化遵循以下鼠標交互:
左鍵:與場景中的項目交互(選擇/移動對象等)。 如果鼠標光標下沒有可移動的物體,那么用左邊的按鈕拖動就會平移場景。
右鍵拖動:縮放場景。 水平拖動左/右縮放; 向上/向下拖動垂直縮放(盡管某些場景將其x / y縮放比例鎖定在一起)。 如果在場景中有x / y軸可以閃動,那么右鍵拖動軸會影響該軸。
右鍵單擊:在大多數情況下單擊右鍵將根據鼠標光標下的對象顯示具有各種選項的上下文菜單。
中間按鈕(或滾輪)拖動:按下滾輪拖動鼠標將始終平移場景(在場景中其他對象阻止左側平移的情況下,此功能非常有用)。
輪旋轉:放大和縮小場景。
對於使用右側或中間按鈕拖動很困難的機器(通常是Mac),存在另一種鼠標交互模式。 在此模式下,用鼠標左鍵拖動可在場景的某個區域上繪制一個框。 按鈕釋放后,場景將縮放並平移以適合框。 可以在上下文菜單中或通過調用以下方式訪問此模式:
pyqtgraph.setConfigOption('leftButtonPan', False)
2.2 上下文菜單
右鍵單擊大多數場景將顯示一個上下文菜單,其中包含用於更改場景行為的各種選項。 這個菜單中的一些選項是:
數據范圍變化時啟用/禁用自動縮放
將多個視圖的軸鏈接在一起
啟用禁用每個軸的鼠標交互
顯式設置可見范圍值
菜單中可用的確切項目取決於場景的內容和點擊的對象。
2.3 三維圖形
3D可視化使用以下鼠標交互:
左鍵拖動:圍繞中心點旋轉場景
中間按鈕拖動:通過移動x-y平面內的中央“查看”點來平移場景
中間按鈕拖動+ CTRL:通過沿z軸移動中央“查看”點來平移場景
滾輪旋轉:放大/縮小
車輪+ CTRL:改變視場角
鍵盤控制:
箭頭鍵圍繞中心點旋轉,就像拖動鼠標左鍵一樣
三、如何使用pyqtgraph?
這里有幾個建議使用pyqtgraph的方法:
從交互式shell(python -i,ipython等)
顯示應用程序的彈出窗口
將小部件嵌入到PyQt應用程序中
3.1 使用命令行
PyQtGraph使得從命令行可視化數據變得非常容易。注意:
這個例子就是告訴你有兩個主要的函數:pg.plot,pg.image。一個畫曲線,一個畫圖像。
import numpy as npimport pyqtgraph as pg data = np.random.normal(size=1000)pg.plot(data, title="Simplest possible plotting example")# data can be a list of values or a numpy array data = np.random.normal(size=(500,500))pg.image(data, title="Simplest possible image example")# data can be a list of values or a numpy array ## Start Qt event loop unless running in interactive mode or using pyside.if __name__ == '__main__': import sys if sys.flags.interactive != 1 or not hasattr(QtCore, 'PYQT_VERSION'): pg.QtGui.QApplication.exec_()
運行結果:
上面的例子將打開一個窗口,顯示給定數據的線圖。 對pg.plot的調用返回創建的繪圖窗口小部件的句柄,從而允許將更多數據添加到同一個窗口。 注意:python提示符中的交互式繪圖僅適用於PyQt; 在交互式提示符運行時,PySide不運行Qt事件循環。 如果你想與PySide交互使用pyqtgraph,請參閱'console'示例。
其他例子:
pw = pg.plot(xVals, yVals, pen='r') # plot x vs y in redpw.plot(xVals, yVals2, pen='b') win = pg.GraphicsWindow() # Automatically generates grids with multiple itemswin.addPlot(data1, row=0, col=0)win.addPlot(data2, row=0, col=1)win.addPlot(data3, row=1, col=0, colspan=2) pg.show(imageData) # imageData must be a numpy array with 2 to 4 dimensions
我們在這里只是展示最基本的用法 - 這些函數接受許多不同的數據格式和選項來自定義數據的外觀。
3.2 在應用程序中顯示窗口
雖然我認為這種方法有些懶惰,但“懶惰”往往與“高效”無法區分。 這里的方法很簡單,就是使用與命令行相同的功能,但是在現有的應用程序中使用。 當我只是想立即獲得關於應用程序中數據狀態的反饋時,我經常使用它,而無需花時間為其構建用戶界面。
3.3 在PyQt應用程序中嵌入小部件
對於認真的應用程序開發人員來說,pyqtgraph中的所有功能都可以通過像其他任何Qt小部件一樣嵌入來使用。 更多的重要信息,請參閱:lotWidget,ImageView,GraphicsLayoutWidget和GraphicsView。 PyQtGraph的小部件可以通過“Promote To ...”功能包含在Designer的ui文件中:
Designer中,創建一個QGraphicsView小部件(“Graphics View”類別下的“Display Widgets”)。
用鼠標右鍵單擊QGraphicsView並選擇““Promote To...”。
在“Promoted calss name”下,輸入您希望使用的類名稱(“PlotWidget”,“GraphicsLayoutWidget”等)。
在“Header file”下,輸入“pyqtgraph”。
點擊“Add”,然后點擊“Promote”。
有關promoting widgets的更多信息,請參閱設計器文檔。“VideoSpeedTest”和“ScatterPlotSpeedTest”示例都演示了如何使用pyui4或pyside-uic編譯為.py模塊的.ui文件。“designerExample”示例演示從.ui文件動態生成python類(不需要pyuic4 / pyside-uic)。
3.4 PyQt and PySide
PyQtGraph支持兩種常用的Qt庫python包:PyQt和PySide。 這兩個軟件包提供了幾乎相同的API和功能,但由於各種原因,您可能更喜歡使用一個軟件包或其他軟件包。 當第一次導入pyqtgraph時,它會通過一下檢測來確定使用哪個庫:
如果PyQt4已經導入,請使用它
否則,如果PySide已經導入,就使用它
否則,嘗試導入PyQt4
如果導入失敗,請嘗試導入PySide。
如果你的系統上已經安裝了這兩個庫,並且你想強制pyqtgraph使用其中一個或者另一個,只需確保它在pyqtgraph之前被導入:
import PySide ## this will force pyqtgraph to use PySide instead of PyQt4 import pyqtgraph as pg
3.5 將PyQtGraph庫導入到大型項目中
在編寫使用pyqtgraph的應用程序或python包時,通常在系統范圍內(或在virtualenv中)安裝pyqtgraph,並在應用程序內調用import pyqtgraph。 這樣做的主要好處是pyqtgraph是獨立於應用程序進行配置的,因此您(或您的用戶)可以自由安裝較新版本的pyqtgraph,而無需在應用程序中更改任何內容。 這是用python開發時的標准做法。
然而,特別是對於科學應用來說,情況也是如此,即軟件是為特定目的而編寫的,然后進行存檔。如果我們想要確保軟件在十年后仍能正常工作,那么最好將應用程序綁定到一個特定版本的pyqtgraph上,並避免導入系統安裝的pyqtgraph版本,這可能會更新(可能不兼容)。尤其當應用程序需要對主要版本中可能不存在的pyqtgraph軟件包進行特定的修改時,情況如此。
PyQtGraph通過兩種機制來促進這種用法。首先,pyqtgraph中的所有內部導入語句都是相對的,它允許將包重命名或用作子包,而不會與系統中其他版本的pyqtgraph產生任何命名沖突(即,pyqtgraph從未在內部將其自身稱為“pyqtgraph ”)。其次,可以在 https://github.com/pyqtgraph/pyqtgraph-core.git 找到一個git樹狀子目錄存儲庫,它只包含'pyqtgraph /'樹狀子目錄,允許將代碼直接克隆為使用它的應用程序的子目錄。
基本的方法是將存儲庫克隆到包中的適當位置。從包中導入pyqtgraph時,一定要使用全名來避免導入任何系統安裝的pyqtgraph包。例如,假設一個簡單的項目具有以下結構:
my_project/ __init__.py plotting.py """Plotting functions used by this package""" import pyqtgraph as pg def my_plot_function(*data): pg.plot(*data)
要導入特定版本的pyqtgraph,我們將克隆項目中的pyqtgraph-core存儲庫:
my_project$ git clone https://github.com/pyqtgraph/pyqtgraph-core.git
然后相應地調整導入語句:
my_project/ __init__.py pyqtgraph/ plotting.py """Plotting functions used by this package""" import my_project.pyqtgraph as pg # be sure to use the local subpackage # rather than any globally-installed # versions. def my_plot_function(*data): pg.plot(*data)
使用 git checkout pyqtgraph-core-x.x.x 選擇特定版本的存儲庫,或使用 git pull 從上游拉取pyqtgraph更新(有關更多信息,請參閱git文檔)。
對於已經使用git進行代碼控制的項目,也可以在你自己的倉庫中包含pyqtgraph作為git樹狀子目錄。 這種方法的主要優點是,除了能夠從上游存儲庫中獲取pyqtgraph更新之外,還可以將本地pyqtgraph更改提交到項目存儲庫並向上游推送這些更改:
my_project$ git remote add pyqtgraph-core https://github.com/pyqtgraph/pyqtgraph-core.gitmy_project$ git fetch pyqtgraph-coremy_project$ git merge -s ours --no-commit pyqtgraph-core/coremy_project$ mkdir pyqtgraphmy_project$ git read-tree -u --prefix=pyqtgraph/ pyqtgraph-core/coremy_project$ git commit -m "Added pyqtgraph to project repository"
有關更多信息,請參閱 git subtree 文檔。
四、安裝
根據您的需要,有許多不同的方式來安裝pyqtgraph:
$ pip install pyqtgraph
有些用戶可能需要調用pip3。 這種方法應該適用於所有平台。
有些用戶可能需要調用pip3。 這種方法應該適用於所有平台。
要訪問最新的功能和bug,請從github復制pyqtgraph:
$ git clone https://github.com/pyqtgraph/pyqtgraph
現在你可以從源代碼安裝pyqtgraph:
$ python setup.py install
..或者你可以簡單地把pyqtgraph文件夾放置在可導入的地方,比如在另一個項目的根目錄中。 PyQtGraph不需要以任何方式“built”或編譯。
..或者你可以簡單地把pyqtgraph文件夾放置在可導入的地方,比如在另一個項目的根目錄中。 PyQtGraph不需要以任何方式“built”或編譯。
pyqtgraph的軟件包還有其他幾種形式:
Anaconda:conda install pyqtgraph
Debian,Ubuntu和類似的Linux:使用 apt install python-pyqtgraph 或下載在pyqtgraph官網網頁頂部的.deb文件。
Arch Linux:安裝包(感謝 windel)。(https://aur.archlinux.org/packages.php?ID=62577)
Windows:在pyqtgraph官網頂部下載.exe安裝程序文件。
五、配置
Debian,Ubuntu和類似的Linux:使用 apt install python-pyqtgraph 或下載在pyqtgraph官網網頁頂部的.deb文件。
Arch Linux:安裝包(感謝 windel)。(https://aur.archlinux.org/packages.php?ID=62577)
Windows:在pyqtgraph官網頂部下載.exe安裝程序文件。
五、配置
PyQtGraph依賴於:
Python 2.7 or Python 3.x
A Qt library such as PyQt4, PyQt5, or PySide
numpy
滿足這些配置的最簡單方法是使用pip或像Anaconda這樣的科學Python發行版。
六、Qt 快速教學
幾乎所有的PyQtGraph庫的圖形界面都是由Qt來生成。 Qt的文檔寫得很好,我們鼓勵所有pyqtgraph開發人員熟悉它。 本節的目的是介紹如何使用Qt(使用PyQt或PySide)編寫pyqtgraph開發者程序。
6.1 窗口和布局
Qt GUI幾乎都是由幾個基本組件組成:
一個窗口。 這通常由QMainWindow提供,但請注意,如果窗口小部件沒有父窗口,只需調用widget.show(),就可以在窗口中顯示所有QWidgets。
多個QWidget實例,如QPushButton,QLabel,QComboBox等
QLayout實例(可選,但強烈鼓勵),它可以自動管理窗口小部件的位置,同時允許GUI以可調整的方式調整大小。
PyQtGraph通過提供自己的QWidget子類插入到你的GUI中來適應這個方案。
例如:
from PyQt4 import QtGui # (the example applies equally well to PySide)import pyqtgraph as pg## Always start by initializing Qt (only once per application)app = QtGui.QApplication([])## Define a top-level widget to hold everythingw = QtGui.QWidget()## Create some widgets to be placed insidebtn = QtGui.QPushButton('press me')text = QtGui.QLineEdit('enter text')listw = QtGui.QListWidget()plot = pg.PlotWidget()## Create a grid layout to manage the widgets size and positionlayout = QtGui.QGridLayout()w.setLayout(layout)## Add widgets to the layout in their proper positionslayout.addWidget(btn, 0, 0) # button goes in upper-leftlayout.addWidget(text, 1, 0) # text edit goes in middle-leftlayout.addWidget(listw, 2, 0) # list widget goes in bottom-leftlayout.addWidget(plot, 0, 1, 3, 1) # plot goes on right side, spanning 3 rows## Display the widget as a new windoww.show()## Start the Qt event loopapp.exec_()
運行結果:
更復雜的界面可以使用Qt Designer進行圖形化設計,它可以簡單的拖拽小部件到窗口中定義其外觀。
6.2 命名約定
事實上pyqtgraph中的每個類都是Qt提供的基類的擴展。 在閱讀文檔時,請記住Qt的所有類都以字母“Q”開頭,而pyqtgraph的類沒有。 在閱讀任何類的方法時,這樣通常有助於查看使用了哪些Qt基類,然后查看Qt文檔。
大多數Qt的類都定義了很難區別於常規方法的信號。幾乎所有由pyqtgraph定義的信號顯示都以’sig’開頭,表示這些信號不是在Qt級定義。
在大多數情況下,以’Widget’結尾的類都是QWidget的子類,因此可以用作Qt窗口中的GUI元素。 以’Item’結尾的類是QGraphicsItem的子類,只能在QGraphicsView實例(如GraphicsLayoutWidget或PlotWidget)中顯示。
6.3 信號、槽和事件
Qt通過執行其事件循環來檢測用戶交互並對其做出反應。
事件循環中發生了什么?
我什么時候需要使用QApplication.exec_()?
我對事件循環執行有什么控制?(QApplication.processEvents)
6.4 GraphicsView and GraphicsItems
有關Qt GraphicsView體系結構的更多信息:http://qt-project.org/doc/qt-4.8/graphicsview.html
6.5 坐標系與轉換
有關Qt GraphicsView中坐標系的更多信息:http://qt-project.org/doc/qt-4.8/graphicsview.html#the-graphics-view-coordinate-system
七、在pyqtgraph中繪圖
在pyqtgraph中繪制數據有幾種基本的方法:
方法
描述
pyqtgraph.plot()
創建一個顯示數據的新圖形窗口
PlotWidget.plot()
將一組新數據添加到現有的繪圖小部件
PlotItem.plot()
將一組新數據添加到現有的繪圖小部件
GraphicsLayout.addPlot()
在網格中添加一個新的圖形
所有這些方法都接收相同的基本參數,這些參數控制如何繪制數據和顯示圖形:
描述
pyqtgraph.plot()
創建一個顯示數據的新圖形窗口
PlotWidget.plot()
將一組新數據添加到現有的繪圖小部件
PlotItem.plot()
將一組新數據添加到現有的繪圖小部件
GraphicsLayout.addPlot()
在網格中添加一個新的圖形
所有這些方法都接收相同的基本參數,這些參數控制如何繪制數據和顯示圖形:
x - 可選的X數據; 如果未指定,則會自動生成一系列整數。
y - Y數據。
pen - 繪制繪圖線時使用的筆,或者無以禁用線。
symbol - 描述用於每個點的符號形狀的字符串。 可選地,這也可以是對於每個點具有不同符號的字符串序列。
symbolPen - 繪制符號輪廓時使用的筆(或筆序列)。
symbolBrush - 填充符號時使用的畫筆(或畫筆序列)。
fillLevel - 填充曲線下面的區域為該Y值。
brush - 填充曲線時使用的筆刷。
請參閱“繪圖”示例來演示這些參數。
所有上述函數會將返回值給創建它的對象,允許進一步修改繪圖和數據。
7.1 建立繪圖類
顯示繪圖數據時有幾種類型。 大多數這些類都是自動實例化的,但了解它們是如何組織和相互關聯是非常有用的。 PyQtGraph很大程度上基於Qt的GraphicsView框架 - 如果您還不熟悉這一點,那么值得一讀(但不是必需的)。 最重要的是:1)Qt GUI由QWidgets組成,2)稱為QGraphicsView的特殊小部件用於顯示復雜圖形,3)QGraphicsItems定義在QGraphicsView中顯示的對象。
數據類(QGraphicsItem的所有子類)
PlotCurveItem - 顯示給定x,y數據的繪圖線
ScatterPlotItem - 顯示給定x,y數據的點
PlotDataItem - 組合PlotCurveItem和ScatterPlotItem。上面討論的繪圖函數創建了這種類型的對象。
容器類(QGraphicsItem的子類;包含其他QGraphicsItem對象,必須從GraphicsView中查看)
PlotItem - 包含用於顯示數據的ViewBox以及用於顯示軸和標題的AxisItems和標簽。這是一個QGraphicsItem子類,因此只能在GraphicsView中使用
GraphicsLayout - 顯示項目網格的QGraphicsItem子類。 這用於一起顯示多個PlotItem。
ViewBox - 一個用於顯示數據的QGraphicsItem子類。 用戶可以使用鼠標縮放/平移ViewBox的內容。 通常,所有PlotData / PlotCurve / ScatterPlotItems都是在ViewBox中顯示的。
AxisItem - 顯示軸值,刻度和標簽。 最常用於PlotItem。
容器類(QWidget的子類;可能嵌入在PyQt GUI中)
PlotWidget - 顯示一個PlotItem的GraphicsView的子類。 PlotItem提供的大多數方法也可以通過PlotWidget獲得。
GraphicsLayoutWidget - 顯示單個GraphicsLayoutItem的QWidget子類。 GraphicsLayoutItem提供的大多數方法也可以通過GraphicsLayoutWidget獲得。
7.2 例子
有關更多信息,請參閱pyqtgraph附帶的“plotting”和“PlotWidget”示例。
將x,y數據顯示為散點圖:
import pyqtgraph as pgimport numpy as npx = np.random.normal(size=1000)y = np.random.normal(size=1000)pg.plot(x, y, pen=None, symbol='o') ## setting pen=None disables line drawing
運行結果:
創建/顯示一個繪圖小部件,顯示三條數據曲線:
import pyqtgraph as pgimport numpy as npx = np.arange(1000)y = np.random.normal(size=(3, 1000))plotWidget = pg.plot(title="Three plot curves")for i in range(3): plotWidget.plot(x, y[i], pen=(i,3)) ## setting pen=(i,3) automaticaly creates three different-colored pens
運行結果:
八、顯示圖像和視頻
PyQtGraph將2D numpy數組顯示為圖像,並提供確定如何在屏幕上的numpy數據類型和RGB值之間進行轉換的工具。 如果要顯示常用圖像和視頻文件格式的數據,則需要先使用另一個庫(PIL適用於圖像和內置numpy轉換)加載數據。
顯示二維或三維數據最簡單的方法是使用pyqtgraph.image()函數:
import pyqtgraph as pgpg.image(imageData)
該函數將接受任何浮點數或整數數據類型,並顯示包含數據的單個ImageView小部件。 此小部件包含用於確定圖像數據如何轉換為32位RGBa值的控件。 轉換分兩步進行(兩者都是可選的):
縮放和偏移數據(通過選擇顯示的直方圖上的黑暗/亮度級別)
使用查找表將數據轉換為顏色(由漸變編輯器中顯示的顏色確定)
如果數據是3D(時間,x,y),則時間軸將顯示一個可以設置當前顯示幀的滑塊。 (如果數據中的坐標軸的排列方式不同,請使用numpy.transpose重新排列它們)
還有其他一些顯示圖像的方法:
ImageView類也可以直接實例化並嵌入到Qt應用程序中。
ImageItem的實例可以在ViewBox或GraphicsView中使用。
為了獲得更高的性能,請使用RawImageWidget。
通過調用setImage()來顯示一個新的幀,任何這些類都可以用來顯示視頻。 為了提高性能,圖像處理系統使用scipy.weave生成編譯庫。 如果您的計算機具有可用的編譯器,則編譯器將自動嘗試根據需要構建它所需的庫。 如果失敗,則會使用較慢的純Python方法。
有關更多信息,請參閱上面列出的類和’VideoSpeedTest’,’ImageItem’,’ImageView’和’HistogramLUT’示例。
九、3D圖像
PyQtGraph使用OpenGL提供3D場景圖系統。 該系統功能強大,但仍處於開發早期階段。 目前的功能包括:
帶縮放/旋轉控件的3D視圖控件(鼠標拖動和滾輪)
場景圖允許通過每項轉換和父/子關系從場景添加/刪除項目。
三角網格
基本網格計算函數:等值面,每頂點法線
體積渲染項目
網格/軸項目
基本用法示例:
from PyQt4 import QtGui## build a QApplication before building other widgetsimport pyqtgraph as pgapp = QtGui.QApplication([])pg.mkQApp()## make a widget for displaying 3D objectsimport pyqtgraph.opengl as glview = gl.GLViewWidget()view.show()## create three grids, add each to the viewxgrid = gl.GLGridItem()ygrid = gl.GLGridItem()zgrid = gl.GLGridItem()view.addItem(xgrid)view.addItem(ygrid)view.addItem(zgrid)## rotate x and y grids to face the correct directionxgrid.rotate(90, 0, 1, 0)ygrid.rotate(90, 1, 0, 0)## scale each grid differentlyxgrid.scale(0.2, 0.1, 0.1)ygrid.scale(0.2, 0.1, 0.1)zgrid.scale(0.1, 0.2, 0.1)app.exec_()
運行結果:
十、線,填充和顏色
Qt依靠它的QColor,QPen和QBrush類為所有繪圖指定線條和填充樣式。 在內部,pyqtgraph使用相同的系統,但也允許許多簡寫方法指定相同的樣式選項。
pyqtgraph中的許多函數和方法接受指定線條樣式(筆),填充樣式(筆刷)或顏色的參數。 對於大多數這些函數參數,可能會使用以下值:
表示顏色的單字符串(b,g,r,c,m,y,k,w)
(r,g,b)或(r,g,b,a)元組
單灰度值(0.0 - 1.0)
(index,maximum)元組,用於自動迭代顏色(請參閱intColor)
QColor
QPen / QBrush在適當的地方
值得注意的是,使用mkPen()/ mkBrush()函數或使用Qt的QPen和QBrush類可以輕松構建更復雜的筆和畫筆:
mkPen('y', width=3, style=QtCore.Qt.DashLine) ## Make a dashed yellow line 2px widemkPen(0.5) ## solid grey line 1px widemkPen(color=(200, 200, 255), style=QtCore.Qt.DotLine) ## Dotted pale-blue line
有關’QPen’和’PenStyle’的更多線型選項,請參閱Qt文檔,更多填充選項請參閱’QBrush’。 顏色也可以使用mkColor(),intColor(),hsvColor()或Qt的QColor類來構建。
10.1 默認背景和前景色
默認情況下,pyqtgraph為其繪圖使用黑色背景,而軸,文本和繪圖線使用灰色。 這些默認值可以使用pyqtgraph.setConfigOption()來更改:
import pyqtgraph as pg## Switch to using white background and black foregroundpg.setConfigOption('background', 'w')pg.setConfigOption('foreground', 'k')## The following plot has inverted colorspg.plot([1,4,2,3,5])
運行結果:
請注意,這必須在創建任何小部件之前設置
十一、交互式數據選擇控件
PyQtGraph包含圖形項目,允許用戶選擇和標記數據區域。
11.1 線性選擇和標記
兩個類允許標記和選擇一維數據:LinearRegionItem和InfiniteLine。 第一個類LinearRegionItem可以添加到任何ViewBox或PlotItem中,以標記水平或垂直區域。 該區域可以拖動,邊界邊緣可以獨立移動。 第二類InfiniteLine通常用於標記沿x或y軸的特定位置。 這些可能會被用戶拖動。
11.2 二維選擇和標記
要從圖像中選擇2D區域,pyqtgraph使用ROI類或其任何子類。 默認情況下,ROI只是顯示一個矩形,可以由用戶移動以標記特定區域(通常這將是圖像的區域,但這不是必需的)。 為了允許ROI被調整大小或旋轉,有幾種方法可以添加可由用戶拖動的句柄(addScaleHandle,addRotateHandle等)。 這些手柄可以放置在相對於ROI的任何位置,並且可以在任意中心點周圍縮放/旋轉ROI。 有幾個ROI子類具有各種形狀和交互模式。
要使用ROI和ImageItem自動提取圖像數據的區域,請使用ROI.getArrayRegion。 ROI類使用affineSlice函數來執行此提取。
ROI也可以用作移動/旋轉/縮放場景中的項目的控件,類似於大多數vetctor圖形編輯應用程序。
有關更多信息,請參閱ROITypes示例。
十二、導出
PyQtGraph為所有2D圖形提供各種導出格式。 有關3D圖形,請參閱下面的導出3D圖形。
12.1 從GUI導出
右鍵單擊圖形,然后從上下文菜單中選擇“導出”,即可導出任何2D圖形。 這將顯示用戶必須在其中輸出的導出對話框:
選擇要導出的項目(或整個場景)。 選擇一個項目將使該項目在原始圖形窗口中被加亮(但這個hilight將不會顯示在導出的文件中)。
選擇導出格式。
更改任何所需的導出選項。
單擊“導出”按鈕。
12.2 導出口格式
圖像 - PNG是默認格式。 支持的確切圖像格式集取決於您的Qt庫。 但是,常見的格式如PNG,JPG和TIFF幾乎總是可用的。
SVG - 作為SVG導出的圖形可以與Inkscape和Adobe Illustrator一起使用。 對於高質量的SVG導出,請使用PyQtGraph 0.9.3或更高版本。 這是從PyQtGraph生成發布圖形的首選方法。
CSV - 將繪制的數據導出為CSV。 此導出器僅在選擇PlotItem導出時才有效。
Matplotlib - 此導出器打開一個新窗口,嘗試使用matplotlib(如果可用)重新繪制數據。 請注意,某些圖形功能要么未針對此導出器實現,要么在matplotlib中不可用。 此導出器僅在選擇PlotItem導出時才有效。
打印機 - 導出到操作系統的打印服務。 此出口商是為了完整性而提供的,但由於Qt打印系統的問題而得不到很好的支持。
12.3 從API導出
要以編程方式導出文件,請按照以下示例操作:
import pyqtgraph as pgimport pyqtgraph.exporters# generate something to exportplt = pg.plot([1,5,2,4,3])# create an exporter instance, as an argument give it# the item you wish to exportexporter = pg.exporters.ImageExporter(plt.plotItem)# set export parameters if neededexporter.parameters()['width'] = 100 # (note this also affects height parameter)# save to fileexporter.export('fileName.png')
運行結果:
12.4 導出3D圖形
上述導出功能尚不適用於3D圖形。 但是,可以使用QGLWidget.grabFrameBuffer或QGLWidget.renderPixmap從GLViewWidget生成圖像:
glview.grabFrameBuffer().save('fileName.png')
有關更多信息,請參閱Qt文檔。
十三、快速GUI原型設計
[只是一個概述; 文件尚未完成]
PyQtGraph提供了一些常用於工程和科學應用的強大功能。
13.1 Parameter Trees
參數樹系統提供了一個窗口小部件,顯示一個可修改值的樹,類似於大多數GUI編輯器應用程序中使用的樹。 這允許用戶以相對較少的編程工作來控制大量變量。 該系統還提供被控制數據和控制它的用戶界面(模型/視圖架構)之間的分離。 可以將參數分組/嵌套到任何深度,並且可以通過Parameter和ParameterItem的子類化來構建自定義參數類型。
有關更多信息,請參閱 parametertree documentation。
13.2 可視化編程流程圖
PyQtGraph的流程圖提供了一個類似於概念的可視化編程環境,LabView功能模塊被添加到流程圖中並通過電線連接以定義更復雜和任意可配置的算法。 pyqtgraph包含少量預定義模塊(稱為節點),但大多數流程圖開發人員都希望定義自己的節點庫。 從本質上講,節點只不過是1)Python功能2)輸入/輸出終端列表,3)可選小部件為節點提供控制面板。 節點可以通過其終端發送/接收任何類型的Python對象。
有關詳細信息,請參閱flowchart documentation和流程圖示例。
13.3 圖形畫布
Canvas是一個系統,旨在允許用戶向2D畫布添加/刪除項目,類似於大多數矢量圖形應用程序。 可以翻譯/縮放/旋轉項目,每個項目可以定義自己的自定義控制界面。
13.4 可停靠的小部件
dockarea系統允許用戶界面的設計,用戶界面可以在運行時由用戶重新排列。 碼頭可以移動,調整大小,堆疊和撕掉主窗口。 這在原理上與Qt內置的對接系統類似,但提供了更確定的對接放置API(在Qt中,以編程方式生成復雜的對接布置非常困難)。 此外,Qt的底座設計用作窗戶外緣周圍的小面板。 PyQtGraph的底座是在整個窗口(或其任何部分)由可停靠組件組成的概念下創建的。
十四、參數樹
參數樹是用於處理參數的層次結構的系統,同時自動生成一個或多個GUI以顯示參數並與參數交互。 例如,在用戶界面設計應用程序中常見這一特征,該應用程序顯示每個小部件的可編輯屬性列表。 參數通常具有名稱,數據類型(int,float,string,color等)以及與數據類型匹配的值。 參數可以被分組和嵌套以形成層次結構,並且可以被子類化以提供自定義行為和顯示窗口小部件。
PyQtGraph的參數樹系統與Qt的某些組件使用的模型 - 視圖架構的工作方式類似:參數是純粹的數據處理類,獨立於任何圖形界面而存在。 ParameterTree是一個窗口小部件,它自動生成一個圖形界面,表示參數對象層次結構的狀態,並允許用戶編輯該層次結構中的值。 數據(模型)和圖形界面(視圖)的這種分離允許相同的數據以多種不同的方式被多次表示。
有關更多信息,請參閱pyqtgraph附帶的'parametertree'示例和API參考
ParameterTree API參考
Parameter
ParameterTree
Built-in Parameter Types
ParameterItem
十五、使用流程圖進行可視化編程
PyQtGraph的流程圖提供了一個類似於概念的可視化編程環境,LabView功能模塊被添加到流程圖中並通過電線連接以定義更復雜和任意可配置的算法。 pyqtgraph包含少量預定義模塊(稱為節點),但大多數流程圖開發人員都希望定義自己的節點庫。 從本質上講,節點只不過是1)python功能2)輸入/輸出終端列表,以及3)為節點提供控制面板的可選小部件。 節點可以通過其終端發送/接收任何類型的Python對象。
流程圖的一個主要限制是在流程圖中沒有用於循環的機制。 (但是單個節點可能包含循環(它們可能包含任何Python代碼),並且整個流程圖可以在循環內執行)。
在流程圖中有兩種不同的執行代碼的模式:
將數據提供給流程圖的輸入終端。 此方法較慢,並且在通過流程圖時將提供數據的圖形表示。 這對於調試很有用,因為它允許用戶檢查每個終端上的數據並查看流程圖中發生異常的位置。
調用Flowchart.process() 。 該方法不更新流程圖的顯示狀態,只要需要就保留每個終端的狀態。 另外,忽略對流程圖的輸出值沒有貢獻的節點(例如繪圖節點)。 該模式允許更快地處理大數據集並避免如果流程圖中一次存在太多數據(例如,當通過若干階段處理圖像數據時)可能發生的存儲器問題。
有關更多信息,請參閱流程圖示例。
API參考:
flowchart.Flowchart
flowchart.Node
flowchart.Terminal
15.1 flowchart.Flowchart
15.2 flowchart.Node
15.3 flowchart.Terminal
15.4 基本用法
流程圖在您希望用戶可以任意配置的應用程序中具有處理階段的情況下最有用。 您不必提供帶有參數的預定義算法供用戶調整,而是提供一組預定義的函數,並允許用戶按照自己喜歡的方式排列和連接這些函數。 一個非常常見的例子是在音頻/視頻處理應用中使用濾波器網絡。
首先,您必須確定流程圖的輸入和輸出變量。 創建一個為每個變量定義一個終端的流程圖:
## This example creates just a single input and a single output.## Flowcharts may define any number of terminals, though.from pyqtgraph.flowchart import Flowchartfc = Flowchart(terminals={ 'nameOfInputTerminal': {'io': 'in'}, 'nameOfOutputTerminal': {'io': 'out'}})
在上面的示例中,每個終端都由定義該終端行為的選項字典定義(有關更多信息和選項,請參閱 Terminal.__init__() )。 請注意,未鍵入終端; 任何python對象都可以從一個終端傳遞到另一個終端。
創建流程圖后,將其控件小部件添加到您的應用程序:
ctrl = fc.ctrlWidget()myLayout.addWidget(ctrl) ## read Qt docs on QWidget and layouts for more information
控件小部件提供了幾個功能:
顯示流程圖中包含每個節點的控件窗口小部件的所有節點的列表。
通過“流程圖”按鈕提供對流程圖設計窗口的訪問。
用於將流程圖保存/恢復到磁盤的接口。
此時,您的用戶可以基於內置節點庫生成流程圖。 建議為用戶提供一組默認的流程圖。
剩下的就是通過流程圖處理數據。 如上所述,有兩種方法可以做到這一點:
使用 Flowchart.setInput() 設置輸入終端的值,然后使用 Flowchart.output() 讀取輸出終端的值:
fc.setInput(nameOfInputTerminal=newValue)output = fc.output() # returns {terminalName:value}
此方法更新流程圖設計窗口中顯示的所有值,允許用戶檢查流程圖中所有終端的值,並指示處理期間發生的錯誤的位置。
調用 Flowchart.process():
調用 Flowchart.process():
output = fc.process(nameOfInputTerminal=newValue)
該方法處理數據而不更新任何顯示的終端值。 此外,使用display = False調用所有 Node.process() 方法,以請求它們不調用任何自定義顯示代碼。 這樣可以更快速地處理數據並減少內存占用,但Flowchart.process()期間發生的錯誤對於用戶來說將更難以診斷。 因此,建議使用此方法通過已使用方法1測試和調試的流程圖進行批處理。
15.5 實現自定義節點
15.5 實現自定義節點
PyQtGraph包含一個內置流程圖節點的小型庫。 該庫旨在涵蓋一些最常用的函數,並提供一些更奇特的Node類型的示例。 大多數使用流程圖系統的應用程序都會發現內置庫不足,因此需要實現自定義Node類。
節點子類至少實現:
輸入/輸出終端列表及其屬性
一個 process() 函數,它將輸入終端的名稱作為關鍵字參數,並返回一個以輸出終端的名稱為鍵的dict。
可選地,Node子類可以實現ctrlWidget()方法,該方法必須返回將在流程圖控制面板中顯示的QWidget(通常包含其他小部件)。 最小的Node子類如下所示:
class SpecialFunctionNode(Node): """SpecialFunction: short description This description will appear in the flowchart design window when the user selects a node of this type. """ nodeName = 'SpecialFunction' # Node type name that will appear to the user. def __init__(self, name): # all Nodes are provided a unique name when they # are created. Node.__init__(self, name, terminals={ # Initialize with a dict # describing the I/O terminals # on this Node. 'inputTerminalName': {'io': 'in'}, 'anotherInputTerminal': {'io': 'in'}, 'outputTerminalName': {'io': 'out'}, }) def process(self, **kwds): # kwds will have one keyword argument per input terminal. return {'outputTerminalName': result} def ctrlWidget(self): # this method is optional return someQWidget
一些節點實現了相當復雜的控件小部件,但大多數節點遵循一個簡單的形式模式:參數名列表和每個參數的單個值(表示為旋轉框,復選框等)。 為了簡化這一過程, CtrlNode 子類允許您改為定義一個簡單的數據結構,CtrlNode將使用該結構自動生成控件小部件。 這用於許多內置庫節點(尤其是過濾器)。
節點和終端還有許多其他可選參數 - 是否允許用戶添加/刪除/重命名終端,是否可以將一個終端連接到許多其他終端或僅連接一個終端等。有關更多信息,請參閱 Node 和 Terminal 類的文檔細節。
在實現新的Node子類之后,您很可能希望注冊該類,以便它出現在用戶可以從中選擇的節點菜單中:
import pyqtgraph.flowchart.library as fclibfclib.registerNodeType(SpecialFunctionNode, [('Category', 'Sub-Category')])
registerNodeType的第二個參數是元組列表,每個元組描述一個菜單位置,其中應顯示SpecialFunctionNode。
有關更多信息,請參閱FlowchartCustomNode示例。
15.5.1 調試自定義節點
在設計流程圖或自定義節點時,必須使用至少與您要處理的數據具有相同類型和結構的數據來設置流程圖的輸入(請參閱上面的 processing methods #1)。 使用 Flowchart.setInput() 時,流程圖在其設計窗口中顯示可視反饋,可以告訴您在任何終端上存在哪些數據以及處理中是否存在錯誤。 生成錯誤的節點顯示為紅色邊框。 如果選擇節點,將顯示其輸入和輸出值以及節點處理時發生的異常(如果有)。
15.6 使用沒有流程圖的節點
流程圖節點通過將功能與用於配置該功能的GUI組合在一起,在數據處理中實現了非常有用的概括。 即使在流程圖的上下文之外,這種概括也是有用的。 例如:
## We defined a useful filter Node for use in flowcharts, but would like to## re-use its processing code and GUI without having a flowchart present.filterNode = MyFilterNode("filterNodeName")## get the Node's control widget and place it inside the main windowfilterCtrl = filterNode.ctrlWidget()someLayout.addWidget(filterCtrl)## later on, process data through the nodefilteredData = filterNode.process(inputTerminal=rawData)
十六、內部 - Qt的GraphicsView的擴展
GraphicsView
GraphicsScene (鼠標事件)
GraphicsObject
GraphicsWidget
ViewBox
十七、API參考
內容:
Global Configuration Options全局配置選項
PyQtGraph的助手功能
Simple Data Display Functions
Color, Pen, and Brush Functions
Data Slicing
Coordinate Transformation
SI Unit Conversion Functions
Image Preparation Functions
Mesh Generation Functions
Miscellaneous Functions
PyQtGraph的圖形項目
PlotDataItem
PlotItem
ImageItem
GraphItem
ViewBox
LinearRegionItem
InfiniteLine
ROI
GraphicsLayout
PlotCurveItem
ScatterPlotItem
IsocurveItem
AxisItem
TextItem
ErrorBarItem
ArrowItem
FillBetweenItem
CurvePoint
CurveArrow
GridItem
ScaleBar
LabelItem
VTickGroup
LegendItem
GradientEditorItem
TickSliderItem
HistogramLUTItem
GradientLegend
ButtonItem
GraphicsObject
GraphicsWidget
GraphicsItem
UIGraphicsItem
GraphicsWidgetAnchor
PyQtGraph的小部件
PlotWidget
ImageView
dockarea module
SpinBox
GradientWidget
HistogramLUTWidget
parametertree module
ConsoleWidget
ColorMapWidget
ScatterPlotWidget
GraphicsView
DataTreeWidget
TableWidget
TreeWidget
CheckTable
ColorButton
GraphicsLayoutWidget
ProgressDialog
FileDialog
JoystickButton
MultiPlotWidget
VerticalLabel
RemoteGraphicsView
MatplotlibWidget
FeedbackButton
ComboBox
LayoutWidget
PathButton
ValueLabel
BusyCursor
PyQtGraph的3D圖形系統
GLViewWidget
GLGridItem
GLSurfacePlotItem
GLVolumeItem
GLImageItem
GLMeshItem
GLLinePlotItem
GLAxisItem
GLGraphicsItem
GLScatterPlotItem
MeshData
ColorMap色彩表
Parameter Trees
ParameterTree API Reference
QGraphicsScene和鼠標事件
GraphicsScene
HoverEvent
MouseClickEvent
MouseDragEvent
使用流程圖進行可視化編程
flowchart.Flowchart
flowchart.Node
flowchart.Terminal
Basic Use
Implementing Custom Nodes
Using Nodes Without Flowcharts
17.1 全局配置選項
PyQtGraph有幾個全局配置選項,允許您更改其默認行為。 可以使用 setConfigOptions() 和 getConfigOption() 函數訪問它們:
選項
類型
默認
leftButtonPan
bool
True
如果為True,則在ViewBox上拖動鼠標左鍵會導致視圖被平移。 如果為False,則拖動鼠標左鍵會繪制一個ViewBox將縮放到的矩形。
foreground
See
類型
默認
leftButtonPan
bool
True
如果為True,則在ViewBox上拖動鼠標左鍵會導致視圖被平移。 如果為False,則拖動鼠標左鍵會繪制一個ViewBox將縮放到的矩形。
foreground
See
mkColor()
‘d’
文本,線條,軸等的默認前景色
background
See
‘d’
文本,線條,軸等的默認前景色
background
See
mkColor()
‘k’
GraphicsView的默認背景。
antialias
bool
False
啟用抗鋸齒功能會導致以平滑邊緣繪制線條,但會降低性能。
imageAxisOrder
str
‘col-major’
對於“行主要”,圖像數據預期以標准行主(行,列)順序排列。 對於'col-major',圖像數據預期以反向列主要(列,行)順序。 向后兼容性的默認值為“col-major”,但將來可能會發生變化。
editorCommand
str or None
None
用於從ConsoleWidget調用代碼編輯器的命令。
exitCleanup
bool
True
嘗試解決PyQt和PySide中的一些退出崩潰錯誤。
useWeave
bool
False
如果可用,使用編織來加速某些操作。
weaveDebug
bool
False
如果編織編譯失敗,則打印完整錯誤消息。
useOpenGL
bool
False
在GraphicsView中啟用OpenGL。 這會對穩定性和性能產生不可預測的影響。
enableExperimental
bool
False
啟用實驗功能(好奇的人可以在代碼中搜索此密鑰)。
crashWarning
bool
False
如果為True,則打印有關可能導致崩潰的情況的警告。
1.pyqtgraph.setConfigOptions(**opts)[source]
‘k’
GraphicsView的默認背景。
antialias
bool
False
啟用抗鋸齒功能會導致以平滑邊緣繪制線條,但會降低性能。
imageAxisOrder
str
‘col-major’
對於“行主要”,圖像數據預期以標准行主(行,列)順序排列。 對於'col-major',圖像數據預期以反向列主要(列,行)順序。 向后兼容性的默認值為“col-major”,但將來可能會發生變化。
editorCommand
str or None
None
用於從ConsoleWidget調用代碼編輯器的命令。
exitCleanup
bool
True
嘗試解決PyQt和PySide中的一些退出崩潰錯誤。
useWeave
bool
False
如果可用,使用編織來加速某些操作。
weaveDebug
bool
False
如果編織編譯失敗,則打印完整錯誤消息。
useOpenGL
bool
False
在GraphicsView中啟用OpenGL。 這會對穩定性和性能產生不可預測的影響。
enableExperimental
bool
False
啟用實驗功能(好奇的人可以在代碼中搜索此密鑰)。
crashWarning
bool
False
如果為True,則打印有關可能導致崩潰的情況的警告。
1.pyqtgraph.setConfigOptions(**opts)[source]
設置全局配置選項。
每個關鍵字參數設置一個全局選項。
2.pyqtgraph.getConfigOption(opt)[source]
返回單個全局配置選項
————————————————
版權聲明:本文為CSDN博主「Suffering-」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/Eppley/article/details/82999998
————————————————
版權聲明:本文為CSDN博主「Suffering-」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/Eppley/article/details/82999998