1. 程式人生 > 其它 >Python GUI教程(十三):在GUI中使用pyqtgraph繪相簿(轉載)

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中使用網路和資料庫。

文章版權所有:

(未實孫際驗證)