Python Matplotlib中的Agg与交互式绘图和tight_layout

9
如果我使用Agg后端,无论是否使用block=True,我都无法保持图像窗口打开状态,它们会立即关闭。如果我不使用Agg,则会收到警告:

/Library/Python/2.7/site-packages/matplotlib-1.2.0-py2.7-macosx-10.8-intel.egg/matplotlib/tight_layout.py:225: UserWarning: tight_layout : falling back to Agg renderer warnings.warn("tight_layout : falling back to Agg renderer")

示例代码:

import matplotlib as mpl
mpl.use('Agg')      # With this line = figure disappears; without this line = warning
import matplotlib.pyplot as plt
import matplotlib.mlab as mlab
import numpy as np

fig = plt.figure()
ax = fig.add_subplot(111)
mu, sigma = 0, 0.5
x = np.linspace(-3, 3, 100)
plt.plot(x, mlab.normpdf(x, mu, sigma))
fig.tight_layout()
plt.show()

我应该使用不同的后端或方法吗?


(这句话涉及IT技术方面,建议您提供更多上下文信息以便我能够更好地理解和翻译)

你的默认后端是什么?如果你执行 import matplotlib as mpl 然后 mpl.get_backend(),你会得到什么?这将是它在没有指定 "Agg" 时使用的后端,你可以通过从这两个中的任何一个切换到不同的后端来获得你想要的结果。 - BrenBarn
@zhermes:你最终找到解决方法了吗?我也遇到了同样的问题。 - nia
2
不太令人满意的解决方法是删除 mpl.use('Agg'),并使用 fig.set_tight_layout(True) 代替 fig.tight_layout(),正如 @FelipeCorreia 建议的那样。 - DilithiumMatrix
2个回答

8

或者如果使用非面向对象的界面,则可以使用plt.gcf().set_tight_layout(True)来代替plt.tight_layout() - 1''
我不使用 plt.tight_layout(),而是使用 fig.tight_layout()... 这是由 plt.gcf() 返回的 对象 - DilithiumMatrix
1
当然,这里只是为那些只熟悉 plt.function() 语法的人添加注释。 - 1''

6

Agg 是一个非交互式后端,意味着它不会在屏幕上显示,只能保存到文件中。你正在使用哪个后端?你有OSX,也许可以尝试使用'macosx'或使用Agg的交互式后端(例如QT4Agg,WXAgg)。


谢谢Tiago,我尝试了这两个方法,但仍然收到相同的警告信息。我不明白的是,如果它正在“回退到AGG”,那么为什么交互式绘图仍然可以工作? - DilithiumMatrix
9
如果选择交互式模式,可以尝试使用fig.set_tight_layout(True)代替fig.tight_layout()。请参考GitHub上这个问题中的评论。 - Filipe Correia
@FilipeCorreia 您的建议即使在使用非交互式后端(如pdf)时也有效。您能否将其发布为答案? - 1''

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