스택큐힙리스트
DISPLAY가 정의되어 있지 않을 때 matplotlib로 PNG 생성하기 본문
나는 파이썬과 함께 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
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
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
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
답변 1
주요 문제는 (귀하의 시스템에서) matplotlib이 기본적으로 X를 사용하는 백엔드를 선택한다는 것입니다. 저는 내 서버 중 하나에서 같은 문제를 겪었습니다. 나에게 해결책은 다음 코드를 다른 어떤 pylab/matplotlib/pyplot import보다 먼저 읽는 곳에 추가하는 것이었습니다.
import matplotlib
# Force matplotlib to not use any Xwindows backend.
matplotlib.use('Agg')
대안은 당신의 .matplotlibrc에 빠지는 것입니다.
답변 2
표시가 정의되지 않은 경우 Matplotlib를 사용하여 PNG 생성Matplotlib는 파이썬에서 널리 사용되는 시각화 도구입니다. 그러나 Linux 서버와 같은 경우 환경이 설정되어 있지 않은 경우 Matplotlib를 사용하여 PNG 이미지를 생성하는 데 문제가 있을 수 있습니다. 이러한 경우 DISPLAY 환경 변수가 정의되어 있지 않기 때문입니다.
DISPLAY 환경 변수는 X 서버를 실행하는 컴퓨터의 IP 주소와 디스플레이 번호를 설정합니다. 그러므로 DISPLAY가 지정되어 있지 않으면 Matplotlib로 PNG를 생성할 수 없습니다.
그러나 해결 방법은 있습니다. Matplotlib를 사용하여 PNG를 생성하려는 경우, 백그라운드에서 실행 가능한 Agg 백엔드를 사용하여 시각화 동작을 수행할 수 있습니다. 이 방식을 사용하면 X 서버에 연결하지 않고 Matplotlib를 사용하여 PNG 이미지를 생성할 수 있습니다.
먼저, Matplotlib의 Agg 백엔드를 사용하도록 rcParams를 업데이트합니다. 그런 다음, png 파일 형식을 구성하고 그림 파일을 생성하는 Python 스크립트를 작성합니다. 이렇게하면 DISPLAY가 정의되지 않은 환경에서도 Matplotlib를 사용하여 PNG 파일을 생성할 수 있습니다.
Matplotlib는 다양한 백엔드를 제공하므로 다른 백엔드를 사용하여 시각화를 수행할 수도 있습니다. 그러나 Agg 백엔드는 백그라운드에서 실행 가능하며 PNG 파일 형식을 지원하기 때문에 DISPLAY가 정의되지 않은 경우 최선의 선택입니다.
결론적으로, Matplotlib를 사용하여 PNG 이미지를 생성하려는 경우에는 DISPLAY가 정의되어 있지 않은 경우 Agg 백엔드를 사용해야합니다. 이를테면, Linux 서버와 같은 환경에서 Matplotlib를 이용하여 PNG 파일을 생성하는 데 사용될 수 있습니다. Matplotlib가 지원하는 다양한 백엔드 중에서, Agg 백엔드가 백그라운드에서 실행 가능성을 제공하고 PNG 파일 형식을 지원한다는 점에서 가장 좋은 선택이 됩니다.