programing

DISPLAY가 정의되지 않은 경우 matplotlib를 사용하여 PNG 생성

goodsources 2022. 11. 19. 11:37
반응형

DISPLAY가 정의되지 않은 경우 matplotlib를 사용하여 PNG 생성

Python에서 networkx를 사용하려고 합니다.이 프로그램을 실행하면 이 오류가 나타납니다.없어진 것이 있어요?

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

주요 문제는 (시스템에서) matplotlib가 기본적으로 x-using 백엔드를 선택한다는 것입니다.제 서버 중 하나에서도 같은 문제가 발생했습니다.해결책은 다른 pylab/matplotlib/pyplot 가져오기 전에 읽을 수 있는 위치에 다음 코드를 추가하는 것이었습니다.

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

다른 방법은 .matplotlibrc에서 설정하는 것입니다.

Reinout의 답변의 보완으로서.

이러한 문제를 해결하는 영구적인 방법은 .matplotlibrc 파일을 편집하는 것입니다.검색 방법

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

그런 다음 해당 파일의 백엔드를 다음과 같이 수정합니다.backend : Agg바로 그거야.

명확한 답은 실행 환경을 올바르게 준비하는 데 약간의 시간이 걸리는 것입니다.

실행 환경을 준비하기 위한 첫 번째 기술은 다음과 같습니다.matplotlibrcChris Q.에 의해 현명하게 추천된 파일, 설정

backend : Agg

그 파일에 있어요.코드 변경 없이 matplotlib가 파일을 찾고 찾는 방법과 위치를 제어할 수도 있습니다.

실행 환경을 준비해야 하는 두 번째 방법은 환경 변수를 사용하는 것입니다(사용자에게 이 변수를 사용하도록 통지합니다).

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

이 기능을 수행하기 위해 디스크에 다른 파일을 제공할 필요도 없기 때문에 편리합니다.예를 들어 지속적인 통합으로 테스트하고 디스플레이가 없는 원격 머신에서 실행하는 등의 접근방식을 채택했습니다.

matplotlib 백엔드를 Python 코드의 "Agg"에 하드 코딩하는 것은 큰 망치로 둥근 구멍에 네모난 못을 박는 것과 같습니다.그 대신, matplotlib에게 네모난 구멍이 필요하다고 말할 수 있었습니다.

스파크를 통해 matplotlib을 사용하다가 오류가 발생하였습니다. matplotlib.use('Agg')나한테는 안 통한다.결국, 다음 코드가 나에게 효과가 있습니다.자세한 것은 이쪽

import matplotlib.pyplot as plt.
plt.switch_backend('agg')

그냥 @Ivo Bosticky가 한 말을 다시 한 번 외우겠습니다.py 파일의 가장 앞에 이 줄을 놓으십시오.

import matplotlib
matplotlib.use('Agg') 

그렇지 않으면 오류가 발생합니다.

*/usr/lib/pymodules/http 2.7/matplotlib/_init_.py:923:사용자 경고:이 matplotlib.use() 호출은 효과가 없습니다.백엔드가 이미 선택되었기 때문입니다.matplotlib.use()는 *before* pylab, matplotlib로 호출해야 합니다.pyplot,*

이렇게 하면 모든 디스플레이 문제가 해결됩니다.

이 스니펫은 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

코드를 실행하기 위해 서버에 서명하는 경우 대신 다음을 사용합니다.

ssh -X username@servername

-X 및 $DISPLAY 환경변수 display name $DISPLAY는 no $DISPLAY 환경변수 errorno display name 입니다.

:)

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

저는 좋아요.

어떤 시스템을 사용하시나요?X11을 탑재한 시스템이 있는 것 같습니다만, DISPLAY 환경 변수가 올바르게 설정되어 있지 않습니다.다음 명령을 실행한 후 프로그램을 다시 실행하십시오.

export DISPLAY=localhost:0

또 하나 확인해야 할 것은 현재 사용자가 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

Windows, Linux 및 OSX를 통해 코드가 이식 가능한지 확인하기 위해 디스플레이가 있는 시스템과 없는 시스템의 경우 다음과 같은 스니펫을 권장합니다.

import matplotlib
import os
# must be before importing matplotlib.pyplot or pylab!
if os.name == 'posix' and "DISPLAY" not in os.environ:
    matplotlib.use('Agg')

# now import other things from matplotlib
import matplotlib.pyplot as plt

크레딧 : https://stackoverflow.com/a/45756291/207661

Google 클라우드 머신 러닝 엔진의 경우:

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

그런 다음 파일로 인쇄하려면:

#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()

PDF를 작성하려면:

multi_page(report_name)
import matplotlib
matplotlib.use('Agg')

플롯 함수/코드를 직접 호출하는 동안 작동했습니다.단,

from joblib import Parallel, delayed

Parallel ★★★★★★★★★★★★★★★★★」delayed를 위한 병렬화를 위한 모듈을 사용하면 코드를 병렬화할 수 .

matplotlib.rcParams.update({'backend': 'Agg'})

의 내 이 표시됩니다.agg백엔드가 기능합니다.

언급URL : https://stackoverflow.com/questions/2801882/generating-a-png-with-matplotlib-when-display-is-undefined

반응형