2016-03-18 68 views
1

everyone!我想将我的数据嵌入到Gui中。在这里,我创建了2 Plot按钮,以便我逐一显示数据.Plot1包含2个子图,Plot2包含1个图。在PyQt中嵌入Matplotlib与多个阴谋

但是,当我点击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_()) 

回答

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_()) 
+0

这就是我想要的!感谢您的慷慨帮助。 – radiosan

+0

你使用的pyplot和matplotlib.figure有什么区别?并且self.canvas.draw_idle()是... – radiosan

+1

'draw_idle'是一个延迟绘图(它要求Qt安排一个'paint',它将依次调用运行Agg rasterization的'draw')。如果在'paint'事件之间多次调用'draw',图形将被光栅化(但从未显示),这是CPU的浪费。使用'draw_idle'只需要CPU就可以在需要时渲染图像 – tacaswell