Python无头MatplotLib/Pyplot

Bol*_*ter 27 python matplotlib

我想使我的数据分析和报告较少眼睛刺痛和更多图形自动生成图表,文件,要做到这一点我一直在玩matplotlib/pyplot/pylab.工作得非常出色,但是当我尝试在无头服务器上运行时......

tkinter.TclError: no display name and no $DISPLAY environment variable
Run Code Online (Sandbox Code Playgroud)

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

import matplotlib
matplotlib.use("Agg")
Run Code Online (Sandbox Code Playgroud)

哪个应该改变后端,但没有效果.

我有什么想法我做错了吗?

远程机器确实具有X转发功能,但由于此应用程序不需要显示任何内容,我相信通常的ssh -X hack是矫枉过正的.

示例:恶魔欺骗

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

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")
Run Code Online (Sandbox Code Playgroud)

非工作实际代码

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')
Run Code Online (Sandbox Code Playgroud)

没有别的东西可以触及pyplot.

sam*_*ias 18

你描述的一切听起来都是对的.运行时会发生什么:

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

在我的环境中它产生了这个(我缩小了它):

在此输入图像描述


And*_*ini 9

导入numpy 之前尝试导入matplotlib并设置Agg后端:

import matplotlib
matplotlib.use("Agg")
Run Code Online (Sandbox Code Playgroud)


Bol*_*ter 9

原来一个实用程序文件(不是我的!)正在吸引pylab其他东西.将matplotlib后端选择移至初始页面.

  • 这似乎可以解决问题.在**之前导入matplotlib**其他任何可能导入pylab的东西. (6认同)