dea*_*ump 36 python tkinter matplotlib
最终编辑:
我在关闭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()
Run Code Online (Sandbox Code Playgroud)
编辑代码:这也不起作用.
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)
Run Code Online (Sandbox Code Playgroud)
sta*_*nri 65
plt.close()
将关闭当前实例.
plt.close(2)
将结束图2
plt.close(plot1)
将使用实例plot1关闭数字
plt.close('all')
将关闭所有fiures
在这里找到.
请记住,这plt.show()
是一个阻塞函数,因此在上面使用的示例代码中,plt.close()
直到窗口关闭才会执行,这使它变得多余.
您可以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')
Run Code Online (Sandbox Code Playgroud)
在这种情况下,ax
上面是一对轴的手柄.每当我想对这些轴做某事时,我可以通过调用将当前的轴组更改为此特定组axes(ax)
.
par_plot
是line2D实例的句柄.这被称为艺术家.如果我想更改该行的属性,比如更改ydata,我可以通过引用此句柄来实现.
我还可以通过执行以下操作来创建滑块小部件:
axsliderA = axes([0.12, 0.85, 0.16, 0.075])
sA = Slider(axsliderA, 'A', -1, 1.0, valinit=0.5)
sA.on_changed(update)
Run Code Online (Sandbox Code Playgroud)
第一行为滑块创建一个新轴(称为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()
Run Code Online (Sandbox Code Playgroud)
该par_plot.set_ydata(y_data)
变化YDATA 财产的的Line2D是否与处理对象par_plot
.
该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()
Run Code Online (Sandbox Code Playgroud)
关于上述内容的注释:当我运行应用程序时,代码依次运行(它将update
函数存储在内存中,我认为),直到它命中show(),这是阻塞.当你对其中一个滑块进行更改时,它会从内存运行更新功能(我想?).
这就是为什么show()以它的方式实现的原因,因此您可以通过使用函数来处理数据来更改背景中的值.