【问题标题】:Choosing which figures to show on-screen and which to save to a file using Python's matplotlib使用 Python 的 matplotlib 选择要在屏幕上显示的图形以及要保存到文件中的图形
【发布时间】:2011-05-23 06:17:48
【问题描述】:

我想使用matplotlib.pyplot 在 Python 中创建不同的图形。然后我想将其中一些保存到一个文件中,而其他的应该使用show() 命令显示在屏幕上。

但是,show() 显示所有创建的人物。在创建不想在屏幕上显示的绘图后,我可以通过调用close() 来避免这种情况,如下面的代码:

import matplotlib.pyplot as plt

y1 = [4, 2, 7, 3]
y2 = [-7, 0, -1, -3]

plt.figure()
plt.plot(y1)
plt.savefig('figure1.png')
plt.close()

plt.figure()
plt.plot(y2)

plt.show()
plt.close('all')

这会保存第一个图形并显示第二个图形。但是,我收到一条错误消息:

无法调用“事件”命令:应用程序在执行时已被销毁

是否可以以更优雅的方式选择要显示的图形?

另外,第一个figure() 命令是多余的吗?给不给好像没什么区别。

非常感谢。

【问题讨论】:

    标签: python matplotlib


    【解决方案1】:

    更好的方法是使用plt.clf() 而不是plt.close()。 此外plt.figure() 会创建一个新图表,而您可以使用plt.clf() 清除之前的图表:

    import matplotlib.pyplot as plt
    
    y1 = [4, 2, 7, 3]
    y2 = [-7, 0, -1, -3]
    
    plt.figure()
    plt.plot(y1)
    plt.savefig('figure1.png')
    plt.clf()
    
    plt.plot(y2)
    
    plt.show()
    plt.clf()
    

    此代码不会产生错误或警告,例如无法调用“事件”命令...

    【讨论】:

      【解决方案2】:

      一般来说,你可以直接关闭图。举个简单的例子:

      import matplotlib.pyplot as plt
      
      fig1 = plt.figure()
      plt.plot(range(10), 'ro-')
      plt.title('This figure will be saved but not shown')
      fig1.savefig('fig1.png')
      plt.close(fig1)
      
      fig2 = plt.figure()
      plt.plot(range(10), 'bo')
      plt.title('This figure will be shown')
      
      plt.show()
      

      至于第一个plt.figure() 调用是否是多余的,这取决于你在做什么。通常,您希望保留它返回的图形对象并使用它,而不是使用 matplotlib 的 matlab-ish 状态机接口。

      当您制作更复杂的绘图时,通常值得多写一行代码来执行以下操作:

      fig = plt.figure()
      ax = fig.add_subplot(1,1,1)
      ax.plot(range(10))
      

      优点是您不必担心哪个图形或轴是“活动的”,您只需引用特定的轴或图形对象。

      【讨论】:

      • 感谢您的及时回复,乔。但是,与我的代码类似,这会给出以下错误消息:无法调用“事件”命令:应用程序已在执行“事件生成 $w >”时被破坏(过程“ttk::ThemeChanged”第 6 行) 从“ttk::ThemeChanged”中调用
      • @gandi2223 - 你能发布完整的回溯吗?那应该会产生错误...
      • 嗯,完整回溯到底是什么意思?我看过docs.python.org/library/traceback.html,但我不确定如何实现这一点。
      • 我认为问题是我正在关闭第一个图,然后 - 在创建第二个图之后 - Python 想要显示并关闭所有图。我认为它很困难,因为第一个情节已经关闭。这有意义吗?
      • @gandi2223 - 啊,这是 TK 警告,而不是 python 错误。您应该能够安全地忽略它(一切似乎都运行良好)。它没有发生在旧版本的 matplotlib 和/或 TK 上(这就是为什么我之前无法重现它。从那以后我已经升级了东西,我得到了同样的警告。)。这可能是一个错误,但它似乎只是一个警告。一切似乎仍然有效......
      猜你喜欢
      • 2016-10-18
      • 2020-07-16
      • 2015-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多