【问题标题】:Create multiple figures in pyplot, but only show one在pyplot中创建多个图形,但只显示一个
【发布时间】:2018-11-01 07:52:17
【问题描述】:

我有一个脚本,可以生成许多不同的图形并将句柄保存到字典中。通常我想绘制所有这些,但有时我正在处理一个,并且只想绘制那个。

我的理解是plt.show() 会显示所有的情节。如果我分配图形句柄(即做fig1 = plt.figure())然后使用fig1.show() 应该只显示与该句柄关联的图形,这似乎是合乎逻辑的。

这是一个 MWE:

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(0, 100)
y1 = np.random.rand(100)
y2 = np.random.rand(100)

fig1 = plt.figure()
plt.plot(x, y1, 'o')

fig2 = plt.figure()
plt.plot(x, y2, 'o')

fig1.show()

这似乎可行,但图形在创建后立即消失。我的理解是fig1.show() 需要在一个循环中,因为类Figure.show() 方法不会像plt.show() 那样调用while 循环。

我意识到这类似于以下问题: How can I show figures separately in matplotlib? 但接受的答案似乎并没有解决最初的问题(正如 cmets 中所指出的那样)。

fig1.show() 放在while 循环中是否正确?如果是这样,你是怎么做到的?

【问题讨论】:

    标签: matplotlib


    【解决方案1】:

    您可以关闭除要显示的图形之外的所有其他图形。那么调用plt.show()只会显示一个未关闭的图。

    import numpy as np
    import matplotlib.pyplot as plt
    
    x = np.arange(0, 100)
    y1 = np.random.rand(100)
    y2 = np.random.rand(100)
    
    fig1 = plt.figure()
    plt.plot(x, y1, 'o')
    
    fig2 = plt.figure()
    plt.plot(x, y2, 'o')
    
    def figshow(figure):
        for i in plt.get_fignums():
            if figure != plt.figure(i):
                plt.close(plt.figure(i))
        plt.show()
    
    figshow(fig2)
    

    【讨论】:

    • 这行得通,但我收到了警告消息 (can't invoke "event" command: application has been destroyed) 的轰炸。我喜欢你的功能。可以进行编辑以允许列出数字,这比将它们全部写出来要快得多。
    • 警告可能来自在交互模式下运行它? plt.ioff() 会摆脱它们吗?
    • 不,plt.ioff() 似乎没有改变警告。这是完整的信息。对于每个封闭的情节,我都会得到其中一个:'无法调用“事件”命令:应用程序已在执行“事件生成 $w >”(过程“ttk::ThemeChanged”第 6 行)调用时被破坏在“ttk::ThemeChanged”内
    • 所涉及的 tk 后端似乎存在更严重的问题。我试过import matplotlib; matplotlib.use("Qt5Agg"),效果很好。
    • 请注意,这应该由github.com/matplotlib/matplotlib/pull/12707 修复。该错误修复可能会使其进入 matplotlib 的 3.0.2 版本,该版本很快就会出现。
    【解决方案2】:

    您可以添加一个等待用户输入的语句,然后该图将显示,并在您按下一个键后关闭:

    fig1.show() 
    raw_input()
    

    【讨论】:

    • 如此简单,却完美地做到了!我的印象是show() 在消失之前只出现了片刻。我猜它会显示这个数字,直到整个脚本被处理。说得通。对于 Python 3 用户,raw_input() 已替换为 input()
    猜你喜欢
    • 2020-12-20
    • 2017-06-29
    • 2013-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多