PyQt5數據可視化


1、下載PyQtGraph模塊

Windows上下載:

pip install pyqtgraph

Linux上下載:

pip3 install pyqtgraph 

MacOS上下載:

pip3 install pyqtgraph

下載完畢后我們可以運行以下代碼:

import pyqtgraph.examples
pyqtgraph.examples.run()

 

 

 2、基礎知識與參數設置

參數 類型 默認值 解釋
leftButtonPan bool True 值為True的話,可以用鼠標左鍵來上下左右拖動圖表;若為False,拖動鼠標左鍵會形成一個矩形框,視圖鏡頭會隨之深入
foreground 參考 mkColor() ‘d’ 設置前景顏色(包括文本、線條、坐標軸等),'d'為灰色
background 參考 mkColor() ‘k’ 設置背景顏色,'k'為黑色
antialias bool False 是否啟用抗鋸齒(可以讓曲線更加光滑)
useOpenGL bool False 是否在視圖中啟用OpenGL
crashWarning bool False 則會打印針對可能導致程序崩潰情況的警告
PyQtGraph提供了兩種類似的方法來進行全局設置:

pyqtgraph.setConfigOptions(**opts) # 同時設置多項參數
pyqtgraph.getConfigOption(opt) # 只設置一項參數
我們可以這么使用:

# 禁止拖動圖表,並啟用抗鋸齒
pyqtgraph.setConfigOptions(leftButtonPan=False, antialias=True)

# 禁止拖動圖表
pyqtgraph.getConfigOption('leftButtonPan', True)
 

pyqtgraph.plot()和PlotWidget.plot()

以上兩個方法都是用來繪圖的,區別如下:

pyqtgraph.plot() 在一個新窗口中繪制數據(窗口中包含一個plotWidget)
PlotWidget.plot() 在plotWidget控件中繪制數據
可見,如果要將PyQtGraph嵌入PyQt5窗口中的話(也就是將控件添加到窗口中),應該使用PlotWidget.plot()。

plot()方法的基本參數如下:

x - X軸數據(可選)。如果沒有賦值的話,程序則自動生成特定范圍的整數值
y - Y軸數據
pen - 圖表線條的畫筆參數,若設為None則不顯示線條
symbol - 參數為字符串類型,用於描述圖表每個坐標點的形狀。比如設為'o',則坐標點的形狀就為o。可選值總共有這么幾種:'o', 's', 't', 't1', 't2', 't3','d', '+', 'x', 'p', 'h', 'star'
symbolPen - 描繪符號輪廓的畫筆參數
symbolBrush - 填充符號的畫刷參數
fillLevel - 用於計算曲線下面積的Y坐標值
brush - 用於填充曲線下面積的畫刷
示例代碼:

# 指定y坐標軸上的值,線條畫筆為紅色,坐標點符號為'o'
PlotWidget.plot([1, 2, 3, 4, 5], pen='r', symbol='o')
運行截圖(可以看到x軸坐標是自動生成的):

 

 

 

 

顏色,畫筆和畫刷

PyQt5提供了QColor,QPen和QBrush類用於描繪線條與填充顏色,而在PyQtGraph中,我們可以使用mkColor(),mkPen()以及mkBrush()方法來實例化相應的對象。

 

第一行中的單個字符串所對應的值如下:

'b': QtGui.QColor(0,0,255,255)
'g': QtGui.QColor(0,255,0,255)
'r': QtGui.QColor(255,0,0,255)
'c': QtGui.QColor(0,255,255,255)
'm': QtGui.QColor(255,0,255,255)
'y': QtGui.QColor(255,255,0,255)
'k': QtGui.QColor(0,0,0,255)
'w': QtGui.QColor(255,255,255,255)
'd': QtGui.QColor(150,150,150,255)
'l': QtGui.QColor(200,200,200,255)
's': QtGui.QColor(100,100,150,255)
顏色對象主要用於畫筆和畫刷,而這兩者的設置非常簡單:

mkPen('r')
mkPen(255, 255, 255)
mkPen((255, 255, 255, 255))
mkPen('#0000FF')
mkPen(QColor)
准確來說,能被mkColor()接受的參數都能用在mkPen()中。除了顏色我們還可以設置畫筆粗細:

mkPen(color='r', width=2)
mkPen({'color': '#0000FF', width: 2})
如果不想設置畫筆,我們可以傳入None:

mkPen(None)
畫刷設置同理,可以接受所有能被mkColor()接受的參數。可傳入None不設置畫刷。

3、實現實例說明:

#使用PyQtGraph來進行數據可視化應用

import sys
import random
import numpy as np
import pyqtgraph as pg
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QVBoxLayout


class Demo(QWidget):
def __init__(self):
super(Demo, self).__init__()
self.resize(1000, 1000)

# 1
pg.setConfigOptions(leftButtonPan=False)
pg.setConfigOption('background', 'w')
pg.setConfigOption('foreground', 'k')

# 2
x = np.arange(100)
y = np.random.normal(size=100)
r_symbol = random.choice(['o', 's', 't', 't1', 't2', 't3', 'd', '+', 'x', 'p', 'h', 'star'])
r_color = random.choice(['b', 'g', 'r', 'c', 'm', 'y', 'k', 'd', 'l', 's'])

# 3
self.pw1= pg.PlotWidget(title="繪制多條線")
#self.plot_data = self.pw.plot(x, y, pen=None, symbol=r_symbol, symbolBrush=r_color)
self.pw2 = pg.PlotWidget(title="繪制條狀圖")
self.pw3 = pg.PlotWidget(title="繪制網格線")
# 4
self.plot_btn = QPushButton('Replot', self)
self.plot_btn.clicked.connect(self.plot_slot)
self.plot_btn.clicked.connect(self.draw1)
self.plot_btn.clicked.connect(self.draw2)
self.v_layout = QVBoxLayout()
self.v_layout.addWidget(self.pw1)
self.v_layout.addWidget(self.pw2)
self.v_layout.addWidget(self.pw3)
self.v_layout.addWidget(self.plot_btn)
self.setLayout(self.v_layout)

def plot_slot(self):
x = np.arange(100)
y = np.random.normal(size=100)
r_symbol = random.choice(['o', 's', 't', 't1', 't2', 't3', 'd', '+', 'x', 'p', 'h', 'star'])
r_color = random.choice(['b', 'g', 'r', 'c', 'm', 'y', 'k', 'd', 'l', 's'])
self.pw1.plot(x, y, pen=pg.mkPen(color="r",width=5),symbol=r_symbol, symbolBrush=r_color) #如果不設后面參數則顯示點的形狀為正常點
self.pw1.plot(x, y+2, pen=(0,0,255),symbol=r_symbol, symbolBrush=r_color)
def draw1(self):
x=np.arange(10)
y1=x+1
y2=1.1*np.cos(x+0.33)
b1=pg.BarGraphItem(x=x,height=y1,width=0.3,brush="r")
b2=pg.BarGraphItem(x=x,height=y2,width=0.3,brush="g")
self.pw2.addItem(b1)
self.pw2.addItem(b2)
def draw2(self):
x=np.cos(np.linspace(0,2*np.pi,1000))
y=np.sin(np.linspace(0,4*np.pi,1000))
self.pw3.plot(x,y,pen=pg.mkPen(color="d",width=2))
self.pw3.showGrid(x=True,y=True) #顯示網格

if __name__ == '__main__':
app = QApplication(sys.argv)
demo = Demo()
demo.show()
sys.exit(app.exec_())

 
        


4、圖像導出說明

如果想要導出圖像的話,我們可以點擊右鍵,選擇export,之后就會出現一個導出選項框:

我們可以選擇導出為圖片、SVG文件、CSV文件或者重新在Matplotlib中進行繪制。選擇導出格式后,我們可以在Export options框中進行相應的設置(筆者這里就直接選擇導出為png格式的圖片了),設置好后點擊Export按鈕則會出現一個文件保存對話框:

點擊Save按鈕保存圖片,此時可能會出現以下報錯:

 

 

 

 

報錯顯示在ImageExporter.py文件中的第70行,我們根據報錯內容直接將改行代碼修改如下(將float類型轉換為int類型):

bg = np.empty((int(self.params['width']), int(self.params['height']), 4), dtype=np.ubyte)
現在已經可以成功導出

------------恢復內容結束------------

------------恢復內容結束------------


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM