python - توليد PNG باستخدام matplotlib عند عدم تحديد DISPLAY




graph (8)

أحاول استخدام 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

الإجابة النظيفة هي أن تأخذ قليلاً من الوقت بشكل صحيح إعداد بيئة التنفيذ الخاصة بك.

الأسلوب الأول الذي يجب عليك إعداده لبيئة التنفيذ لديك هو استخدام ملف matplotlibrc ، كما هو موصى به بحكمة من قِبل Chris Q. ،

backend : Agg

في هذا الملف. يمكنك التحكم حتى - بدون تغييرات في الشفرة - كيف وأين يبحث matplotlib عن ملف matplotlibrc .

الأسلوب الثاني الذي يجب عليك إعداد بيئة التنفيذ فيه هو استخدام متغير بيئة MPLBACKEND (وإعلام المستخدمين باستخدامه):

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

هذا مفيد لأنه ليس عليك حتى توفير ملف آخر على القرص لجعل هذا العمل. لقد استخدمت هذا النهج مع ، على سبيل المثال ، الاختبار في التكامل المستمر ، وتشغيلها على الأجهزة البعيدة التي لا تحتوي على شاشات عرض.

يشبه الترميز الثابت لواجهة matplotlib إلى "Agg" في شفرة Python الخاصة بك تقريع ربط مربّع إلى ثقب دائري بمطرقة كبيرة ، عندما ، بدلاً من ذلك ، كان من الممكن أن تكون قد أخبرت matplotlib أنه يجب أن يكون ثقبًا مربّعًا.


المشكلة الرئيسية هي أن (على النظام الخاص بك) matplotlib يختار backend x- باستخدام افتراضياً. لقد واجهت نفس المشكلة على أحد الخوادم الخاصة بي. كان الحل بالنسبة لي هو إضافة الشفرة التالية في مكان يمكن قراءته قبل أي استيراد آخر لـ pylab / matplotlib / pyplot :

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

البديل هو وضعه في .matplotlibrc الخاص بك


حصلت على الخطأ أثناء استخدام matplotlib من خلال سبارك. matplotlib.use('Agg') لا يعمل بالنسبة لي. في النهاية ، يعمل التعليمة البرمجية التالية بالنسبة لي. المزيد هنا

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

سأكرر ما قالهIvo Bosticky والذي يمكن تجاهله. ضع هذه الخطوط في بداية Vy الملف.

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

سيؤدي ذلك إلى حل جميع مشكلات العرض


عند تسجيل الدخول إلى الخادم لتنفيذ الرمز ، استخدم هذا بدلاً من ذلك:

ssh -X [email protected]

سوف يتخلص -X من اسم العرض ولا يوجد خطأ متغير في بيئة DISPLAY $

:)


فقط كمكمل من إجابة Reinout.

الطريقة الدائمة لحل هذا النوع من المشاكل هي تحرير ملف .matplotlibrc. العثور عليه عبر

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

ثم تعديل الخلفية في هذا الملف إلى backend : Agg . هذا هو.


ما هو نظامك؟ يبدو أن لديك نظامًا يحتوي على X11 ، ولكن لم يتم تعيين متغير بيئة DISPLAY بشكل صحيح. حاول تنفيذ الأمر التالي ثم إعادة تشغيل البرنامج:

export DISPLAY=localhost:0

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

وهو يعمل بالنسبة لي.







graph