Readthedocs.org: Matplotlib 后端应强制为 Agg

创建于 2015-03-17  ·  22评论  ·  资料来源: readthedocs/readthedocs.org

最近我们开始看到这个错误出现:

matplotlib.use() must be called *before* pylab, matplotlib.pyplot,
or matplotlib.backends is imported for the first time.

  warnings.warn(_use_error_msg)
/var/build/user_builds/astropy/checkouts/latest/docs/analytic_functions/index.rst:83: WARNING: Exception occurred in plotting index-1
 from /var/build/user_builds/astropy/checkouts/latest/docs/analytic_functions/index.rst:
Traceback (most recent call last):
  File "/usr/lib/pymodules/python2.7/matplotlib/sphinxext/plot_directive.py", line 515, in run_code
    exec code in ns
  File "<string>", line 14, in <module>
  File "/usr/lib/pymodules/python2.7/matplotlib/pyplot.py", line 1046, in subplots
    fig = figure(**fig_kw)
  File "/usr/lib/pymodules/python2.7/matplotlib/pyplot.py", line 423, in figure
    **kwargs)
  File "/usr/lib/pymodules/python2.7/matplotlib/backends/backend_tkagg.py", line 79, in new_figure_manager
    return new_figure_manager_given_figure(num, figure)
  File "/usr/lib/pymodules/python2.7/matplotlib/backends/backend_tkagg.py", line 87, in new_figure_manager_given_figure
    window = Tk.Tk()
  File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1767, in __init__
    self.tk = _tkinter.create(screenName, baseName, className, interactive, wantobjects, useTk, sync, use)
TclError: no display name and no $DISPLAY environment variable

使用 matplotlib plot_directive 时。 RTD 配置似乎发生了一些变化,后端默认为交互式。

(这是有人首先报告此问题的 Astropy 问题:https://github.com/astropy/astropy/issues/3600)

Operations

最有用的评论

你好,
这对我不起作用
导入 matplotlib
matplotlib.use('Agg')

所以我用:
导入 matplotlib.pyplot 作为 plt
plt.switch_backend('agg')

那行得通。 也许它对其他人有帮助。

所有22条评论

@ericholscher - 知道是什么原因造成的吗? 由于这个问题,我们所有的图目前都被破坏了,这似乎超出了我们的控制并且与 RTD 相关。 其他项目没有这个问题吗?

我们没有改变我所知道的任何事情。 您是否尝试过这种解决方法?
http://stackoverflow.com/a/3054314

2015 年 3 月 24 日,星期二,凌晨 1:48,Thomas Robitaille < [email protected]

写道:

@ericholscher https://github.com/ericholscher - 知道可能是什么
造成这个? 由于这个问题,我们所有的地块目前都被破坏了,这
似乎超出了我们的控制范围并且与 RTD 相关。 其他项目没有
这个问题?


直接回复此邮件或在 GitHub 上查看
https://github.com/rtfd/readthedocs.org/issues/1195#issuecomment -85406365
.

埃里克·霍尔舍
居住在波特兰的互联网制造商,或者
http://ericholscher.com

@ericholscher - 是的,我们已经调用了它,但我们看到:

/usr/lib/pymodules/python2.7/matplotlib/__init__.py:1173: UserWarning:  This call to matplotlib.use() has no effect
because the backend has already been chosen;
matplotlib.use() must be called *before* pylab, matplotlib.pyplot,
or matplotlib.backends is imported for the first time.

这表明已经预先设置了后端。

有什么建议? 我对 matplotlib 了解不多,我们还没有做过
我知道的任何事情都应该影响它。 我很高兴升级它,似乎
我们使用的是 1.3.1,但我真的不知道如何调试问题,因为我
完全不懂软件。

2015 年 3 月 24 日,星期二,上午 9:01,Thomas Robitaille < [email protected]

写道:

@ericholscher https://github.com/ericholscher - 是的,我们已经打电话
但是我们看到:

/usr/lib/pymodules/python2.7/matplotlib/初始化的.py:1173:UserWarning:此调用matplotlib.use()有没有影响
因为已经选择了后端;
matplotlib.use() 必须在_before_ pylab、matplotlib.pyplot、
或者 matplotlib.backends 是第一次导入。

这表明已经预先设置了后端。


直接回复此邮件或在 GitHub 上查看
https://github.com/rtfd/readthedocs.org/issues/1195#issuecomment -85576963
.

埃里克·霍尔舍
居住在波特兰的互联网制造商,或者
http://ericholscher.com

也许@mdboom有一些想法 - 我也对目前的行为感到有些困惑。 基本上我不明白它是如何改变使用 TkAgg (因为 RTD 上的默认值似乎是 Agg )。

啊,对不起,我想我有。 看看这个极简主义的项目:

https://github.com/astrofrog/test-rtd

RTD 日志 (https://readthedocs.org/builds/test-rtd-astrofrog/2482239/) 显示:

Making output directory...
Running Sphinx v1.2.2
TkAgg

所以默认后端设置为 TkAgg。

@mdboom ,您对如何确保系统范围内的默认后端是 Agg 而不是 TkAgg 有什么建议吗? RTD 上没有理由需要 TkAgg 后端。

看起来 /etc/matplotlibrc 中有一个设置它的配置。

2015 年 3 月 24 日,星期二,上午 9:14,Thomas Robitaille < [email protected]

写道:

啊,对不起,我想我有。 看看这个极简主义的项目:

https://github.com/astrofrog/test-rtd

RTD 日志 (https://readthedocs.org/builds/test-rtd-astrofrog/2482239/)
显示:

制作输出目录...
运行 Sphinx v1.2.2
TkAgg

所以默认后端设置为 TkAgg。

@mdboom https://github.com/mdboom ,你有什么建议吗?
确保系统范围内的默认后端是 Agg,而不是 TkAgg?


直接回复此邮件或在 GitHub 上查看
https://github.com/rtfd/readthedocs.org/issues/1195#issuecomment -85586195
.

埃里克·霍尔舍
居住在波特兰的互联网制造商,或者
http://ericholscher.com

@ericholscher - 太好了,你能把它改成Agg吗? 没有理由在像 RTD 这样的无显示服务器上它应该是其他任何东西。 那么没有人将需要使用matplotlib.use解决方法。

@ericholscher - 现在似乎可以正常工作了,您是否进行了更改? 如果是这样,这个问题可以关闭:)

是的,应该改了。 将保持打开状态,因为它需要修复
我们的部署脚本也是如此,所以当我们更新一个新的时它不会再次中断
构建服务器。

2015 年 3 月 24 日,星期二,上午 10:53,Thomas Robitaille <
[email protected]> 写道:

@ericholscher https://github.com/ericholscher - 它似乎有效
现在,你做出改变了吗? 如果是这样,这个问题可以关闭:)


直接回复此邮件或在 GitHub 上查看
https://github.com/rtfd/readthedocs.org/issues/1195#issuecomment -85620289
.

埃里克·霍尔舍
居住在波特兰的互联网制造商,或者
http://ericholscher.com

相信这应该是固定的。

你好,我遇到了同样的问题
“因为已经选择了后端;matplotlib.use() 必须在 _before_ pylab、matplotlib.pyplot 或 matplotlib.backends 首次导入之前调用。”
我想知道如何配置 /etc/matplotlibrc 来解决这个问题。
谢谢 !!!

嗨,任何人都可以评论如何解决这个问题。 如何配置/etc/matplotlibrc来解决这个问题。

将这些行放在 Py 代码的开头就解决了这个目的:
导入 matplotlib
matplotlib.use('Agg')

你好,
这对我不起作用
导入 matplotlib
matplotlib.use('Agg')

所以我用:
导入 matplotlib.pyplot 作为 plt
plt.switch_backend('agg')

那行得通。 也许它对其他人有帮助。

您好,我在 spyder 中工作,在@windows 中,这有用
转到“工具”>“首选项”>“IPython 终端”>“图形”(菜单名称是近似值,因为我的 spyder 是西班牙语)
在此处,取消选中“激活支持”框。

重新启动 spyder,然后键入:

导入 matplotlib
matplotlib.use('TkAgg')
导入 matplotlib.pyplot 作为 plt

保存到 pdf 文件的绘图示例

a = [1, 2, 3, 4]
b = [2, 4, 6, 8]
plt.plot(a, b)

plt.savefig('test.pdf')

我希望这可以帮助你。

难道这个问题在 Python 3.6 镜像中又出现了? 既然它得到了

No module named '_tkinter'

用于导入带有最新图像的 matplotlib 的模块。

@Tillsten您是否尝试在您的 requirements.txt 文件中指定该要求? 如果您仍然认为问题与 rtd 相关,请使用您的 rtd 项目链接打开一个新问题。

是的,我做到了。 问题似乎与此问题相同:安装了 matplotlib,但默认后端设置为 tkagg(使用 tkinter),这在 headless rtd-image 上不可用。 这个问题可以通过像上面那样更改 rc 文件或将 matplotlib 升级到 3.0 来解决,这应该可以解决这个问题。

我目前的解决方法是在 sphinx conf.py导入和设置 matplotlib 后端:

 import matplotlib
 matplotlib.use('agg')

感谢分享解决方法! 稍后我会看一下 docker 图像

我在 docker 图像上没有看到与此相关的任何其他内容,因此,不确定这是如何解决的(也许 rtd 那时没有使用 docker 图像?)。 我们有一个解决方法,所以,不确定我们是否应该重新打开。 也许将此添加到常见问题解答中?

此页面是否有帮助?
0 / 5 - 0 等级