Python GUI教程(十三):在GUI中使用pyqtgraph繪相簿(轉載)
pyqtgraph繪相簿
在GUI中整合圖形工具是很多桌面程式常有的功能,最為普遍的,就是各種投資交易工具中的價格走勢圖。比如股票的指數走勢,股票的K線圖等。
在PyQt的應用程式中整合圖繪功能,有很多種方案,比如:
- OpenGL:一個功能強大的二維三維專業圖形繪製工具;
- Matplotlib:Python中很經典的圖形繪製模組;
- PyQtGraph:基於Qt平臺,提供互動的資料顯示圖形繪製。
各種圖形繪製方案都有自己的優點,但是論與PyQt程式的融合度,還是當屬PyQtGraph。
PyQtGraph用於圖形繪製有很多的優勢:
- 擁有豐富的圖形種類;
- 能夠快速地實時更新繪圖資料;
- 能夠進行互動式的操作;
- 多種標記功能;
- ……
PyQtGraph的安裝很簡單,使用pip就可以直接安裝:
pip install pyqtgraph
安裝之後直接在Python程式碼中使用import 引入就可以使用了。
import pyqtgraph as pg
PyQtGraph自帶一個豐富的示例模組,我們在命令列中輸入:
python -m pyqtgraph.examples
就會自動開啟示例手冊的GUI程式:
我們可以選擇執行一個示例進行執行:
前面我們說了PyQtGraph與PyQt的結合度很高,下面我們來看看在PyQt中如何呼叫PyQtGraph繪製的圖形
在GUI中整合pyqtgraph圖形
在PyQtGraph中,有幾種繪製圖形的方法:
- pyqtgraph.plot():建立一個新的繪圖視窗來顯示資料;
- PlotWidget.plot():將一組新的資料新增到現有的繪圖小部件;
- PlotItem.plot():將一組新的資料新增到現有的繪圖小部件;
- GraphicsLayout.addPlot():新增一個新的圖形到一個圖形層中;
根據PyQtGraph這幾種繪圖方式,我們在PyQt中可以在視窗部件中顯示圖形,也可以在一個新的視窗的顯示圖形。
下面我們在視窗部件中顯示茅臺股票近半年來的K線圖,作為在PyQt中整合顯示PyQtGraph圖形的例子。
首先,在我們之前建立的GUI的基礎上,新增一個選項卡,在其中放置一個VerticalLayout層佈局:
然後,按照慣例,將UI檔案轉換為Python檔案,並新建一個Python檔案引入。
根據PyQtGraph的示例,我們新建一個繪製K線圖的類CandlestickItem:
class CandlestickItem(pg.GraphicsObject):
def __init__(self, data):
pg.GraphicsObject.**init**(self)
self.data = data ## data must have fields: time, open, close, min, max
self.generatePicture()
def generatePicture(self):
self.picture = QtGui.QPicture()
p = QtGui.QPainter(self.picture)
p.setPen(pg.mkPen('w'))
w = (self.data[1][0] - self.data[0][0]) / 3.
for (t, open, close, min, max) in self.data:
p.drawLine(QtCore.QPointF(t, min), QtCore.QPointF(t, max))
if open > close:
p.setBrush(pg.mkBrush('g'))
else:
p.setBrush(pg.mkBrush('r'))
p.drawRect(QtCore.QRectF(t-w, open, w*2, close-open))
p.end()
def paint(self, p, *args):
p.drawPicture(0, 0, self.picture)
def boundingRect(self):
return QtCore.QRectF(self.picture.boundingRect())
然後,我們建立一個函式chart(),用於通過tushare模組獲取股票的歷史資料,並將資料傳入之前定義好的用於生成K線圖的類:
def chart():
hist_data = ts.get_hist_data('600519',start='2017-05-01',end='2017-11-24')
data_list = []
axis = []
for dates,row in hist_data.iterrows():
# 將時間轉換為數字
date_time = datetime.datetime.strptime(dates,'%Y-%m-%d')
t = date2num(date_time)
# t = dict(enumerate(datetime))
open,high,close,low = row[:4]
datas = (t,open,close,low,high)
data_list.append(datas)
axis.append(t)
# print(axis)
axis_dict = dict(enumerate(axis))
item = CandlestickItem(data_list)
plt = pg.PlotWidget()
# print(plt.getAxis('bottom'))
plt.addItem(item)
plt.showGrid(x=True,y=True)
return plt
接著,在GUI程式的主類MainWindow()的init(self)中進行呼叫:
class MainWindow(object):
def __init__(self):
…………
self.ui.verticalLayout_3.addWidget(chart())
…………
最後我們執行程式碼:
這樣,PyQtGraph的圖形作為一個視窗部件整合到了選項卡中。
PyQtGraph的用法和功能還有很多,大家可以在自帶的示例庫,官方文件(http://www.pyqtgraph.org/documentation/index.html),github中(https://github.com/pyqtgraph/pyqtgraph)獲取到最新最全的使用方法和技巧。
下一篇,我們將介紹在GUI中使用網路和資料庫。
文章版權所有:州的先生部落格,轉載必須保留出處及原文連結