python中的画图工具(PythonGUI教程十三)
python中的画图工具(PythonGUI教程十三)import pyqtgraph as pg PyQtGraph自带一个丰富的示例模块,我们在命令行中输入:pip install pyqtgraph 安装之后直接在Python代码中使用import 引入就可以使用了。各种图形绘制方案都有自己的优点,但是论与PyQt程序的融合度,还是当属PyQtGraph。PyQtGraph用于图形绘制有很多的优势:PyQtGraph的安装很简单,使用pip就可以直接安装:
本篇将会涉及:
- PyQtgraph绘图库
- 在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)获取到最新最全的使用方法和技巧。
原文出处:州的先生博客原文地址:https://zmister.com/archives/187.html