Генерация PNG с помощью matplotlib, когда DISPLAY не определен - PullRequest
300 голосов
/ 10 мая 2010

Я пытаюсь использовать networkx с Python. Когда я запускаю эту программу, она получает эту ошибку. Чего не хватает?

#!/usr/bin/env python

import networkx as nx
import matplotlib
import matplotlib.pyplot
import matplotlib.pyplot as plt

G=nx.Graph()
G.add_node(1)
G.add_nodes_from([2,3,4,5,6,7,8,9,10])
#nx.draw_graphviz(G)
#nx_write_dot(G, 'node.png')
nx.draw(G)
plt.savefig("/var/www/node.png")


Traceback (most recent call last):
  File "graph.py", line 13, in <module>
    nx.draw(G)
  File "/usr/lib/pymodules/python2.5/networkx/drawing/nx_pylab.py", line 124, in draw
    cf=pylab.gcf()
  File "/usr/lib/pymodules/python2.5/matplotlib/pyplot.py", line 276, in gcf
    return figure()
  File "/usr/lib/pymodules/python2.5/matplotlib/pyplot.py", line 254, in figure
    **kwargs)
  File "/usr/lib/pymodules/python2.5/matplotlib/backends/backend_tkagg.py", line 90, in new_figure_manager
    window = Tk.Tk()
  File "/usr/lib/python2.5/lib-tk/Tkinter.py", line 1650, in __init__
    self.tk = _tkinter.create(screenName, baseName, className, interactive, wantobjects, useTk, sync, use)
_tkinter.TclError: no display name and no $DISPLAY environment variable

Теперь я получаю другую ошибку:

#!/usr/bin/env python

import networkx as nx
import matplotlib
import matplotlib.pyplot
import matplotlib.pyplot as plt

matplotlib.use('Agg')

G=nx.Graph()
G.add_node(1)
G.add_nodes_from([2,3,4,5,6,7,8,9,10])
#nx.draw_graphviz(G)
#nx_write_dot(G, 'node.png')
nx.draw(G)
plt.savefig("/var/www/node.png")

/usr/lib/pymodules/python2.5/matplotlib/__init__.py:835: UserWarning:  This call to matplotlib.use() has no effect
because the the backend has already been chosen;
matplotlib.use() must be called *before* pylab, matplotlib.pyplot,
or matplotlib.backends is imported for the first time.

  if warn: warnings.warn(_use_error_msg)
Traceback (most recent call last):
  File "graph.py", line 15, in <module>
    nx.draw(G)
  File "/usr/lib/python2.5/site-packages/networkx-1.2.dev-py2.5.egg/networkx/drawing/nx_pylab.py", line 124, in draw
    cf=pylab.gcf()
  File "/usr/lib/pymodules/python2.5/matplotlib/pyplot.py", line 276, in gcf
    return figure()
  File "/usr/lib/pymodules/python2.5/matplotlib/pyplot.py", line 254, in figure
    **kwargs)
  File "/usr/lib/pymodules/python2.5/matplotlib/backends/backend_tkagg.py", line 90, in new_figure_manager
    window = Tk.Tk()
  File "/usr/lib/python2.5/lib-tk/Tkinter.py", line 1650, in __init__
    self.tk = _tkinter.create(screenName, baseName, className, interactive, wantobjects, useTk, sync, use)
_tkinter.TclError: no display name and no $DISPLAY environment variable

Теперь я получаю другую ошибку:

#!/usr/bin/env python

import networkx as nx
import matplotlib
import matplotlib.pyplot
import matplotlib.pyplot as plt

matplotlib.use('Agg')

G=nx.Graph()
G.add_node(1)
G.add_nodes_from([2,3,4,5,6,7,8,9,10])
#nx.draw_graphviz(G)
#nx_write_dot(G, 'node.png')
nx.draw(G)
plt.savefig("/var/www/node.png")

/usr/lib/pymodules/python2.5/matplotlib/__init__.py:835: UserWarning:  This call to matplotlib.use() has no effect
because the the backend has already been chosen;
matplotlib.use() must be called *before* pylab, matplotlib.pyplot,
or matplotlib.backends is imported for the first time.

  if warn: warnings.warn(_use_error_msg)
Traceback (most recent call last):
  File "graph.py", line 15, in <module>
    nx.draw(G)
  File "/usr/lib/python2.5/site-packages/networkx-1.2.dev-py2.5.egg/networkx/drawing/nx_pylab.py", line 124, in draw
    cf=pylab.gcf()
  File "/usr/lib/pymodules/python2.5/matplotlib/pyplot.py", line 276, in gcf
    return figure()
  File "/usr/lib/pymodules/python2.5/matplotlib/pyplot.py", line 254, in figure
    **kwargs)
  File "/usr/lib/pymodules/python2.5/matplotlib/backends/backend_tkagg.py", line 90, in new_figure_manager
    window = Tk.Tk()
  File "/usr/lib/python2.5/lib-tk/Tkinter.py", line 1650, in __init__
    self.tk = _tkinter.create(screenName, baseName, className, interactive, wantobjects, useTk, sync, use)
_tkinter.TclError: no display name and no $DISPLAY environment variable

Ответы [ 12 ]

504 голосов
/ 16 июня 2010

Основная проблема заключается в том, что (в вашей системе) matplotlib выбирает бэкэнд с использованием x по умолчанию. У меня была такая же проблема на одном из моих серверов. Решением для меня было добавить следующий код в место, которое читается перед любым другим pylab / matplotlib / pyplot import:

import matplotlib
# Force matplotlib to not use any Xwindows backend.
matplotlib.use('Agg')

Альтернатива - установить его в .matplotlibrc

71 голосов
/ 18 ноября 2012

Так же, как дополнение к ответу Рейно.

Постоянный способ решения этой проблемы - редактировать файл .matplotlibrc. Найти через

>>> import matplotlib<br/>>>> matplotlib.matplotlib_fname()
# This is the file location in Ubuntu
'/etc/matplotlibrc'

Затем измените бэкэнд в этом файле на backend : Agg. Вот и все.

42 голосов
/ 29 марта 2016

Чистый ответ - немного времени, чтобы правильно подготовить среду выполнения.

Первая техника, которую вы должны подготовить для своей среды исполнения, - это использовать файл matplotlibrc, , как мудро рекомендовано Крисом Q. , настройка

backend : Agg

в этом файле. Вы даже можете контролировать - без изменений кода - , как и где matplotlib ищет и находит файл matplotlibrc .

Второй метод подготовки среды выполнения - использование переменной среды MPLBACKEND (и информирование пользователей о ее использовании):

export MPLBACKEND="agg"
python <program_using_matplotlib.py>

Это удобно, потому что вам даже не нужно предоставлять другой файл на диске, чтобы это работало. Я использовал этот подход, например, для тестирования в режиме непрерывной интеграции и запуска на удаленных компьютерах, на которых нет дисплеев.

Жесткое кодирование вашего бэкэнда matplotlib в "Agg" в вашем коде Python похоже на разбивание квадратного колышка в круглое отверстие большим молотком, когда вместо этого вы могли просто сказать matplotlib, что это должно быть квадратное отверстие.

37 голосов
/ 16 июня 2017

Я получил ошибку при использовании matplotlib через Spark. matplotlib.use('Agg') не работает для меня. В конце концов, следующий код работает для меня. Подробнее здесь

import matplotlib.pyplot as plt.
plt.switch_backend('agg')
31 голосов
/ 12 января 2014

Я просто повторю то, что сказал @Ivo Bosticky, что можно пропустить. Поместите эти строки в начало VERY файла py.

import matplotlib
matplotlib.use('Agg') 

Или можно получить ошибку

*/usr/lib/pymodules/python2.7/matplotlib/__init__.py:923: UserWarning:  This call to   matplotlib.use() has no effect
because the the backend has already been chosen;
matplotlib.use() must be called *before* pylab, matplotlib.pyplot,*

Это решит все проблемы с отображением

14 голосов
/ 16 февраля 2012

При входе на сервер выполнить код используйте это вместо:

ssh -X username@servername

-X избавит от не отображаемого имени и переменной $ DISPLAY ошибка

:)

12 голосов
/ 02 декабря 2016

Я обнаружил, что этот фрагмент хорошо работает при переключении между средами X и no-X.

import os
import matplotlib as mpl
if os.environ.get('DISPLAY','') == '':
    print('no display found. Using non-interactive Agg backend')
    mpl.use('Agg')
import matplotlib.pyplot as plt
5 голосов
/ 10 мая 2010

В какой системе вы находитесь? Похоже, у вас есть система с X11, но переменная окружения DISPLAY не была правильно установлена. Попробуйте выполнить следующую команду, а затем повторно запустить программу:

export DISPLAY=localhost:0
4 голосов
/ 04 января 2018

import matplotlib matplotlib.use('Agg') import matplotlib.pyplot as plt

Это работает для меня.

3 голосов
/ 28 февраля 2012

Еще одна вещь, которую нужно проверить, - авторизован ли ваш текущий пользователь для подключения к дисплею X. В моем случае root не мог этого сделать, и matplotlib жаловался с той же ошибкой.

user@debian:~$ xauth list         
debian/unix:10  MIT-MAGIC-COOKIE-1  ae921efd0026c6fc9d62a8963acdcca0
root@debian:~# xauth add debian/unix:10  MIT-MAGIC-COOKIE-1 ae921efd0026c6fc9d62a8963acdcca0
root@debian:~# xterm

источник: http://www.debian -administration.org / Articles / 494 https://debian -administration.org / article / 494 / Getting_X11_forwarding_through_ssh_working_after_running_su

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...