我正在脚本中生成matplotlib数字,我可以选择使用或不使用图形显示。我希望脚本能够自动调整:通过显示,它应该以交互方式显示数字,而没有显示,它应该只是将它们保存到文件中。
从问题Generating matplotlib graphs without a running X server的答案中,我了解到可以使用Agg后端进行非交互式绘图。
所以我正在尝试使用此代码:
import matplotlib
try:
import matplotlib.pyplot as plt
fig = plt.figure()
havedisplay = True
except:
matplotlib.use("Agg")
import matplotlib.pyplot as plt
fig = plt.figure()
havedisplay = False
# do the plotting
if havedisplay:
plt.show()
else:
fig.savefig("myfig.png")
在具有显示器的情况下,这是例外的。但是,如果没有显示,则对matplotlib.use
的调用无效,因为已经选择了显示。很明显,我应该在matplotlib.use
之前调用import matplotlib.pyplot
,但之后我不知道如何测试显示是否可用。
我还尝试使用实验函数matplotlib.switch_backend
而不是matplotlib.use
,但这会生成RuntimeError。
有人知道如何使上述代码按预期工作,或者可以建议另一种方法来检测显示器是否可用于matplotlib?
答案 0 :(得分:15)
如果你在python中有一个带有OS模块的显示器,你可以直接检测。 在我的情况下它是
>>> import os
>>> os.environ["DISPLAY"]
':0.0'
答案 1 :(得分:5)
试试这个吗?
import matplotlib,os
r = os.system('python -c "import matplotlib.pyplot as plt;plt.figure()"')
if r != 0:
matplotlib.use('Agg')
import matplotlib.pyplot as plt
fig = plt.figure()
fig.savefig('myfig.png')
else:
import matplotlib.pyplot as plt
fig = plt.figure()
plt.show()
答案 2 :(得分:4)
以下代码适用于Linux和Windows(假设有显示设备):
import os
import matplotlib
if os.name == 'posix' and "DISPLAY" not in os.environ:
matplotlib.use('Agg')
请参阅https://stackoverflow.com/a/1325587/896111。
请注意,第一次导入matplotlib.use('Agg')
后必须显示第matplotlib
行(否则您将收到错误消息)。
答案 3 :(得分:3)
通过结合上述两种方法,您可能会获得最佳解决方案:
havedisplay = "DISPLAY" in os.environ
if not havedisplay:
exitval = os.system('python -c "import matplotlib.pyplot as plt; plt.figure()"')
havedisplay = (exitval == 0)
此组合的原因是os.system
命令的运行时间可能需要一段时间。因此,当您确定显示时(通过os.environ
值判断),您可以节省时间。
另一方面,即使DISPLAY
变量中未设置os.environ
键,绘图方法仍有可能与图形界面一起使用(例如,使用Windows命令行时)。
答案 4 :(得分:1)
当使用GUI后端图形对象有show()方法时,可以用它来进行切换:
import matplotlib
#matplotlib.use("Agg")
import matplotlib.pyplot as plt
fig = plt.figure()
havedisplay = False
if hasattr(fig, "show"):
plt.show()
else:
print "save fig"
fig.savefig("myfig.png")
答案 5 :(得分:1)
@ Oz123提供的解决方案为我生成了语法错误。但是,我能够使用以下方法轻松检测显示:
import os
havedisplay = "DISPLAY" in os.environ
#plotting...
无论如何,这是我能找到的最简单的事情。
答案 6 :(得分:0)
import os
have_display = bool(os.environ.get('DISPLAY', None))
如果have_display
不在环境中或为空字符串,则 DISPLAY
为False。否则,是真的