Я генерирую цифры matplotlib в script, который я запускаю в качестве альтернативы с графическим дисплеем или без него. Я бы хотел, чтобы script настраивался автоматически: с дисплеем он должен показывать фигуры в интерактивном режиме, а без дисплея - просто сохранять их в файл.
Из ответа на вопрос Создание графиков matplotlib без запуска X-сервера я узнал, что для неинтерактивного построения можно использовать бэкэнд 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 или нет?