在我使用matplotlib
的Python模块中,我想确保它在我通过ssh
在远程计算机上运行脚本时也能正常工作。所以我这样做:
import matplotlib
matplotlib.use('Agg')
from matplotlib.backends.backend_pdf import PdfPages
import matplotlib.mlab as mlab
import matplotlib.pyplot as plt
import numpy as np
import pylab
import scipy.stats
import scipy.stats.mstats
有效。太糟糕了,当我在机器上运行直接(不是远程!)时,它给了我以下警告:
对matplotlib.use()的调用没有效果,因为后端 已被选中; matplotlib.use()必须在之前调用 导入了pylab,matplotlib.pyplot或matplotlib.backends 第一次。
如何删除此邮件?
答案 0 :(得分:5)
虽然我无法测试,但Ipython告诉我“人们可以设置warn = False以禁止警告。”
来源:
matplotlib.use?
Type: function
String Form:<function use at 0x98da02c>
File: /usr/lib/pymodules/python2.7/matplotlib/__init__.py
Definition: matplotlib.use(arg, warn=True)
Docstring:
Set the matplotlib backend to one of the known backends.
The argument is case-insensitive. For the Cairo backend,
the argument can have an extension to indicate the type of
output. Example:
use('cairo.pdf')
will specify a default of pdf output generated by Cairo.
.. note::
This function must be called *before* importing pyplot for
the first time; or, if you are not using pyplot, it must be called
before importing matplotlib.backends. If warn is True, a warning
is issued if you try and call this after pylab or pyplot have been
loaded. In certain black magic use cases, e.g.
:func:`pyplot.switch_backends`, we are doing the reloading necessary to
make the backend switch work (in some cases, e.g. pure image
backends) so one can set warn=False to supporess the warnings.
To find out which backend is currently set, see
:func:`matplotlib.get_backend`.
在文档中找到拼写错误总是很有趣。
答案 1 :(得分:1)
警告消息通常很重要,我建议不要忽略。我在寻找使用Sphinx的文档构建解决方案时找到了您的问题。我收到了类似的消息,以及警告的其他上下文:
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.
The backend was originally set to 'Qt5Agg' by the following code:
File "setup.py", line 131, in <module>
'psql' : ['psycopg2>=2.7.1'],
然后我在https://github.com/conchoecia/pauvre/issues/18找到了解决方案。导入顺序如下:
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
在修复之前,我只有以下模块导入
from mymod.utils import plotutils
import mymod.plots as plots
import matplotlib.pyplot as plt
我认为此问题的导入顺序导致了警告消息。但是,我无法为您提供的信息重新创建您的警告。看到该警告再多出几行,那就太好了。
与其他开发人员进行了更多讨论之后,很明显我的pyplot导入在文件中,而它属于模块中我需要使用plt的位置。
理解渲染很重要,您可以从中获得更多信息 https://matplotlib.org/faq/usage_faq.html#what-is-a-backend 和 https://matplotlib.org/api/matplotlib_configuration_api.html#matplotlib.use 请记住,其他处理代码可能正在更改或默认后端名称。