一份pyqt5集成mpl示例
# -*- coding: utf-8 -*-
import sys
from PyQt5.QtWidgets import QDialog, QApplication, QPushButton, QVBoxLayout
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolbar
import matplotlib.pyplot as plt
import random
class Window(QDialog):
def __init__(self, parent=None):
super(Window, self).__init__(parent)
self.figure = plt.figure()
self.canvas = FigureCanvas(self.figure)
self.toolbar = NavigationToolbar(self.canvas, self)
self.button = QPushButton('Plot')
self.button.clicked.connect(self.plot)
layout = QVBoxLayout()
layout.addWidget(self.toolbar)
layout.addWidget(self.canvas)
layout.addWidget(self.button)
self.setLayout(layout)
def plot(self):
data = [random.random() for i in range(10)]
self.figure.clear()
ax = self.figure.add_subplot(111)
ax.plot(data, '*-')
self.canvas.draw()
if __name__ == '__main__':
app = QApplication(sys.argv)
main = Window()
main.show()
sys.exit(app.exec_())
从代码中可以看出, 这都是依托于matplotlib后端对qt5的支持
- 需要先声明常规matplotlib的figure
- 以figure为参数绑定声明canvas, 其可以作为组件被安排在QVBoxLayout()中
- 在确定figure之后, 在figure中画图的操作已经脱离了qt, 要掌握plt画图, 需要对matplotlib中的figure与axis有详细了解
matplotlib画图详解
- 直接调用plt画图时, 会在最近访问的fig,ax上画图 若不存在figure, 则会默认创建一个fig
%pylab
fig, ax = plt.subplots() #同时生成fig与axes
fig1 = plt.figure()
axs = fig1.subplots(2,2) #批量生成axis, axs为2*2的axis的数组,
#fig2 = plt.figure('x') #figure可以指定名字
ax2 = fig1.add_subplot(331) #生成单个axis
# 在一个figure中, axes可以任意重叠,如图1
ax3 = plt.subplot(3,3,3) #fig没有subplot方法, 直接subplot会覆盖掉重叠的区域, 区别于fig.add_subplot
ax3.plot(np.random.rand(100))
应用:当前k线绘制
结合之前的文章, 我们开始了~ 那么首先需要做什么?
-
更改plot函数, 使其能够获取数据并画出来
-
定时调用plot()
更好地调用plot()需要使用threading与coroutine或者qt中可能存在的mainloop方法之类的, 会在下篇文章中实践
# 新的plot函数
import requests
import pandas as pd
import mpl_finance as mpf
...
def plot(self):
self.figure.clear()
ax = self.figure.add_subplot(111)
url = 'https://api.hbdm.com/market/history/kline?symbol=ETH_CQ&period=1min&size=200'
result = requests.get(url=url, timeout=2).json()['data']
k = pd.DataFrame(result)
mpf.candlestick2_ochl(ax, k['open'], k['close'], k['high'], k['low'], width=1, colorup='r',colordown='g')
self.canvas.draw()
如图, 我们又观测到了一波小规模上下插针(笑)
一些问题
- 小bug:默认窗口的plot会存在显示不全的问题, 手动改变窗口尺寸会自动修复这个问题
- 命令行warning: libpng warning: iCCP: known incorrect sRGB profile