matplotlib在pyqt5中的集成

一份pyqt5集成mpl示例

一份来自stackoverflow的demo开始:

# -*- 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的支持

  1. 需要先声明常规matplotlib的figure
  2. 以figure为参数绑定声明canvas, 其可以作为组件被安排在QVBoxLayout()中
  3. 在确定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()

GUI结果示例
如图, 我们又观测到了一波小规模上下插针(笑)

一些问题

  • 小bug:默认窗口的plot会存在显示不全的问题, 手动改变窗口尺寸会自动修复这个问题
  • 命令行warning: libpng warning: iCCP: known incorrect sRGB profile
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在PyQt5的GUI呈现matplotlib的图片主要有两种方法:使用Qt Widgets和使用Qt Quick。 使用Qt Widgets时,可以使用QWidget来创建一个显示matplotlib图片的窗口。首先,需要在PyQt5matplotlib的图形转换为Qt的图像格式。可以使用FigureCanvasQTAgg类将matplotlib图形转换为Qt图像格式,然后使用matploblib的绘图函数绘制图形。 以下是一个简单的示例代码: ``` import sys import matplotlib.pyplot as plt from PyQt5.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QWidget from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas class MyMainWindow(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle('Matplotlib in PyQt5') # 创建绘图区域 fig = plt.figure() axes = fig.add_subplot(111) axes.plot([1, 2, 3, 4, 5], [1, 2, 3, 4, 5]) # 创建图像画布 canvas = FigureCanvas(fig) # 创建主窗口布局 layout = QVBoxLayout() layout.addWidget(canvas) # 创建主窗口窗口部件 main_widget = QWidget() main_widget.setLayout(layout) # 将主窗口部件设置为主窗口的央部件 self.setCentralWidget(main_widget) if __name__ == '__main__': app = QApplication(sys.argv) window = MyMainWindow() window.show() sys.exit(app.exec_()) ``` 运行该代码将显示一个包含matplotlib图形的PyQt5主窗口。 使用Qt Quick时,可以使用QQuickWidget来创建一个能够显示matplotlib图片的窗口。首先,需要创建一个QQuickView,并使用setSource()方法将QML文件设置为PyQt5主窗口的内容,确保在主窗口以正确的方式集成matplotlib图形。 以下是一个简单的示例代码: ``` import sys import matplotlib.pyplot as plt from PyQt5.QtWidgets import QApplication from PyQt5.QtQuick import QQuickView from PyQt5.QtGui import QGuiApplication from PyQt5.QtCore import QUrl if __name__ == '__main__': app = QApplication(sys.argv) # 创建matplotlib图形 fig = plt.figure() axes = fig.add_subplot(111) axes.plot([1, 2, 3, 4, 5], [1, 2, 3, 4, 5]) # 将matplotlib图形保存为文件 fig.savefig('plot.png') # 创建Qt Quick窗口 view = QQuickView() view.setSource(QUrl.fromLocalFile('mainwindow.qml')) # 将matplotlib图像文件路径作为图像URL传递到QML文件 view.rootContext().setContextProperty("imagePath", "plot.png") # 显示窗口 view.show() # 运行应用程序 sys.exit(app.exec_()) ``` 同时,需要在根QML文件(例如mainwindow.qml)添加一个Image元素,并将matplotlib图像的文件路径作为URL传递给该元素的source属性,以在窗口显示matplotlib图像。 综上所述,以上是在PyQt5的GUI使用matplotlib呈现图片的两种常见方法。 ### 回答2: 在PyQt5使用Matplotlib库可以在GUI应用程序的主窗口呈现图片。以下是一个简单的示例代码: ``` import sys from PyQt5.QtWidgets import QApplication, QMainWindow, QHBoxLayout, QWidget from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas from matplotlib.figure import Figure class MainWindow(QMainWindow): def __init__(self): super().__init__() # 创建一个Matplotlib图形对象 fig = Figure() # 创建一个使用Matplotlib图形对象的画布 canvas = FigureCanvas(fig) # 获取Matplotlib图形对象的绘图区域 axes = fig.add_subplot(111) # 在绘图区域绘制一条直线 x = [1, 2, 3, 4, 5] y = [1, 3, 2, 4, 5] axes.plot(x, y) # 创建一个水平布局,并将画布添加到布局 layout = QHBoxLayout() layout.addWidget(canvas) # 创建一个QWidget小部件,并将布局设置为其布局 widget = QWidget() widget.setLayout(layout) # 将QWidget小部件设置为主窗口的央小部件 self.setCentralWidget(widget) # 创建一个应用程序对象 app = QApplication(sys.argv) # 创建一个主窗口对象 window = MainWindow() window.show() # 运行应用程序 sys.exit(app.exec_()) ``` 以上代码创建了一个带有Matplotlib图形的主窗口。我们首先导入了必要的模块,然后定义了一个继承自QMainWindow的MainWindow类。在MainWindow类的初始化方法,我们创建了一个Matplotlib图形对象和一个使用该图形对象的画布。然后,我们使用add_subplot方法获取图形对象的绘图区域,并在该绘图区域绘制了一条直线。接下来,我们创建了一个水平布局并将画布添加到布局。然后,我们创建了一个QWidget小部件并将布局设置为其布局。最后,我们将QWidget小部件设置为主窗口的央小部件,并展示了主窗口。 通过运行以上代码,我们可以在GUI的主窗口看到Matplotlib绘制的图像。 ### 回答3: 在PyQt5,可以使用matplotlib库将图形呈现在GUI的主窗口。首先,我们需要导入必要的模块: ```python from PyQt5.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QWidget from PyQt5.QtCore import Qt from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas from matplotlib.figure import Figure ``` 然后,我们可以创建一个自定义的主窗口类,并在其构造函数设置布局和图形内容: ```python class MainWindow(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("PyQt5-Matplotlib") # 创建一个用于显示图形的Matplotlib画布 self.figure = Figure() self.canvas = FigureCanvas(self.figure) # 在画布上创建一个子图,并绘制图形 ax = self.figure.add_subplot(111) ax.plot([1, 2, 3, 4, 5], [1, 4, 9, 16, 25]) ax.set_xlabel("x") ax.set_ylabel("y") ax.set_title("matplotlib示例") # 将画布添加到窗口的布局 layout = QVBoxLayout() layout.addWidget(self.canvas) layout.setAlignment(Qt.AlignTop) # 创建一个用于显示布局的Widget,并将其设置为主窗口的心部件 widget = QWidget() widget.setLayout(layout) self.setCentralWidget(widget) ``` 最后,我们需要在主程序创建应用程序实例,并显示主窗口: ```python if __name__ == "__main__": app = QApplication([]) window = MainWindow() window.show() app.exec() ``` 运行程序后,将会在GUI的主窗口显示一个带有matplotlib图形的画布。您可以根据自己的需要定制图形的类型、样式和布局。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值