如何嵌入matplotlib plot PyQt5 QGroupBox

How to embed matplotlib plot PyQt5 QGroupBox

我需要将绘图嵌入到 PyQt 小部件中。我可以用 QFileDialog 打开 txt 文件并单独绘制数据,但我需要将图形嵌入到初始解决方案组框中。这是 UI 图片。

这是我的主要代码。

import sys
import os
import matplotlib.pyplot as plt
import pandas as pd
from PyQt5.uic import loadUi
from PyQt5 import QtWidgets
from PyQt5.QtWidgets import QFileDialog, QDialog, QApplication, QWidget, QMainWindow, QAction
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure


class MainScreen(QMainWindow):
    def __init__(self):
        super(MainScreen, self).__init__()
        loadUi("ilk_deneme.ui", self)
        self.MenuBar()
        

    def MenuBar(self):
        Open_Data = self.actionOpen_Data
        Open_Data.triggered.connect(self.open_sheet)
        

    def open_sheet(self):
        path = QFileDialog.getOpenFileName(self, "Open", "", "TXT Files (*.txt)")
        if path[0]!='':
            self.FileN=path[0]
        self.dta_list = pd.read_csv(self.FileN,sep=",",header=None,names=["1","2"])  
        df = self.dta_list
        ax = df.plot.scatter(x="1",y="2",c="black")
        for k, v in df.iterrows():
            ax.annotate(k, v)
        plt.show()


        


app = QApplication(sys.argv)
MainScreen = MainScreen()
widget = QtWidgets.QStackedWidget()
widget.addWidget(MainScreen)
widget.setFixedHeight(656)
widget.setFixedWidth(1097)
widget.show()
try:
    sys.exit(app.exec())
except:
    print("Exiting")

您需要根据轴图创建一个 FigureCanvas,然后将其添加到布局中。

以下假设“初始解”组框名为initialSolution。因为你没有提供 UI,我不知道那个盒子是否已经有布局,所以我检查它并最终创建一个。

from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolbar

# ...

    def open_sheet(self):
        # ...
        ax = df.plot.scatter(x="1",y="2",c="black")
        for k, v in df.iterrows():
            ax.annotate(k, v)

        layout = self.initialSolution.layout()
        if layout is None:
            layout = QVBoxLayout(self.initialSolution)

        canvas = FigureCanvas(ax.figure)
        toolbar = NavigationToolbar(canvas, self)
        layout.addWidget(toolbar)
        layout.addWidget(canvas)

注意:您的 UI 可能基于 YouTube 教程,该教程提供了 很多 糟糕的建议,例如添加QMainWindow(或更糟,QDialog)到 QStackedWidget 或不考虑也不显示异常类型的 try/except 块;我强烈建议您不要遵循该教程中的任何内容,而是寻找其他资源。此外,MenuBar() 有一个与 QMainWindow menuBar() 函数非常相似的名称(而且它还有一个大写的名称,函数不鼓励这样做);始终为变量和函数使用更具描述性的名称。