Pyside2中嵌入Matplotlib的绘图的实现

1. 简介

Matplotlib 是 Python 编程语言及其数学扩展包 NumPy 的可视化操作界面。Matplotlib 与 Pyplot 是进行数据可视化的两个主要工具。Matplotlib 可以方便地生成各种图表,比如折线图、散点图、条形图、直方图、等高线图、等等。

在 PySide2 应用程序中嵌入 Matplotlib 图表能够提高软件的客户体验,从而更好地为用户呈现数据。接下来的文章将介绍在 PySide2 中嵌入 Matplotlib 的实现方法。

2. 安装Matplotlib

2.1 安装Matplotlib

在安装 Matplotlib 之前,需要先安装好 PySide2 库。安装 PySide2 库的方法很简单,输入以下命令即可:

pip install PySide2

安装完成后,就可以安装 Matplotlib 了,同样是使用 pip 命令:

pip install matplotlib

2.2 测试Matplotlib是否安装成功

在安装完成之后,需要测试是否安装成功。

输入以下命令,打开 PySide2 库的 widget 窗口:

from PySide2.QtWidgets import QApplication, QMainWindow

import sys

if __name__ == "__main__":

app = QApplication(sys.argv)

mainwindow = QMainWindow()

mainwindow.show()

sys.exit(app.exec_())

然后输入以下命令调用 Matplotlib 库中的 pyplot 绘图对象,并绘制一个简单的折线图:

import matplotlib.pyplot as plt

import numpy as np

x = np.linspace(0, 2*np.pi, 500)

y = np.sin(x)

plt.plot(x, y)

plt.xlabel('x')

plt.ylabel('y')

plt.title('Sin Wave')

plt.show()

如果能够看到一张正弦波形的折线图,那么说明 Matplotlib 库已经成功安装了。

3. 在PySide2中嵌入Matplotlib绘图

接下来将介绍如何在 PySide2 应用程序中嵌入 Matplotlib 绘图。

3.1 创建一个QWidget控件

在 PySide2 中创建一个窗口单元最简单的方法就是从 QWidget 类派生一个自定义窗口部件。下面是一个非常基本的 QWidget 窗口:

from PySide2.QtWidgets import QWidget

class MyWindow(QWidget):

def __init__(self):

super().__init__()

在这个例子中, __init__() 方法中调用了 MyWindow 的父类 __init__() 方法并且有 nothing 发生。请注意,您也可以添加其他的一些内容,比如创建一些控件部件。

3.2 创建一个FigureCanvas对象和Matplotlib图表对象

在 PySide2 中将 Matplotlib 绘图对象嵌入应用程序的过程是将 Matplotlib 窗口部件(FigureCanvasQtAgg)嵌入自定义窗口部件。创建 FigureCanvasQtAgg 的实例是通过处理访问 Matplotlib 中的 backends.backend_qt5agg.Qt5Agg 和 caanvas 的方式实现的。最后要记得要把 FigureCanvasQtAgg 实例添加到 QVBoxLayout 中。

接下来需要做的是在 FigureCanvasQtAgg 实例上创建一个 Matplotlib 图表。

from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas

from matplotlib.figure import Figure

class MyWindow(QWidget):

def __init__(self):

super().__init__()

self.figure = Figure()

self.canvas = FigureCanvas(self.figure)

3.3 嵌入Matplotlib画布

在将 FigureCanvas 对象嵌入自定义 QWidget 控件之前,需要将 Matplotlib 绘图对象绘制到 FigureCanvas 中。这一步是通过将 Matplotlib 图表对象作为参数传递给 FigureCanvas 绘画对象的方法进行的。因此,需要创建一个只能在 Matplotlib 图表对象中绘图的 axes 对象。

在 MyWindow 类的 __init__() 方法中添加以下代码:

from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas

from matplotlib.figure import Figure

class MyWindow(QWidget):

def __init__(self):

super().__init__()

self.figure = Figure()

self.canvas = FigureCanvas(self.figure)

self.ax = self.figure.add_subplot(111)

然后将 FigureCanvasQtAgg 实例添加到 QVBoxLayout 中:

from PySide2.QtWidgets import QVBoxLayout

class MyWindow(QWidget):

def __init__(self):

super().__init__()

self.figure = Figure()

self.canvas = FigureCanvas(self.figure)

self.ax = self.figure.add_subplot(111)

layout = QVBoxLayout()

layout.addWidget(self.canvas)

self.setLayout(layout)

3.4 在Matplotlib中绘制图表

现在可以使用 Matplotlib 对象的方法来绘制任何类型的图表了。例如,要以 Scipy Wavelet 函数为基础绘制一个简单的海浪图,需要在 MyWindow 类中添加以下代码:

import scipy

from scipy import signal

class MyWindow(QWidget):

def __init__(self):

super().__init__()

self.figure = Figure()

self.canvas = FigureCanvas(self.figure)

self.ax = self.figure.add_subplot(111)

layout = QVBoxLayout()

layout.addWidget(self.canvas)

self.setLayout(layout)

t, s = signal.twidth(signal.boxpulse, np.linspace(-2, 2, 10), 1)

fs = signal.cwt(s, signal.ricker, np.arange(1, 101))

self.ax.imshow(np.abs(fs), extent=[-2, 2, 1, 101], cmap='inferno', aspect='auto', vmax=abs(fs).max(), vmin=-abs(fs).max())

self.ax.set_title('Scipy Wavelet Example')

self.ax.grid(True)

self.canvas.draw()

总结

本文介绍了在 PySide2 应用程序中嵌入 Matplotlib 绘图的实现方法。通过创建 QWidget 控件、创建 FigureCanvas 对象和 Matplotlib 图表对象、将 FigureCanvas 对象嵌入 QWidget 中、在 Matplotlib 中绘制图表四个步骤,具体实现了 Matplotlib 绘图在 PySide2 应用程序中的实例。希望本文对您有所帮助,谢谢阅读!

后端开发标签