【问题标题】:Closing pyplot windows关闭 pyplot 窗口
【发布时间】:2012-06-23 20:13:42
【问题描述】:

最终编辑:

我发现关于关闭 pyplot 窗口的主题是,它真的可能不应该使用 pyplot 来完成。 SRK 给出了一个很好的例子,说明如何处理将在下面的答案中更新的图。此外,我偶然发现了如何将 pyplot 图放入 Tkinter 窗口,而 Tkinter 比 pyplot 更擅长打开和关闭窗口。这里is how to put a pyplot plot into a Tk window 也有this is a good example

/最终编辑

我希望能够显示多个绘图,然后能够通过一些代码输入单独关闭(从屏幕上删除)它们,但我不知道执行此操作的代码输入。

以下是我迄今为止尝试过的。我玩过 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)

【问题讨论】:

    标签: python tkinter matplotlib


    【解决方案1】:

    plt.close() 将关闭当前实例。

    plt.close(2) 将关闭图 2

    plt.close(plot1) 将用实例 plot1 关闭图形

    plt.close('all') 将关闭所有火线

    找到here

    记住plt.show() 是一个阻塞 函数,所以在您上面使用的示例代码中,plt.close() 在窗口关闭之前不会被执行,这使得它变得多余。

    您可以在代码开头使用plt.ion() 使其成为非阻塞代码,尽管这有其他含义。

    示例

    在我们在 cmets 中讨论之后,我整理了一些示例来演示如何使用绘图功能。

    下面我创建了一个情节:

    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) 将我当前的一组轴更改为这个特定的组。

    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)
    

    第一行为滑块创建了一个新坐标区(称为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) 使用句柄 par_plot 更改 Line2D 对象的 ydata 属性

    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() 以这种方式实现的原因,以便您可以通过使用函数来处理数据在后台更改值。

    【讨论】:

    • 我试过了,但没有用(见编辑)。它确实清除了该实例的内存,但不会从屏幕上删除该图。还有其他想法吗?
    • 我已经添加了原因。 plt.show() 是一个阻塞函数。
    • 谢谢。那么,这对我关闭显示的情节意味着什么?我想我真正的问题是如何处理 plt.show() 函数创建的窗口。你有什么其他的想法来解决这个问题吗?
    • 你能给我更多关于你想要做什么的想法吗?通常我允许用户关闭窗口,或者检测主窗口何时关闭,然后将它们全部关闭。按照您建议的方式从代码中关闭窗口并不常见。
    • 我有一个 Tk gui,当被询问时会生成绘图,如果用户需要调整绘图,那么会调整一些变量,并通过调整重新生成绘图。我只是想减少用户输入并让程序在制作新地块之前销毁旧地块,但我想如果用户必须手动执行此操作,这不会是世界末日。你是说在这种情况下手动是要走的路吗?谢谢!
    【解决方案2】:

    请使用

    plt.show(block=False)
    plt.close('all')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-24
      • 1970-01-01
      • 2012-12-15
      • 1970-01-01
      • 1970-01-01
      • 2011-09-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多