【问题标题】:Embed Matplotlib in PyQt with multiple plot在 PyQt 中嵌入 Matplotlib 并具有多个绘图
【发布时间】:2016-07-05 07:47:29
【问题描述】:

大家!我想将我的数据嵌入到 Gui 中。在这里,我创建了 2 Plot 按钮,以便我一个一个地显示我的数据。Plot1 包含 2 个子图,Plot2 包含 1 个图。

但是当我点击 Plot1 然后点击 Plot2 时,我在 Plot2 中看不到我的数据,看起来坐标没有改变。我应该如何解决这个问题?

import matplotlib.pyplot as plt
import numpy as np 
import sys
from PyQt4 import QtGui
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qt4agg import NavigationToolbar2QT as NavigationToolbar


class PrettyWidget(QtGui.QWidget):


    def __init__(self):
        super(PrettyWidget, self).__init__()
        self.initUI()


    def initUI(self):

        self.setGeometry(100,100,800,600)
        self.center()
        self.setWindowTitle('S Plot')

        grid = QtGui.QGridLayout()
        self.setLayout(grid)

        btn1 = QtGui.QPushButton('Plot 1 ',self)
        btn1.resize(btn1.sizeHint())
        btn1.clicked.connect(self.plot1)
        grid.addWidget(btn1,5,0)

        btn2 = QtGui.QPushButton('Plot 2 ',self)
        btn2.resize(btn2.sizeHint())
        btn2.clicked.connect(self.plot2)
        grid.addWidget(btn2,5,1)

        self.figure = plt.figure(figsize = (15,5))
        self.canvas = FigureCanvas(self.figure)
        self.toolbar = NavigationToolbar(self.canvas, self)
        grid.addWidget(self.canvas, 3,0,1,2)
        grid.addWidget(self.canvas, 3,0,1,2)

        self.show()

    def plot1(self):
        plt.cla()
        ax1 = self.figure.add_subplot(211)
        x1 = [i for i in range(100)]
        y1 = [i**0.5 for i in x1]
        ax1.plot(x1,y1,'b.-')

        ax2 = self.figure.add_subplot(212)
        x2 = [i for i in range(100)]
        y2 = [i for i in x2]
        ax2.plot(x2,y2,'b.-')
        self.canvas.draw()

    def plot2(self):
        plt.cla()
        ax3 = self.figure.add_subplot(111)
        x = [i for i in range(100)]
        y = [i**0.5 for i in x]
        ax3.plot(x,y,'r.-')
        ax3.set_title('Square Root Plot')
        self.canvas.draw()    

    def center(self):
        qr = self.frameGeometry()
        cp = QtGui.QDesktopWidget().availableGeometry().center()
        qr.moveCenter(cp)
        self.move(qr.topLeft())

app = QtGui.QApplication(sys.argv)
app.aboutToQuit.connect(app.deleteLater)
GUI = PrettyWidget()
sys.exit(app.exec_())

【问题讨论】:

    标签: python matplotlib pyqt


    【解决方案1】:

    我强烈建议不要在进行嵌入时使用pyplot,全局状态管理和FigureManager 类会妨碍您。

    import sys
    from PyQt4 import QtGui
    import matplotlib
    import matplotlib.figure
    from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
    from matplotlib.backends.backend_qt4agg import NavigationToolbar2QT as NavigationToolbar
    
    
    class PrettyWidget(QtGui.QWidget):
        def __init__(self):
            super(PrettyWidget, self).__init__()
            self.initUI()
    
        def initUI(self):
    
            self.setGeometry(100, 100, 800, 600)
            self.center()
            self.setWindowTitle('S Plot')
    
            grid = QtGui.QGridLayout()
            self.setLayout(grid)
    
            btn1 = QtGui.QPushButton('Plot 1 ', self)
            btn1.resize(btn1.sizeHint())
            btn1.clicked.connect(self.plot1)
            grid.addWidget(btn1, 5, 0)
    
            btn2 = QtGui.QPushButton('Plot 2 ', self)
            btn2.resize(btn2.sizeHint())
            btn2.clicked.connect(self.plot2)
            grid.addWidget(btn2, 5, 1)
    
            self.figure = matplotlib.figure.Figure()
            self.canvas = FigureCanvas(self.figure)
            self.toolbar = NavigationToolbar(self.canvas, self)
            grid.addWidget(self.canvas, 3, 0, 1, 2)
            # grid.addWidget(self.toolbar, ??)
    
            self.show()
    
        def plot1(self):
            self.figure.clf()
            ax1 = self.figure.add_subplot(211)
            x1 = [i for i in range(100)]
            y1 = [i**0.5 for i in x1]
            ax1.plot(x1, y1, 'b.-')
    
            ax2 = self.figure.add_subplot(212)
            x2 = [i for i in range(100)]
            y2 = [i for i in x2]
            ax2.plot(x2, y2, 'b.-')
            self.canvas.draw_idle()
    
        def plot2(self):
            self.figure.clf()
            ax3 = self.figure.add_subplot(111)
            x = [i for i in range(100)]
            y = [i**0.5 for i in x]
            ax3.plot(x, y, 'r.-')
            ax3.set_title('Square Root Plot')
            self.canvas.draw_idle()
    
        def center(self):
            qr = self.frameGeometry()
            cp = QtGui.QDesktopWidget().availableGeometry().center()
            qr.moveCenter(cp)
            self.move(qr.topLeft())
    
    app = QtGui.QApplication(sys.argv)
    app.aboutToQuit.connect(app.deleteLater)
    GUI = PrettyWidget()
    sys.exit(app.exec_())
    

    【讨论】:

    • 这就是我想要的!感谢您的慷慨帮助。
    • 你用的pyplot和matplotlib.figure有什么区别?而 self.canvas.draw_idle() 是...
    • draw_idle 是一个延迟抽签(它要求 Qt 安排一个 paint ,而 paint 又会调用运行 Agg 光栅化的 draw )。如果您在paint 事件之间多次调用draw,则该图形将被光栅化(但从未显示),这会浪费CPU。使用draw_idle,您只需要在需要时花费 CPU 来渲染图像
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-17
    • 2017-08-16
    • 1970-01-01
    • 2015-01-15
    • 2016-08-21
    • 2012-09-09
    相关资源
    最近更新 更多