Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用PyQt5检查QCheckBox时显示matplotlib绘图_Python_Matplotlib_Pyqt5 - Fatal编程技术网

Python 使用PyQt5检查QCheckBox时显示matplotlib绘图

Python 使用PyQt5检查QCheckBox时显示matplotlib绘图,python,matplotlib,pyqt5,Python,Matplotlib,Pyqt5,我想使用PyQt5制作一个Gui并显示matplotlib绘图。 这是主窗口的图片: 问题是,当选中QCheckBox时,是否有任何方法显示绘图? 我插入了4个复选框,每个复选框都有不同的绘图或不同的选项。 例如,其中两个将显示两个不同的图,其中两个将轴更改为对数坐标。 我知道工具栏中有一个选项可以执行此操作,但我希望通过单击复选框立即执行这些更改。 我发现使用PyQt4,但它使用QpushButton进行更改。我渴望立即改变。 和matplotlib的小部件,不适合我的Gui。 有什么建议吗

我想使用PyQt5制作一个Gui并显示matplotlib绘图。
这是主窗口的图片:

问题是,当选中QCheckBox时,是否有任何方法显示绘图? 我插入了4个复选框,每个复选框都有不同的绘图或不同的选项。 例如,其中两个将显示两个不同的图,其中两个将轴更改为对数坐标。
我知道工具栏中有一个选项可以执行此操作,但我希望通过单击复选框立即执行这些更改。
我发现使用PyQt4,但它使用QpushButton进行更改。我渴望立即改变。
和matplotlib的小部件,不适合我的Gui。
有什么建议吗

下面是qt设计器中的代码和代码。也许有些代码已经足够了,因为我尝试了很多东西。 x和y的两个样本列表

from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtWidgets import *
from PyQt5.uic import loadUiType
import sys
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg, NavigationToolbar2QT as NavigationToolbar
from matplotlib.figure import Figure
import matplotlib
matplotlib.use('Qt5Agg')

ui, _ = loadUiType('plots.ui')

class MplCanvas(FigureCanvasQTAgg):
    def __init__(self, parent=None, width=5, height=4, dpi=100):
        fig = Figure(figsize=(width, height), dpi=dpi)
        self.axes = fig.add_subplot(111)
        super(MplCanvas, self).__init__(fig)


class MainWindow(QMainWindow, ui):
    def __init__(self, *args, **kwargs):
        QMainWindow.__init__(self)
        self.setupUi(self)

        self.checkBox_1.stateChanged.connect(self.checker)
        self.checkBox_2.stateChanged.connect(self.checker)

        toolbar = NavigationToolbar(sc, self)
        self.verticalLayout.addWidget(toolbar)
        self.verticalLayout.addWidget(sc)

    def checker(self):
        x = [1,2,3,4,5]
        y = [1,2,3,4,5]
        if self.checkBox_1.isChecked():
            sc = MplCanvas(self, width=5, height=4, dpi=100)
            sc.axes.plot(x, y)
            self.show()

        if self.checkBox_2.isChecked():
            sc = MplCanvas(self, width=5, height=4, dpi=100)
            sc.axes.plot(x, y)
            self.show()

def main():
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    app.exec_()


if __name__ == '__main__':
    main()


在努力研究这个问题之后,我终于找到了解决办法。但可能代码太多了,我仍然可以从其他人那里得到建议。
以下是我尝试过的:

from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtWidgets import *
from PyQt5.uic import loadUiType
import sys
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg, NavigationToolbar2QT as NavigationToolbar
from matplotlib.figure import Figure
import matplotlib
matplotlib.use('Qt5Agg')

ui, _ = loadUiType('plots.ui')

class MplCanvas(FigureCanvasQTAgg):
    def __init__(self, parent=None, width=5, height=4, dpi=100):
        fig = Figure(figsize=(width, height), dpi=dpi)
        self.axes = fig.add_subplot(111)
        super(MplCanvas, self).__init__(fig)


class MainWindow(QMainWindow, ui):
    def __init__(self, *args, **kwargs):
        QMainWindow.__init__(self)
        self.setupUi(self)

        self.checkBox_1.stateChanged.connect(self.raw)
        self.checkBox_2.stateChanged.connect(self.raw)

    def raw(self):
        for i in range(self.verticalLayout.count()): self.verticalLayout.itemAt(i).widget().close()
        x = [1,2,3,4,5]
        y = [6,8,2,7,3]
        sc = MplCanvas(self, width=5, height=4, dpi=100)
        toolbar = NavigationToolbar(sc, self)
        self.verticalLayout.addWidget(toolbar)
        self.verticalLayout.addWidget(sc)
        if self.checkBox_1.isChecked() and not self.checkBox_2.isChecked():
            sc.axes.plot(x, y)
        if self.checkBox_2.isChecked() and not self.checkBox_1.isChecked():
            sc.axes.plot(y, x)
        elif self.checkBox_2.isChecked() and self.checkBox_1.isChecked():
            sc.axes.plot(x, y, 'r', y, x, 'b')
        self.show()


def main():
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    app.exec_()


if __name__ == '__main__':
    main()
正如您在这段代码中所看到的,每当复选框在其状态下更改时,我都会尝试清除布局,并为绘图使用
if语句。
我知道这样做有更好的方法,所以我可以利用你的宝贵建议。

请提供@eyllanesc添加的代码
self.plots.extend(sc.axes.plot(x,y));对于self.plots中的plot:plot.remove()
这不能工作吗?