python - 关闭 pyplot 窗口

标签 python tkinter matplotlib

最终编辑:

我发现关于关闭 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)

最佳答案

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

plt.close(2) 将关闭图 2

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

plt.close('all') 将关闭所有文件

找到 here .

记住 plt.show() 是一个 blocking 函数,所以在您上面使用的示例代码中,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')

在这种情况下,上面的 ax 是一对轴的句柄。每当我想对这些轴做某事时,我都可以通过调用 axes(ax) 将我当前的一组轴更改为这个特定的组。

par_plot 是 line2D 实例的句柄。这被称为艺术家。如果我想改变线的一个属性,比如改变ydata,我可以通过引用这个句柄来实现。

我还可以通过执行以下操作来创建 slider 小部件:

axsliderA = axes([0.12, 0.85, 0.16, 0.075])
sA = Slider(axsliderA, 'A', -1, 1.0, valinit=0.5)
sA.on_changed(update)

第一行为 slider 创建一个新轴(称为axsliderA),第二行创建一个放置在轴中的 slider 实例sA,第三行line 指定当 slider 值更改时要调用的函数(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对象的ydataproperty .

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(),即阻塞。当您对其中一个 slider 进行更改时,它会从内存中运行更新功能(我认为?)。

这就是 show() 以这种方式实现的原因,以便您可以通过使用函数来处理数据在后台更改值。

关于python - 关闭 pyplot 窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11140787/

相关文章:

python - 使用 pandas 填充数据框中的合并单元格

python - "_tkinter.TclError: image "pyimage4 "doesn' t 存在”

python - 带有 python 的 tkinter 中的默认输入字段

python - 从 Pandas 数据帧向 matplotlib 图添加文本注释

python - 从零开始绘制 Y 条,而不是在列表中较小的值处

python - 如何将 Python C 模块与 `ld` 链接。对 `__dso_handle' 的 undefined reference

python - GAE "no attribute ' HTTPSHandler' "dev_appserver.py

matplotlib - 以编程方式更改 Qt4 中的 matplotlib 工具栏模式

python - Lisp 的 read-eval-print 循环与 Python 的有何不同?

python - 使 Tkinter 窗口成为非 Tkinter 窗口的子窗口