最终编辑:
我在关闭pyplot窗口这一主题上发现,实际上可能不应该使用pyplot完成它。SRK给出了一个很好的示例,说明如何处理将在下面的答案中更新的图。我也偶然发现了如何将pyplot图放到Tkinter窗口中,并且Tkinter比pyplot更擅长打开和关闭窗口。这里是怎样把一个pyplot情节变成Tk的窗口,
/最终编辑
我希望能够显示多个图,然后能够从某些代码输入中分别关闭(从屏幕上删除)它们,但是我不知道要这样做的代码输入。
以下是到目前为止我尝试过的。我一直在使用show和close命令的位置,但是我从中获得的唯一真实结果是没有绘制一个或另一个图,但是我无法从屏幕上删除一个图。我一直在插入raw_input()创建暂停。
编辑:这些图是从Tkinter gui调用的,如果有更好的方法从该方向进行操作,我会很高兴听到它。
任何输入将不胜感激,谢谢。
import matplotlib.pyplot as plt a = range(0,10) b = range(0,20,2) c = range(0,30,3) d = range(0,40,4) plot1 = plt.figure() plt.plot(a,b, 'r-o') plt.show() plt.close() plot2 = plt.figure() plt.plot(c,d, 'b-o') plt.show() plt.close()
编辑代码:这也不起作用。
plot1 = plt.figure(1) plt.plot(a,b, 'r-o') plot2 = plt.figure(2) plt.plot(c,d, 'b-o') #plt.close(1) #this will prevent plot1 from being displayed plt.show() plt.close(1) # or ('all') or (plot1)
plt.close() 将关闭当前实例。
plt.close()
plt.close(2) 将关闭图2
plt.close(2)
plt.close(plot1) 将使用图plot1关闭图
plt.close(plot1)
plt.close('all') 将关闭所有漏洞
plt.close('all')
在这里找到。
请记住,这plt.show()是一个 阻塞 函数,因此在您上面使用的示例代码中,plt.close()直到关闭窗口后才执行该函数,从而使其变得多余。
plt.show()
您可以plt.ion()在代码的开头使用它来使其成为非阻塞的,尽管这还有其他含义。
plt.ion()
在评论中进行讨论之后,我整理了一个示例,只是为了演示如何使用绘图功能。
下面我创建一个图:
fig = plt.figure(figsize=plt.figaspect(0.75)) ax = fig.add_subplot(1, 1, 1) .... par_plot, = plot(x_data,y_data, lw=2, color='red')
在这种情况下,ax上面是一对轴的手柄。每当我想对这些轴进行操作时,都可以通过调用将当前轴集更改为该特定轴集axes(ax)。
ax
axes(ax)
par_plot是line2D实例的句柄。这就是所谓的艺术家。如果要更改该行的属性(例如更改ydata),可以通过引用此句柄来实现。
par_plot
我还可以通过执行以下操作来创建滑块小部件:
axsliderA = axes([0.12, 0.85, 0.16, 0.075]) sA = Slider(axsliderA, 'A', -1, 1.0, valinit=0.5) sA.on_changed(update)
第一行为滑块创建了一个新轴(称为axsliderA),第二行创建了sA放置在轴中的滑块实例,第三行指定了当滑块值更改时调用的函数(update)。
axsliderA
sA
update
我的更新功能可能看起来像这样:
def update(val): A = sA.val B = sB.val C = sC.val y_data = A*x_data*x_data + B*x_data + C par_plot.set_ydata(y_data) draw()
该par_plot.set_ydata(y_data)改变YDATA 财产 的的 Line2D是否 与处理对象par_plot。
par_plot.set_ydata(y_data)
该draw()功能更新 当前 轴组。
draw()
放在一起:
from pylab import * import matplotlib.pyplot as plt import numpy def update(val): A = sA.val B = sB.val C = sC.val y_data = A*x_data*x_data + B*x_data + C par_plot.set_ydata(y_data) draw() x_data = numpy.arange(-100,100,0.1); fig = plt.figure(figsize=plt.figaspect(0.75)) ax = fig.add_subplot(1, 1, 1) subplots_adjust(top=0.8) ax.set_xlim(-100, 100); ax.set_ylim(-100, 100); ax.set_xlabel('X') ax.set_ylabel('Y') axsliderA = axes([0.12, 0.85, 0.16, 0.075]) sA = Slider(axsliderA, 'A', -1, 1.0, valinit=0.5) sA.on_changed(update) axsliderB = axes([0.43, 0.85, 0.16, 0.075]) sB = Slider(axsliderB, 'B', -30, 30.0, valinit=2) sB.on_changed(update) axsliderC = axes([0.74, 0.85, 0.16, 0.075]) sC = Slider(axsliderC, 'C', -30, 30.0, valinit=1) sC.on_changed(update) axes(ax) A = 1; B = 2; C = 1; y_data = A*x_data*x_data + B*x_data + C; par_plot, = plot(x_data,y_data, lw=2, color='red') show()
关于上述内容的注释:当我运行应用程序时,代码会依次依次运行(update我认为它将函数存储在内存中),直到遇到阻塞的show()为止。当您对其中一个滑块进行更改时,它会从内存中运行更新功能(我认为?)。
这就是为什么show()如此实现的原因,因此您可以通过使用函数来处理数据来在后台更改值。