matplotlib交互模式:判断图形窗口是否仍然显示

27 投票
2 回答
25553 浏览
提问于 2025-04-17 03:06

我在用matplotlib这个库的互动模式来给用户展示一个图,这个图可以帮助他们输入一系列变量。用户可以选择按“?”来显示这个图,然后变量的输入提示会再次出现。

我怎么知道如果这个图还在显示,就不需要重新绘制它呢?

表面上,我有一段笨拙的(伪代码)代码:

answer = None
done_plot = False
while answer == None:
    answer = get_answer()
    if answer == '?':
        if done_plot:
            have_closed = True
            ##user's already requested a plot - has s/he closed it?
            ## some check here needed:
            have_closed = ?????

            if have_closed == False:
                print 'You already have the plot on display, will not re-draw'
                answer = None
                continue
        plt.ion()
        fig = plt.figure()
        ### plotting stuff
        done_plot = True
        answer = None
    else:
        ###have an answer from the user...

我可以用什么(比如plt.gca()、fig等)来判断是否需要重新绘制图呢?有没有什么状态可以检查一下?

非常感谢,

大卫

2 个回答

24

在编程中,有时候我们需要处理一些数据,比如从一个地方获取数据,然后把它放到另一个地方。这就像把水从一个杯子倒到另一个杯子一样。

有些时候,我们会遇到一些问题,比如数据的格式不对,或者我们需要对数据进行一些处理才能使用。这就像是你想喝水,但杯子里有一些杂质,你需要先把杂质过滤掉。

在这些情况下,我们可以使用一些工具或者方法来帮助我们解决问题。就像在厨房里,我们有刀、锅、碗等工具来帮助我们做饭一样。

总之,编程就是通过写代码来处理数据,解决问题,让计算机按照我们的想法去做事情。

import matplotlib.pyplot as plt
if plt.get_fignums():
    # window(s) open
else:
    # no windows
38

和unutbu的回答类似,你也可以用下面的方式检查一个图形是否还在打开状态:

import matplotlib.pyplot as plt

if plt.fignum_exists(<figure number>):
    # Figure is still opened
else:
    # Figure is closed

每个图形都有一个图形编号,这个编号可以通过fig.number来查看。

顺便说一下,在figure(num=…)中使用的“编号”其实可以是字符串,这个字符串会显示在窗口的标题上。不过,图形还是有一个number属性,它是一个数字。你可以用原来的字符串 num值来调用fignum_exists()(根据Mark H在评论中的说法,从2015年开始就可以这样做)。

另外,subplots(…, num=<string num>)可以正确地找到已经存在的图形,前提是你给它提供了正确的字符串编号。因此,在Matplotlib的某些部分,图形仍然是通过它们的字符串编号来识别的。

撰写回答