sil*_*ado 15 python linux matplotlib
我正在脚本中生成matplotlib数字,我可以在有或没有图形显示的情况下交替运行.我希望脚本能够自动调整:通过显示,它应该以交互方式显示数字,而没有显示,它应该只是将它们保存到文件中.
从没有正在运行的X服务器生成matplotlib图的问题的答案,我了解到可以使用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")
Run Code Online (Sandbox Code Playgroud)
这在带有显示器的情况下是例外的.但是,如果没有显示,则调用matplotlib.use
无效,因为已经选择了显示.很明显我matplotlib.use
之前应该打电话import matplotlib.pyplot
,但后来我不知道如何测试显示器是否可用.
我也试过使用实验函数matplotlib.switch_backend
而不是matplotlib.use
,但这会产生RuntimeError.
有人知道如何使上述代码按预期工作,或者可以建议另一种方法来检测显示器是否可用于matplotlib?
Oz1*_*123 16
如果你在python中有一个带有OS模块的显示器,你可以直接检测.就我而言
>>> import os
>>> os.environ["DISPLAY"]
':0.0'
Run Code Online (Sandbox Code Playgroud)
下面的代码适用于 Linux 和 Windows(假设有显示设备):
import os
import matplotlib
if os.name == 'posix' and "DISPLAY" not in os.environ:
matplotlib.use('Agg')
Run Code Online (Sandbox Code Playgroud)
请注意,该行matplotlib.use('Agg')
必须出现在第一次导入之后matplotlib
(否则会出错)。
试试这个?
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()
Run Code Online (Sandbox Code Playgroud)