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 应用程序中的实例。希望本文对您有所帮助,谢谢阅读!