Вставить Matplotlib в PyQt с несколькими сюжетами

все! Я хочу внедрить свои данные в Gui. Здесь я создал 2 кнопки «Плот», чтобы я показывал свои данные один за другим. В слое 1 содержалось 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_()) 

Я категорически не рекомендую использовать 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_())