Python matplotlib show()不';我不能工作两次
我有一个奇怪的问题,关于matplotlib。如果我运行这个程序,我可以多次打开和关闭同一个图形Python matplotlib show()不';我不能工作两次,python,numpy,pyqt,matplotlib,Python,Numpy,Pyqt,Matplotlib,我有一个奇怪的问题,关于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 poin
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)
这个小部件是动画绘图所必需的,当实验完成时,如果我点击绘图,它应该会出现一个图形,这只是第一次出现
你有什么线索吗
非常感谢。我解决这个问题的方法是永远不要调用
close
我很确定你可以在PyQt中控制小部件的透明度。您可以尝试使用Qt而不是matplotlib来控制可见性。我相信其他更了解matplotlib的人可以给出更好的答案:D我有关于这一点的新信息,谷歌搜索结果显示了这一点
def onpick(self,event):
print "click"
print 'you pressed', event.canvas
...
ax.plot(a)
fig.show() # <--- this blocks the entire loop
这是matplotlib的作者写的。这是从
嗨,昂德雷
我不知道在哪里能找到好的
解释一下,但让我给你解释一下
给你一些提示。它打算使用
每个程序只显示一次。即
“show”应该是你演讲的最后一行
剧本如果你想互动
策划你可以考虑互动
模式(pyplot.ion ioff)类似于
下面的例子
此外,对于动态绘图,所有
动画演示可能很有用
也许你也想看看
向马蒂亚斯问好
因此,它似乎是一个未记录的“功能”(bug?)
编辑:这是他的代码块:
from pylab import *
t = linspace(0.0, pi, 100)
x = cos(t)
y = sin(t)
ion() # turn on interactive mode
figure(0)
subplot(111, autoscale_on=False, xlim=(-1.2, 1.2), ylim=(-.2, 1.2))
point = plot([x[0]], [y[0]], marker='o', mfc='r', ms=3)
for j in arange(len(t)):
# reset x/y-data of point
setp(point[0], data=(x[j], y[j]))
draw() # redraw current figure
ioff() # turn off interactive mode
show()
所以,也许通过使用draw()可以得到您想要的。我还没有测试这段代码,我想知道它的行为。我对show()也有同样的问题,只是第一次使用。您是否仍然使用0.99.3版或其他版本?我最近解决了我的问题,如果您仍有兴趣更改show()的行为,请尝试以下操作:
我注意到matplotlib下载站点的新功能部分中有一段标题为“多次调用以显示支持的” 一个长期存在的请求是支持对show()的多个调用。这一直很困难,因为很难在操作系统、用户界面工具包和版本之间获得一致的行为。Eric Fireing在跨后端合理化show方面做了大量工作,其期望的行为是使show提升所有新创建的图形并阻止执行,直到它们关闭。重复调用show应该会提高自上次调用以来新创建的数字。Eric对用户界面工具包、版本和平台进行了大量测试,但不可能全部测试,因此请向邮件列表和bug追踪器报告问题 这是版本1.0.1的“新功能”,在synaptic中编写该版本时,仍然是0.99.3。我能够从源代码v1.0.1下载和构建。我还需要满足依赖关系的附加包是
libfreetype6-dev-tk-dev-tk8.5-dev-tcl8.5-dev-python-gtk2-dev
;您的里程可能会有所不同
现在我有了matplotlib.\uuuuu版本=1.0.1
,下面的代码按照我的预期工作:
from matplotlib import pyplot as p
from scipy import eye
p.imshow(eye(3))
p.show()
print 'a'
p.imshow(eye(6))
p.show()
print 'b'
p.imshow(eye(9))
p.show()
print 'c'
在代码开始时,通过启用交互模式
plt.ion()您可以通过以下方式创建地物实例:
fig = plt.figure(0)
通过操纵这个无花果画你的东西。
您可以随时使用
fig.show()
显示您的体形。它不起作用。我知道show()阻塞了整个循环,但当我关闭图形时,GUI循环继续工作。问题是,当我再次单击图形时,show()不再起作用。您不应该使用.show来显示它。发布一个工作示例,这样我们就可以测试iTunes。不幸的是,我不能发布整个项目,因为它太大了,在单独的文件中有很多小部件。我也尝试了draw(),但它没有显示任何内容。此外,为什么我在顶部发布的示例适用于multiple show()?这是一种变通方法,我更愿意以正确的方式解决这个问题。不过,如果没有人能帮助我,我会照你说的做。我同意。我还想知道一个更好的答案。作为我的第一个例子,它在一个单独的脚本中可以完美地工作,但在我的函数中,它只在第一次工作,而在第二次工作时不工作。问题是只能调用一次的final show()。这太奇怪了,我只需要打开和关闭一个数字几次,这应该不是那么困难。我想qt小部件中的包含可能会导致这种行为。顺便说一句,只使用draw()而不使用show()不会显示任何内容。可能重复的答案绝对正确且简单!
fig = plt.figure(0)