python - 在 pyqt5 gui 中嵌入 matplotlib 图
问题描述
我正在使用 PyQt5 尝试为我的数据分析工具生成 GUI。我的问题是我不明白如何嵌入具有完整功能的 matplotlib 图。
所有关于 PyQt5 以及如何嵌入 matplotlib 的教程都展示了一种非常简单的方法,即直接在代码中创建所有图形对象。我不想这样做,因为我的 GUI 是用 Qt Designer 生成的。我创建了一个 QWidget 来在其中绘制数据。因此,我在代码中导入了 UI 文件:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import sys
import numpy as np
from PyQt5.QtGui import QPixmap
from PyQt5 import QtCore, QtWidgets
from PyQt5.QtWidgets import QMainWindow, QLabel, QGridLayout, QWidget, QTableWidget, QTableWidgetItem
from PyQt5.QtWidgets import QApplication, QWidget, QInputDialog, QLineEdit, QFileDialog
from PyQt5.QtWidgets import QPushButton
from PyQt5.QtCore import QSize
from PyQt5 import QtCore, QtGui, uic
import matplotlib
matplotlib.use('QT5Agg')
import matplotlib.pylab as plt
from matplotlib.backends.qt_compat import QtCore, QtWidgets, is_pyqt5
from matplotlib.backends.backend_qt5agg import FigureCanvas, NavigationToolbar2QT as NavigationToolbar
from matplotlib.figure import Figure
class MyWindow(QMainWindow):
def __init__(self):
super(MyWindow, self).__init__()
self.ui = uic.loadUi('test.ui', self)
# test data
data = np.array([0.7,0.7,0.7,0.8,0.9,0.9,1.5,1.5,1.5,1.5])
fig, ax1 = plt.subplots()
bins = np.arange(0.6, 1.62, 0.02)
n1, bins1, patches1 = ax1.hist(data, bins, alpha=0.6, density=False, cumulative=False)
# plot
self.plotWidget = FigureCanvas(fig)
# add toolbar
self.addToolBar(QtCore.Qt.BottomToolBarArea, NavigationToolbar(self.plotWidget, self))
#########################################
# show window
self.show()
#########################################
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
window = MyWindow()
sys.exit(app.exec_())
这是 Qt Designer 创建的 test.ui 文件:
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Form</class>
<widget class="QWidget" name="Form">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>772</width>
<height>650</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<widget class="QWidget" name="plotWidge" native="true">
<property name="geometry">
<rect>
<x>20</x>
<y>20</y>
<width>721</width>
<height>571</height>
</rect>
</property>
</widget>
</widget>
<resources/>
<connections/>
</ui>
发生的事情是我可以在我的窗口中看到一个工具栏,但现在是数据。我可以使用“保存”图标将绘图保存为图像。我认为我正在创建一个小部件对象的第二个实例,该实例与我在 Qt Designer 中创建的那个不相关。
我怎么解决这个问题?提前致谢!
解决方案
我认为您感到困惑的是,您已经创建了一个plotWidge
在 Qt Designer 中调用的小部件并且您self.plotWidget = FigureCanvas(fig)
正在替换它(即使名称一致,该操作也没有完成),因此它不会在 Qt Designer 中引起混淆更改plotWidge
,因此必须在布局的帮助下放置。content_plot
plotWidget
content_plot
测试.ui
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Form</class>
<widget class="QWidget" name="Form">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>772</width>
<height>650</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<widget class="QWidget" name="content_plot" native="true">
<property name="geometry">
<rect>
<x>20</x>
<y>20</y>
<width>721</width>
<height>571</height>
</rect>
</property>
</widget>
</widget>
<resources/>
<connections/>
</ui>
*.py
import sys
import numpy as np
from PyQt5 import QtCore, QtWidgets, uic
import matplotlib
matplotlib.use('QT5Agg')
import matplotlib.pylab as plt
from matplotlib.backends.backend_qt5agg import FigureCanvas
from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolbar
class MyWindow(QtWidgets.QMainWindow):
def __init__(self):
super(MyWindow, self).__init__()
uic.loadUi('test.ui', self)
# test data
data = np.array([0.7,0.7,0.7,0.8,0.9,0.9,1.5,1.5,1.5,1.5])
fig, ax1 = plt.subplots()
bins = np.arange(0.6, 1.62, 0.02)
n1, bins1, patches1 = ax1.hist(data, bins, alpha=0.6, density=False, cumulative=False)
# plot
self.plotWidget = FigureCanvas(fig)
lay = QtWidgets.QVBoxLayout(self.content_plot)
lay.setContentsMargins(0, 0, 0, 0)
lay.addWidget(self.plotWidget)
# add toolbar
self.addToolBar(QtCore.Qt.BottomToolBarArea, NavigationToolbar(self.plotWidget, self))
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
window = MyWindow()
window.show()
sys.exit(app.exec_())
推荐阅读
- reactjs - 如何添加到我在状态下制作的对象?
- python - 多线程还是多进程 Matplotlib plt.plot() 函数?
- python - Matplotlib 绘制 2D 形状而不是 1D 线
- azure - 将 Ghost 博客容器部署到 Azure Linux 应用服务 - siteContainer x 未响应端口:2368 上的 HTTP ping,站点启动失败
- terraform - 测量 terraform 应用执行时间的时间
- javascript - 反应js中的Wasm函数内存访问越界
- python - 如何每次通过电报机器人运行脚本
- c# - 用户故事下的 Azure DevOps API 创建任务
- python - Python selenium 忽略文本格式?
- r - 如何在R中确定矩阵可逆