matplotlib show () не работает дважды

У меня странная проблема с matplotlib. Если я запускаю эту программу, я могу открывать и закрывать одну и ту же фигуру несколько раз.

import numpy
from pylab import figure, show


X = numpy.random.rand(100, 1000)
xs = numpy.mean(X, axis=1)
ys = numpy.std(X, axis=1)

fig = figure()
ax = fig.add_subplot(111)
ax.set_title('click on point to plot time series')
line, = ax.plot(xs, ys, 'o', picker=5)  # 5 points tolerance


def onpick(event):

    figi = figure()
    ax = figi.add_subplot(111)
    ax.plot([1,2,3,4])        
    figi.show()

fig.canvas.mpl_connect('pick_event', onpick)

show()

Напротив, если я использую тот же код функции onpick в моем пользовательском виджете, он открывает фигуру только в первый раз, в другие события он вводит в функции, но не отображает фигуру:

from PyQt4 import QtGui, QtCore
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.backends.backend_qt4 import NavigationToolbar2QT as NavigationToolbar
import time

STEP = 0.000152 

class MplCanvas(FigureCanvas):

    def __init__(self):

        # initialization of the canvas
        FigureCanvas.__init__(self, Figure())

        self.queue = []
        self.I_data = np.array([])
        self.T_data = np.array([])

        self.LvsT = self.figure.add_subplot(111)
        self.LvsT.set_xlabel('Time, s')
        self.LvsT.set_ylabel('PMT Voltage, V')
        self.LvsT.set_title("Light vs Time")
        self.LvsT.grid(True)

        self.old_size = self.LvsT.bbox.width, self.LvsT.bbox.height
        self.LvsT_background = self.copy_from_bbox(self.LvsT.bbox)

        self.LvsT_plot, = self.LvsT.plot(self.T_data,self.I_data)
        #self.LvsT_plot2, = self.LvsT.plot(self.T_data2,self.I_data2) 

        self.mpl_connect('axes_enter_event', self.enter_axes)
        self.mpl_connect('button_press_event', self.onpick)
        self.count = 0
        self.draw()

    def enter_axes(self,event):

        print "dentro"

    def onpick(self,event):
        print "click"
        print 'you pressed', event.canvas

        a = np.arange(10)
        print a
        print self.count

        fig = plt.figure()
        ax = fig.add_subplot(111)
        ax.plot(a)    
        fig.show()



    def Start_Plot(self,q,Vmin,Vmax,ScanRate,Cycles):
        self.queue = q

        self.LvsT.clear()
        self.LvsT.set_xlim(0,abs(Vmin-Vmax)/ScanRate*Cycles)
        self.LvsT.set_ylim(-3, 3)
        self.LvsT.set_autoscale_on(False)
        self.LvsT.clear()
        self.draw()

        self.T_data = np.array([])
        self.I_data = np.array([])

        # call the update method (to speed-up visualization)
        self.timerEvent(None)
        # start timer, trigger event every 1000 millisecs (=1sec)
        self.timerLvsT = self.startTimer(3)

    def timerEvent(self, evt):

        current_size = self.LvsT.bbox.width, self.LvsT.bbox.height
        if self.old_size != current_size:
            self.old_size = current_size
            self.LvsT.clear()
            self.LvsT.grid()
            self.draw()
            self.LvsT_background = self.copy_from_bbox(self.LvsT.bbox)

        self.restore_region(self.LvsT_background, bbox=self.LvsT.bbox)

        result = self.queue.get()

        if result == 'STOP': 
            self.LvsT.draw_artist(self.LvsT_plot)
            self.killTimer(self.timerLvsT)
            print "Plot finito LvsT"

        else:
            # append new data to the datasets
            self.T_data = np.append(self.T_data,result[0:len(result)/2])
            self.I_data = np.append(self.I_data,result[len(result)/2:len(result)])

            self.LvsT_plot.set_data(self.T_data,self.I_data)#L_data
            #self.LvsT_plot2.set_data(self.T_data2,self.I_data2)#L_data

            self.LvsT.draw_artist(self.LvsT_plot)

            self.blit(self.LvsT.bbox)


class LvsT_MplWidget(QtGui.QWidget):
    def __init__(self, parent = None):
        QtGui.QWidget.__init__(self, parent)        
        self.canvas = MplCanvas()
        self.vbl = QtGui.QVBoxLayout()
        self.vbl.addWidget(self.canvas)
        self.setLayout(self.vbl)

Этот виджет необходим для анимационного сюжета, и когда эксперимент закончен, если я щелкну по сюжету, он должен появиться в виде фигуры, которая появляется только в первом время.

У вас есть какие-нибудь подсказки?

Большое спасибо.

17
задан Sangi 2 April 2011 в 17:54
поделиться