Generowanie PNG z matplotlib, gdy wyświetlanie jest niezdefiniowane

Próbuję używać networkx z Pythonem. Kiedy uruchamiam ten program, dostaje ten błąd. Czegoś brakuje?

#!/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

I get a different error now:

#!/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

I get a different error now:

#!/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
Author: Joel, 2010-05-10

11 answers

Główny problem polega na tym, że (w Twoim systemie) matplotlib domyślnie wybiera backend x-using. Właśnie miałem ten sam problem na jednym z moich serwerów. Rozwiązaniem dla mnie było dodanie następującego kodu w miejscu, które zostanie odczytane przed jakimkolwiek innym pylab / matplotlib / pyplot import:

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

Alternatywą jest ustawienie go w Twoim .matplotlibrc

 483
Author: Reinout van Rees,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-19 05:58:15

Jako uzupełnienie odpowiedzi Reinouta.

Permanentnym sposobem rozwiązania tego rodzaju problemu jest edycja .plik matplotlibrc. Find it via

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

Następnie zmodyfikuj backend w tym Pliku na backend : Agg. To jest to.

 68
Author: Chris.Q,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-29 09:12:56

Czystą odpowiedzią jest poświęcenie trochę czasu na poprawne przygotowanie środowiska wykonawczego.

Pierwszą techniką, jaką musisz przygotować środowisko wykonawcze, jest użycie pliku matplotlibrc, zgodnie z mądrze zalecanym przez Chrisa Q. , ustawienie

backend : Agg

W tym pliku. Możesz nawet kontrolować - bez zmian kodu - jak i gdzie matplotlib szuka i znajduje plik matplotlibrc .

Drugą techniką, którą musisz przygotować środowisko wykonawcze, jest użycie na MPLBACKEND zmienna środowiskowa (i informowanie użytkowników, aby z niej korzystali):

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

Jest to przydatne, ponieważ nie musisz nawet podawać innego pliku na dysku, aby to działało. Zastosowałem to podejście, na przykład testując w ciągłej integracji i uruchamiając na zdalnych maszynach, które nie mają wyświetlaczy.

Twarde kodowanie backendu matplotlib do " Agg " w kodzie Pythona jest jak wbijanie kwadratowego kołka w okrągły otwór dużym młotkiem, kiedy zamiast tego mógł powiedzieć matplotlib, że to musi być kwadratowa dziura.

 38
Author: gotgenes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:02:48

Powtórzę tylko to, co powiedział @ Ivo Bosticky, co można przeoczyć. Umieść te linie na Bardzo początku pliku py.

import matplotlib
matplotlib.use('Agg') 

Albo ktoś dostanie błąd

*/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,*

To rozwiąże wszystkie problemy z wyświetlaniem

 31
Author: Somum,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-18 17:29:25

Dostałem błąd podczas korzystania z matplotlib przez Spark. Nie działa na mnie. W końcu następujący kod działa dla mnie. Więcej TUTAJ

import matplotlib.pyplot as plt.
plt.switch_backend('agg')
 30
Author: user3282611,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-28 13:36:04

Podczas logowania się na serwer w celu wykonania kodu użyj tego zamiast:

ssh -X username@servername

-X pozbędzie się zmiennej środowiskowej no display name I no $DISPLAY błąd

:)

 13
Author: rajol kochlashvili,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-16 12:46:01

Stwierdziłem, że ten fragment działa dobrze podczas przełączania między środowiskami X i 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
 9
Author: Matthias123,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-02 11:59:32

Na jakim systemie jesteś? Wygląda na to, że masz system z X11, ale zmienna środowiskowa DISPLAY nie została prawidłowo ustawiona. Spróbuj wykonać następujące polecenie, a następnie ponownie uruchomić program:

export DISPLAY=localhost:0
 5
Author: Michael Aaron Safyan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-10 10:37:20

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

U mnie działa.
 4
Author: Qing En,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-04 03:02:07

Jeszcze jedną rzeczą do sprawdzenia jest to, czy obecny użytkownik jest uprawniony do łączenia się z wyświetlaczem X. W moim przypadku root nie mógł tego zrobić i matplotlib narzekał z tym samym błędem.

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

Źródło: http://www.debian-administration.org/articles/494 https://debian-administration.org/article/494/Getting_X11_forwarding_through_ssh_working_after_running_su

 3
Author: Alex,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-18 12:41:03

Dla Google Cloud Machine Learning Engine:

import matplotlib as mpl
mpl.use('Agg')
from matplotlib.backends.backend_pdf import PdfPages

A następnie wydrukować do pliku:

#PDF build and save
    def multi_page(filename, figs=None, dpi=200):
        pp = PdfPages(filename)
        if figs is None:
            figs = [mpl.pyplot.figure(n) for n in mpl.pyplot.get_fignums()]
        for fig in figs:
            fig.savefig(pp, format='pdf', bbox_inches='tight', fig_size=(10, 8))
        pp.close()

I utworzyć plik PDF:

multi_page(report_name)
 1
Author: Kim Miller,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-25 20:02:55