如何在matplotlib中关闭图形?

3

`

import matplotlib.pyplot as plt
import pandas as pd
l1 = [1,2,3,4]
l2 = [2,4,6,8]
fig = plt.figure()


def func():
    plt.pause(1)
    plt.plot(l1,l2)
    plt.draw()
    plt.pause(1)
    input("press any key to continue...")
    plt.close(fig)
    plt.pause(1)

while True:
    func()
    plt.pause(1)


这是修改后的版本:

这是修改后的版本:

import matplotlib.pyplot as plt
import pandas as pd
l1 = [1,2,3,4]
l2 = [2,4,6,8]
fig = plt.figure()
a = 1

def func(num):
    input(f"the {num}th window is not opened yet")
    plt.pause(1)
    plt.plot(l1,l2)
    plt.draw()
    print(f"the {num}th window is opened")
    plt.pause(1)
    input("press any key to continue...")
    plt.close(fig)
    plt.pause(1)
    print(f"the {num}th window is closed")
while True:
    func(a)
    plt.pause(1)
    a+=1

如果我不使用while True循环,只要我按下任何键,它就会停止运行,这正是我的意图。然而,如果我使用while True循环运行此代码,即使我按下任何键或左上角的x按钮,图形窗口也不会关闭。我认为这是由于while True引起的。我不知道如何解决这个问题,同时保持while True。请帮帮我!

  • 修改: 当“第二个窗口尚未打开”输入消息出现时,我可以看到一个打开的窗口。可能,这个窗口是循环的第一次,因为第二个窗口在那时还没有打开。为什么第一个窗口还在呢?我使用plt.close()来关闭窗口。

图形应该能够正常关闭并立即重新打开。第二次,它是另一个图形,所以当然不会关闭。 - Mad Physicist
谢谢您的评论!我修改了我的帖子。请检查并回答我的问题! - CoderHan
你的编辑并没有改变我的答案。 - Mad Physicist
好的。我会仔细阅读您的答案并再次评论。 - CoderHan
谢谢。我想我理解了你的评论。我很好奇是否可以隐藏整个窗口,这样我就看不到它了。 - CoderHan
显示剩余2条评论
1个回答

5
问题不在于 while True:,而是如何创建你的图形。让我们从概念上逐步解析你的过程:
  1. fig = plt.figure() 创建一个图,并将其句柄存储在 fig 中。
  2. 然后你调用 func,它在图上绘制并最终调用 plt.pause(1)
  3. 你循环并再次调用 func。这一次,plt.plot(l1, l2) 会创建一个新的图形,因为没有打开的图形。
  4. func 调用 plt.close(fig)。但是存储在 fig 中的句柄不是你打开的新的图形,所以你的图形当然不会关闭。

要关闭正确的图形,请在 func 中打开图形。使用面向对象的 API 可以更好地控制打开、关闭、绘制等操作:

import matplotlib.pyplot as plt
import pandas as pd

l1 = [1, 2, 3, 4]
l2 = [2, 4, 6, 8]

def func():
    fig, ax = plt.subplots()
    ax.plot(l1, l2)
    plt.show(block=False)
    plt.pause(1)
    input("press any key to continue...")
    plt.close(fig)
    plt.pause(1)

while True:
    func()

或者,您可以直接将plt.close(fig)替换为plt.close(),这相当于plt.close(plt.gcf()),因此您不需要知道新图形的句柄。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接