Tôi gặp một vấn đề kỳ lạ với matplotlib. Nếu tôi chạy chương trình này, tôi có thể mở và đóng cùng một biểu đồ nhiều lần.
nhập numpy
từ pylab nhập hình, hiển thị
X = numpy.random.rand(100, 1000)
xs = numpy.mean(X, trục=1)
ys = numpy.std(X, trục=1)
hình = hình()
ax = fig.add_subplot(111)
ax.set_title('nhấp vào điểm để vẽ chuỗi thời gian')
dòng, = ax.plot(xs, ys, 'o', picker=5) # 5 điểm dung sai
def onpick(sự kiện):
figi = hình()
ax = figi.add_subplot(111)
ax.plot([1,2,3,4])
figi.hiển thị()
fig.canvas.mpl_connect('pick_event', onpick)
trình diễn()
Nếu thay vào đó tôi sử dụng cùng mã hàm onpick trong tiện ích tùy chỉnh của mình thì nó chỉ mở biểu đồ lần đầu tiên, trong các trường hợp khác, nó sẽ nhập hàm nhưng không hiển thị biểu đồ:
từ PyQt4 nhập QtGui, QtCore
từ matplotlib.backends.backend_qt4agg nhập FigureCanvasQTAgg dưới dạng FigureCanvas
từ matplotlib.figure nhập Hình
nhập numpy dưới dạng np
nhập matplotlib.pyplot dưới dạng plt
từ matplotlib.backends.backend_qt4 nhập NavigationToolbar2QT làm NavigationToolbar
thời gian nhập khẩu
BƯỚC = 0,000152
lớp MplCanvas(FigureCanvas):
định nghĩa __init__(bản thân):
# khởi tạo canvas
FigureCanvas.__init__(bản thân, Figure())
tự.queue = []
self.I_data = np.array([])
self.T_data = np.array([])
self.LvsT = self.figure.add_subplot(111)
self.LvsT.set_xlabel('Thời gian, s')
self.LvsT.set_ylabel('Điện áp PMT, V')
self.LvsT.set_title("Ánh sáng so với Thời gian")
self.LvsT.grid(Đúng)
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)
tự đếm = 0
tự vẽ()
def enter_axes(bản thân, sự kiện):
in "dentro"
def onpick(self,event):
in "nhấp chuột"
in 'bạn đã nhấn', event.canvas
a = np.arange(10)
in một
in tự đếm
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(a)
hình.hiển thị()
def Start_Plot(self,q,Vmin,Vmax,ScanRate,Cycles):
tự.queue = q
tự.LvsT.clear()
self.LvsT.set_xlim(0,abs(Vmin-Vmax)/Tốc độ quét*Chu kỳ)
tự.LvsT.set_ylim(-3, 3)
self.LvsT.set_autoscale_on(Sai)
tự.LvsT.clear()
tự vẽ()
self.T_data = np.array([])
self.I_data = np.array([])
# gọi phương thức cập nhật (để tăng tốc độ trực quan hóa)
self.timerEvent(Không có)
# bắt đầu bộ đếm thời gian, kích hoạt sự kiện sau mỗi 1000 mili giây (=1 giây)
self.timerLvsT = self.startTimer(3)
def timerEvent(self, evt):
current_size = self.LvsT.bbox.width, self.LvsT.bbox.height
nếu self.old_size không bằng current_size:
self.old_size = kích thước hiện tại
tự.LvsT.clear()
tự.LvsT.grid()
tự vẽ()
self.LvsT_background = self.copy_from_bbox(self.LvsT.bbox)
self.restore_region(self.LvsT_background, bbox=self.LvsT.bbox)
kết quả = self.queue.get()
nếu kết quả == 'DỪNG':
self.LvsT.draw_artist(self.LvsT_plot)
tự.killTimer(self.timerLvsT)
in "Cốt truyện kết thúc LvsT"
khác:
# thêm dữ liệu mới vào tập dữ liệu
self.T_data = np.append(self.T_data,result[0:len(result)/2])
self.I_data = np.append(self.I_data,result[len(kết quả)/2:len(kết quả)])
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)
lớp LvsT_MplWidget(QtGui.QWidget):
def __init__(self, parent = Không có):
QtGui.QWidget.__init__(bản thân, cha mẹ)
self.canvas = MplCanvas()
self.vbl = QtGui.QVBoxLayout()
self.vbl.addWidget(self.canvas)
self.setLayout(self.vbl)
Tiện ích này cần thiết cho biểu đồ động, khi thí nghiệm kết thúc, nếu tôi nhấp vào biểu đồ, nó sẽ xuất hiện với một biểu đồ chỉ xuất hiện lần đầu tiên.
Bạn có biết gì không?
Cảm ơn bạn rất nhiều.
Tôi là một lập trình viên xuất sắc, rất giỏi!