যখন DISPLAY অপরিজ্ঞাত হয় তখন ম্যাটপ্ল্লোলিবের সাথে একটি পিএনজি তৈরি করা


319

আমি পাইথনের সাথে নেটওয়ার্কেক্স ব্যবহার করার চেষ্টা করছি। আমি এই প্রোগ্রামটি চালানোর সময় এটি এই ত্রুটিটি পায়। কিছু আছে কি অনুপস্থিত?

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


9
আপনার অন্যান্য আমদানির উপরে কলটি ম্যাটপ্ল্লোব.ইউজে ('এগ্রি') এ সরান, বিশেষত এটি
ম্যাটপ্ল্লোব.পায়প্লট

@ আইভোবস্টিকির মন্তব্যটি আমার পক্ষেও এটি সমাধান করেছে: কেবলমাত্র যে জিনিসটি বিভ্রান্ত করছে তা হ'ল "আপনার অন্যান্য আমদানির উপরে"। এটি সুস্পষ্ট যে আপনার দ্বারা আমদানি matplotlib প্রয়োজন হওয়া উচিত আগে ... এই পুরো সেটিং যে আমার জন্য কাজ হল: আমদানি matplotlib // matplotlib.use ( 'Agg') বলে PLT // আমদানি matplotlib.pyplot
mrk

উত্তর:


518

মূল সমস্যাটি হ'ল (আপনার সিস্টেমে) ম্যাটপ্ল্লিটিব ডিফল্টরূপে এক্স-ব্যবহার করে ব্যাকএন্ড চয়ন করে। আমার কেবল একটি সার্ভারে আমার একই সমস্যা ছিল। আমার জন্য সমাধানটি হ'ল নিম্নলিখিত কোডটি এমন জায়গায় যুক্ত করা যা অন্য কোনও পাইব্লাব / ম্যাটপ্ল্লিটিব / পাইপ্লট আমদানির আগে পড়তে হবে :

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

বিকল্পটি এটি আপনার .matplotlibrc এ সেট করা


182
গুরুত্বপূর্ণ দ্রষ্টব্য: পাইপ্লট আমদানি করার আগে ব্যবহারের কল করা দরকার। সুতরাং আপনি যদি উদাহরণস্বরূপ, কেবল পাইপলট আমদানির চেষ্টা করছেন তবে আপনাকে প্রথমে ম্যাটপ্ল্লোলিব, কল ব্যবহার এবং পাইপ্লট আমদানির চেয়ে আমদানি করতে হবে।
সমুদ্র সৈকত

8
উপরের মন্তব্যটি এই উত্তর দ্বারা আরও ব্যাখ্যা করা হয়েছে ।
আওনানিস ফিলিপিসিস

2
আপনি কীভাবে এটি "আপনার .matplotlibrc এ সেট করেন"?
tommy.carstensen

18
backend: aggইন ~/.config/matplotlib'/matplotlibrc(উদাহরণস্বরূপ, দেখুনhttp: //matplotlib.org/faq/troubleshૂટ_faq.html#locating-matplotlib-config-dir)। Matplotlib.org/users/customizing.html দেখুন , যা পৃষ্ঠার নীচে একটি উদাহরণ কনফিগারেশন ফাইল রয়েছে। "পৃষ্ঠায়" আগ্রাসনটি সন্ধান করুন এবং আপনি আপনার প্রয়োজনীয় কনফিগারেশন বিকল্পটি দেখতে পাবেন।
পুনর্নির্মাণ ভ্যান রিস

4
রেফারেন্সের জন্য, এখানে ম্যাটপ্ল্লোলিব ডকুমেন্টেশনের লিঙ্কটি এটি ব্যাখ্যা করে। (+1, দুর্দান্ত উত্তর, আমাকে পুরোপুরি সাহায্য করেছে!)
টিম এস

72

ঠিক যেমন রাইনআউটের উত্তরের পরিপূরক।

এই ধরণের সমস্যা সমাধানের স্থায়ী উপায় হ'ল .matplotlibrc ফাইলটি সম্পাদনা করা। এর মাধ্যমে এটি সন্ধান করুন

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

তারপরে সেই ফাইলটিতে ব্যাকএন্ডটি পরিবর্তন করুন backend : Agg। হ্যাঁ, ওটাই.


5
প্রো টিপ: আপনার নিজের ম্যাটপ্লোটিলিবার্কে $MATPLOTLIBRCযে ডিরেক্টরিটি ফেলে দিতে চান সেই ডিরেক্টরিতে সেট করুন
কেনেথ হোস্টে

কিন্ডা এই জাতীয় সমস্যার জন্য ওভারকিল করে তবে আমি অনুমান করি যে সার্ভারটি সর্বদা শিরোনামহীনভাবে কাজ করে যদি কোনও কনফিগারেশন ফাইলটি পরিবর্তন করতে পারে তবে তা বোঝা যায়। কীভাবে ম্যাটপ্লটলিব কাজ করবে তার কোনও পার্শ্ব প্রতিক্রিয়া আছে?
ব্রুস জোজন জেনারলাওসো

আমি একটি ওয়েব সার্ভারে matplotlib চালাচ্ছি তাই এটি আমার জন্য উত্তর ছিল। আমি কোন পার্শ্ব প্রতিক্রিয়া লক্ষ্য করা হয়নি।
স্পিৎজ

42

পরিষ্কার উত্তরটি হ'ল আপনার কার্যকর করার পরিবেশটি সঠিকভাবে প্রস্তুত করতে কিছুটা সময় নেওয়া।

আপনার কার্যকর করার পরিবেশ প্রস্তুত করার জন্য প্রথম কৌশলটি হ'ল ক্রিস কিউ দ্বারা বুদ্ধিমানের প্রস্তাবিত একটি matplotlibrcফাইল ব্যবহার করা setting

backend : Agg

যে ফাইলটিতে। এমনকি কোনও কোড পরিবর্তন ছাড়াই - নিয়ন্ত্রণ করতে পারেন - ম্যাটপ্ল্লিটিব কোথায় এবং কোথায় matplotlibrcফাইলটি সন্ধান করে এবং খুঁজে পায়

আপনার কার্যকর করার পরিবেশ প্রস্তুত করার জন্য দ্বিতীয় কৌশলটি হ'ল MPLBACKENDপরিবেশের পরিবর্তনশীল (এবং এটির ব্যবহার করতে আপনার ব্যবহারকারীদের অবহিত করুন):

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

এটি সুবিধাজনক কারণ এই কাজটি করার জন্য আপনাকে ডিস্কে অন্য কোনও ফাইল সরবরাহ করতে হবে না। উদাহরণস্বরূপ, অবিচ্ছিন্ন একীকরণের পরীক্ষা করা, এবং দূরবর্তী মেশিনগুলিতে চালিত না হওয়াতে চালানো আমি এই পদ্ধতির সাথে নিযুক্ত করেছি।

আপনার পাইথন কোডটিতে আপনার ম্যাটপ্ল্লোলিব ব্যাকএন্ডকে "এগ্রি" তে হার্ড কোডিং করা একটি বড় হাতুড়ি সহ একটি বৃত্তাকার খোঁচায় একটি বৃত্তাকার ছিদ্রে চাপ দেওয়ার মতো, যখন পরিবর্তে, আপনি কেবল ম্যাটপ্ল্লোবকে বলতে পারতেন এটি একটি বর্গক্ষেত্র হওয়া দরকার।


দ্বিতীয় কৌশলটি এই পরিস্থিতিতে সবচেয়ে মার্জিত হিসাবে দেখায়।
দিমিত্রি কাবানভ

এমপিএলব্যাকেন্ড ব্যবহার করে এটি আমার জন্য সমাধান হয়েছে। অবশ্যই সবচেয়ে মার্জিত উপায়!
শনিফর্মটিটান

41

স্পার্কের মাধ্যমে ম্যাটপ্লটলিব ব্যবহার করার সময় আমি ত্রুটিটি পেয়েছি। matplotlib.use('Agg')আমার জন্য কাজ করে না। শেষ পর্যন্ত, নিম্নলিখিত কোডটি আমার পক্ষে কাজ করে। আরও এখানে

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

ম্যাটপ্ল্লোলিব এবং অন্যান্য গ্রন্থাগার আমদানিতে ব্যবহৃত আদেশের উপর বিধিনিষেধ ছাড়াই এটি দুর্দান্ত কাজ করে।
পাবটোরে

স্পার্কে চলার সময়, আপনাকে কি মাথা নোডে চালানোর জন্য এটি সীমাবদ্ধ করতে হয়েছিল বা কর্মী নোডগুলিতে চলার সময় আপনি এটি কাজ করতে পেয়েছেন?
সাকা

আমি এটি একটি জাঙ্গো প্রকল্পে ব্যবহার করছি এবং এটি কেবল এটিই কাজ করানোর উপায় ছিল।
হেনরিএম

31

@ আইভো বোস্টিকি যা বলেছিলেন তা এড়িয়ে যাব আমি কেবল তার পুনরাবৃত্তি করব। পাই ফাইলের খুব শুরুতে এই লাইনগুলি রাখুন ।

import matplotlib
matplotlib.use('Agg') 

অথবা একটি ত্রুটি পেতে হবে

* / usr / lib / pymodules / python2.7 / matplotlib / __ init__.py:923: ব্যবহারকারী সতর্কতা: matplotlib.use এ এই কলটির কোনও প্রভাব নেই
কারণ ইতিমধ্যে ব্যাকএন্ডটি বেছে নেওয়া হয়েছে;
matplotlib.use () কে * পাইলাবের আগে অবশ্যই বলা উচিত, ম্যাটপ্লটলিব.পায়প্লট, *

এটি সমস্ত প্রদর্শন ইস্যু সমাধান করবে


15

এক্স এবং নো-এক্স পরিবেশের মধ্যে স্যুইচ করার সময় আমি এই স্নিপেটটি ভালভাবে কাজ করতে দেখতে পেয়েছি।

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

আমার মতে, এটি গৃহীত সমস্যার চেয়ে উত্তম সমাধান, যদিও এটি সরাসরি প্রশ্নের উত্তর দেয় না, এবং জিজ্ঞাসিত কোনও প্রশ্নের উত্তর দেয় না।
দাইসুক আরমাকি

14

কোডটি কার্যকর করতে সার্ভারে সাইন ইন করার পরিবর্তে এটি ব্যবহার করুন:

ssh -X username@servername

এটি -Xকোনও প্রদর্শনীর নাম এবং কোনও SPLAY DISPLAY পরিবেশ পরিবর্তনশীল ত্রুটি থেকে মুক্তি পাবে

:)


1
.Png চিত্রটি সংরক্ষণ করতে আমার '-X' ব্যবহার করতে হবে। অনেক ধন্যবাদ.
নম্বর

এটি লম্বা প্রক্রিয়াটির জন্য ব্যর্থ হবে যদি ssh সময় শেষ হয়, বা যদি কোনও কারণেই আপনার সংযোগ বিচ্ছিন্ন করতে হয়। নোট করুন যে সংযোগকারী ক্লায়েন্ট ঘুমের মধ্যে গেলে একটি সময়সীমা এমনকি ঘটতে পারে।

আপনি সময়সীমা রোধ করতে পারবেন -o ServerAliveCountMax=120 -o ServerAliveInterval=30যা এসএসএস ক্লায়েন্টকে প্রতি 30 সেকেন্ডে সর্বোচ্চ 1 ঘন্টার জন্য একটি খালি প্যাকেট প্রেরণ করবে adding
অ্যালেক্স

5

আপনি কি সিস্টেম চালু? দেখে মনে হচ্ছে আপনার কাছে এক্স 11 সহ একটি সিস্টেম রয়েছে, তবে DISPLAY পরিবেশের ভেরিয়েবলটি সঠিকভাবে সেট করা হয়নি। নিম্নলিখিত কমান্ডটি কার্যকর করার চেষ্টা করুন এবং তারপরে আপনার প্রোগ্রামটি পুনরায় চালু করুন:

export DISPLAY=localhost:0

তবে কেন এটি ডিসপ্লে ভেরিয়েবল সেট করতে ইড করে না, আমি এই সার্ভারে রিমোটলি লগইন হয়েছি, তার যা করা উচিত তা হল একটি পিএনজি ফাইল জেনারেট করা ???
krisdigitx

1
@ ক্রিসডিজিটক্স, আপনি যদি দূর থেকে সংযুক্ত থাকেন তবে ডিসপ্লে ভেরিয়েবল সেট করবেন না; পরিবর্তে "-XY" পতাকাটি ব্যবহার করুন যখন আপনি সংযুক্ত হন। প্রদর্শন করার জন্য, এটি জানতে হবে যে কোন জেসারভারটি ছবিটি প্রেরণ করবে; এই ক্ষেত্রে, এটি দূরবর্তী কম্পিউটারের পরিবর্তে আপনার কম্পিউটারের প্রদর্শন হবে। "-XY" পতাকা ব্যবহারের ফলে এসএসএইচ সংযোগকারী কম্পিউটারের ডিসপ্লেতে নির্দেশ করতে স্বয়ংক্রিয়ভাবে ডিসপ্লে ভেরিয়েবল সেট করে।
মাইকেল অ্যারন সাফিয়ান

@ ক্রিসিডিগেক্স, আমি সম্মত, এটি অত্যন্ত অদ্ভুত যে এটি এটি করে; আমার অনুমান, যদিও এটি X11 ব্যবহার করে চিত্রটি রঙ করে এবং তারপরে এক্স 11 ব্যবহার করে ফলাফলটি সংরক্ষণ করে।
মাইকেল অ্যারন সাফায়ান

$ DISPLAY এর জন্য এই সেটিংটি উবুন্টু 16 চলমান ইসি 2-তে কাজ করে না - "লোকালহোস্ট: 0" প্রদর্শন করতে সংযোগ করতে পারেনি
পাবটোরে

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

এটা আমার জন্য কাজ করে.


3

অন্য একটি জিনিস যাচাই করে দেখুন আপনার বর্তমান ব্যবহারকারী এক্স ডিসপ্লেতে সংযোগ করার জন্য অনুমোদিত কিনা। আমার ক্ষেত্রে, রুটকে এটি করার অনুমতি দেওয়া হয়নি এবং ম্যাটপ্ল্লোলিব একই ত্রুটির সাথে অভিযোগ করছিল।

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/ জেটিং_এক্স 11_ ফরোয়ার্ডিং_থ্রো_শ্যাচিং_আর_ফার্নিং_সু


2

আপনার কোডটি উইন্ডোজ, লিনাক্স এবং ওএসএক্স জুড়ে এবং ডিসপ্লে সহ এবং ছাড়াই সিস্টেমগুলির জন্য পোর্টেবল তা নিশ্চিত করার জন্য, আমি নিম্নলিখিত স্নিপেটটি সুপারিশ করব:

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


1

গুগল ক্লাউড মেশিন লার্নিং ইঞ্জিনের জন্য:

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

এবং পিডিএফ তৈরি করতে:

multi_page(report_name)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.