Python无头Matplotlib/Pyplot

37

我试图通过自动生成图形文件,使我的数据分析和报告更加有可读性、更少的刺激眼球,并且为此我一直在使用matplotlib/pyplot/pylab。效果非常好,但当我尝试在无头服务器上运行时...

tkinter.TclError: no display name and no $DISPLAY environment variable

对于这个应用程序,我只使用PyLab,但在进行一些谷歌搜索后,在导入pylab之前加入了以下内容:

import matplotlib
matplotlib.use("Agg")

我原本以为更改后端代码可以解决问题,但实际上并没有效果。

你们有什么想法吗?

远程机器确实支持X-forwarding功能,但由于这个应用程序不需要显示任何内容,我认为通常的ssh -X方法过于繁琐。

举例:Fiendish Deception

在同一台机器上的可行示例代码

import matplotlib
matplotlib.use("Agg")
import numpy as np
import pylab as pl


xvals=np.arange(100)
yvals=np.cumsum(np.random.random(100))
yvals[-10:]=0
yvals=np.log(yvals)
pl.close()

pl.plot(xvals,yvals)
pl.xlabel("X")
pl.ylabel("Y")
pl.title("Title")

pl.savefig("testgraph.png")

不能运行的 实际代码

import matplotlib
matplotlib.use("Agg")
import numpy as np
import pylab as pl
import utility as util
import os

... non graph stuff...
def graph_p(self):
    pl.close()
    channels=range(self.p.shape[0])
    for line in range(self.p.shape[1]):
        yvals=np.ma.masked_invalid(map(util.watts_to_dbmhz,self.p[:,line]))
        pl.plot(channels,yvals) #Error says it occurs here
    pl.xlabel("Subchannel Index")
    pl.ylabel("Power (dbmhz)")
    pl.title("Plot of per-tone power assignments for %d lines"%self.p.shape[1])
    pl.savefig(self.dest+self.scenario+'-power.png')

没有其他东西可以接触pyplot。


确实非常奇怪。你能否发布一个最小的(不)工作示例?Agg 后端不应该需要 X。 - Andrea Spadaccini
已更新为最小示例,但现在我无法打破它! - Bolster
3个回答

28

你描述的一切都是正确的。当你运行这个时会发生什么:

import matplotlib
matplotlib.use('Agg')
import pylab
pylab.plot([1,2], [3,4], linestyle='-')
pylab.savefig('foo.png')

在我的环境中它会产生以下结果(我将其缩小了):

在此输入图片描述


15

尝试先导入matplotlib,并在导入numpy之前设置后端为Agg

import matplotlib
matplotlib.use("Agg")

没有任何行为变化。即使mpl是第一件被导入并“使用”的东西。 - Bolster

12

事实证明,一个实用程序文件(不是我的!)正在引入pylab以获取其他东西。将matplotlib后端选择移至初始页面。


6
这似乎行得通。在可能导入pylab的任何其他东西之前,先导入matplotlib。 - Cerin

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