ম্যাটপ্ল্লোব / পাইথনে ব্যাকেন্ড কীভাবে পরিবর্তন করবেন


90

আমি নীচের ইস্যু নিয়ে লড়াই করছি। আমাকে চার্টের সংকলন সহ প্রতিবেদন তৈরি করতে হবে। এই চার্টগুলি, একটি ব্যতীত, ম্যাটপ্ল্লোলিব ডিফল্ট ব্যাকএন্ড (টাকাআগ) ব্যবহার করে তৈরি করা হয়। কায়রো ব্যাকএন্ড ব্যবহার করে একটি চার্ট তৈরি করা দরকার, কারণটি হ'ল আমি একটি ইগ্রাফ গ্রাফ তৈরি করছি এবং এটি কেবল কায়রো ব্যবহার করে প্লট করা যেতে পারে।

সমস্যাটি হ'ল আমি
matplotlib.pyplot.switch_backend('cairo.png') ফ্লাইতে ব্যাকেন্ডগুলি পরিবর্তন করতে পারি না, উদাহরণস্বরূপ নিম্নলিখিতটি কাজ করে না: (আমি জানি যে স্যুইচ_ব্যাকেন্ড কার্যকারিতা পরীক্ষামূলক)

এবং আমি চেষ্টাও করেছি matplotlib.use("cairo.png")তবে এটি আমদানিতে সমস্যা দেখা দেয় কারণ matplotlib.use("cairo.png")আমদানির আগে বিবৃতি আসা উচিত matplotlib.pyplot। তবে আমার স্ক্রিপ্টের জীবনকালে দুটি ভিন্ন ব্যাকেন্ডের প্রয়োজন।

সুতরাং আমার প্রশ্নটি কি কারও কাছে এমন একটি কোড স্নিপেট রয়েছে যা ম্যাটপ্ল্লিটিবের ব্যাকএন্ডে স্যুইচ করবেন তা দেখায়?

অনেক ধন্যবাদ!

আপডেট: আমি একটি স্নিপেট লিখেছি যা ম্যাটপ্লটলিব লোড করে, ডিফল্ট ব্যাকএন্ড দেখায়, ম্যাটপ্ল্লিটিব আনলোড করে, পুনরায় লোড করে ব্যাকএন্ড পরিবর্তন করে:

import matplotlib
import matplotlib.pyplot as plt
import sys
print matplotlib.pyplot.get_backend()

modules = []
for module in sys.modules:
    if module.startswith('matplotlib'):
        modules.append(module)

for module in modules:
    sys.modules.pop(module)

import matplotlib
matplotlib.use("cairo.png")
import matplotlib.pyplot as plt

print matplotlib.pyplot.get_backend()

তবে এটি কি সত্যিই এটি করার উপায়?

আপডেট 2: আমার গতকাল কিছুটা গুরুতর মস্তিষ্কের জমাট ছিল ... সহজ এবং সর্বাধিক সুস্পষ্ট সমাধান হ'ল সমস্ত চার্টের জন্য কায়রো ব্যাকএন্ড ব্যবহার করা এবং ব্যাক-এন্ডে স্যুইচ না করা :)

আপডেট 3: আসলে, এটি এখনও একটি সমস্যা তাই যে কেউ ম্যাটপ্ল্লোলিব ব্যাকেন্ডগুলিকে গতিশীলভাবে কীভাবে পরিবর্তন করতে জানে .... আপনার উত্তর পোস্ট করুন post


আছে pyplot.switch_backends()। এটি আপনার ক্ষেত্রে কার্যকর নাও হতে পারে।
jfs

উত্তর:


60

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

এই কোড স্নিপেট আমার জন্য ভাল কাজ করে:

import matplotlib
gui_env = ['TKAgg','GTKAgg','Qt4Agg','WXAgg']
for gui in gui_env:
    try:
        print "testing", gui
        matplotlib.use(gui,warn=False, force=True)
        from matplotlib import pyplot as plt
        break
    except:
        continue
print "Using:",matplotlib.get_backend()

Using: GTKAgg

আপনি যেমন অনুমান করতে পারেন, নতুনকে জোর করে backendপুনরায় আমদানি matplotlib.pyplotকরার মতোই অদলবদল করা সহজbackend

matplotlib.use('WXAgg',warn=False, force=True)
from matplotlib import pyplot as plt
print "Switched to:",matplotlib.get_backend()

Switched to: WXAgg

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

import matplotlib
gui_env = [i for i in matplotlib.rcsetup.interactive_bk]
non_gui_backends = matplotlib.rcsetup.non_interactive_bk
print ("Non Gui backends are:", non_gui_backends)
print ("Gui backends I will test for", gui_env)
for gui in gui_env:
    print ("testing", gui)
    try:
        matplotlib.use(gui,warn=False, force=True)
        from matplotlib import pyplot as plt
        print ("    ",gui, "Is Available")
        plt.plot([1.5,2.0,2.5])
        fig = plt.gcf()
        fig.suptitle(gui)
        plt.show()
        print ("Using ..... ",matplotlib.get_backend())
    except:
        print ("    ",gui, "Not found")

ক্যাভেটস: সংস্করণ ৩.৩.০ থেকে ম্যাটপ্লোটিলেব পরিবর্তন

  • Matplotlib.use এর প্রথম প্যারামিটারটি আর্গ থেকে ব্যাকএন্ডে নামকরণ করা হয়েছে (কেবলমাত্র আপনি কীওয়ার্ড দিয়ে পাস করলে প্রাসঙ্গিক)।
  • Matplotlib.use এর প্যারামিটার সতর্কতা সরানো হয়েছে। ব্যাকএন্ড স্যুইচ করতে ব্যর্থতা এখন বল প্রয়োগ করা থাকলে সর্বদা একটি আমদানি ত্রুটি বাড়িয়ে তুলবে; প্রয়োজনে ত্রুটিটি ধরুন।
  • প্রথমটি বাদে matplotlib.use এর সমস্ত পরামিতি এখন কেবল কীওয়ার্ড।

ধন্যবাদ! এটি আমাকে উদাহরণস্বরূপ উপযুক্ত ব্যাক-এন্ড খুঁজে পেতে দুর্দান্ত কাজ করেছে: স্ট্যাকওভারফ্লো
জেমস নেলসন

সাকসনির রল্ফ, LOL খুব সহায়ক, আমি এখনও প্রায় এক দশক আগে উবুন্টু এবং অ্যান্ড্রয়েড পোস্টে প্রতিক্রিয়া পাই।
জেমস নেলসন

warn=Falseযুক্তি আর উপলব্ধ নেই।
not2qubit

@ not2qubit noted - ধন্যবাদ Caveats যোগ করা হয়েছে।
স্যাক্সনি রলফ

37

একটি "পরীক্ষামূলক" বৈশিষ্ট্য রয়েছে:

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

ম্যাটপ্ল্লিটিব ডক থেকে নেওয়া ।

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


অচেনা ব্যাকএন্ড স্ট্রিং "নিউব্যাকেন্ড"। আমার কি করা উচিৎ?
টিএসআর

4
@ টিএসআর জিওআই ব্যাকএন্ডের সাথে 'নিউটব্যাকেন্ড' প্রতিস্থাপন করুন যেমন 'কিউটি 4 এজিজি'
যশটিটি

14

কেন কেবল reloadবিল্ট-ইন ফাংশনটি ব্যবহার করবেন না ( importlib.reloadপাইথন 3 এ)?

import matplotlib
matplotlib.use('agg')

matplotlib = reload(matplotlib)
matplotlib.use('cairo.png')

যেমন আপনি ম্যাটপ্লোটিলিব এবং ম্যাটপ্লোটিলিব.পায়প্লট পুনরায় লোড করতে পারবেন না? অথবা আপনি কি বলছেন যে আমার কোডটি স্নিপড অসম্পূর্ণ?
ফ্রেডবাবা

হুঁ। আসলেই আইপিথনের এক গৌরব হতে পারে। নিয়মিত কনসোলে ভাল কাজ করার জন্য মনে হচ্ছে।
ম্যাড পদার্থবিদ

4
আমি মনে করি এটি একটি উদাহরণ, এটি দেখায় যে এটি কাজ করে না: এটি python -c "import matplotlib.pyplot as plt; import matplotlib; from importlib import reload; matplotlib = reload(matplotlib); matplotlib.use('Agg')"কি সঠিক?
লুকাশ

6

সুতরাং আপনি যা সন্ধান করছেন এটি এটি কিনা আমি পুরোপুরি নিশ্চিত নই।

আপনি matplotlibrc ফাইলের মাধ্যমে আপনার ব্যাকএন্ড পরিবর্তন করতে পারেন যা আপনার ম্যাটপ্ল্লিটিবের জন্য নির্দিষ্ট কনফিগারেশন রয়েছে।

আপনার স্ক্রিপ্টে আপনি এটি রাখতে পারেন:

matplotlib.rcParams['backend'] = 'TkAgg' 

বা ব্যাকএন্ডের মধ্যে স্যুইচ করার মতো কিছু।


4
প্রকৃতপক্ষে, আপনি আপনার আরসিপ্যারাম অভিধানে ব্যাকএন্ড নির্দিষ্ট করতে পারেন তবে এটি একটি ব্যাকএন্ড থেকে অন্য একটিতে স্যুইচিংয়ের সমস্যার সমাধান করে না।
DrDee

আপনি কনফিগ ফাইলে ডিফল্ট ব্যাকএন্ড সেট করতেও পারেন যা ~/.config/matplotlib/matplotlibrc
ম্যাটপ্ল্লোব

4

আমার ক্ষেত্রে (উইন্ডোজ 10 + অজগর 3.7), স্যাক্সনির @ রলফের প্রথম উত্তরটি খুব ভাল কাজ করে নি। সমস্ত উপলভ্য পরিবেশ চেষ্টা করার পরিবর্তে এবং এর শুরুতে একটির কনফিগার করার পরিবর্তে, ঠিক পরে

    import matplotlib

আমাকে 'এগ্রি' থেকে 'টাক অ্যাগ' ব্যবহার করে পরিবেশ পরিবর্তন করতে হয়েছিল

    matplotlib.use('TKAgg',warn=False, force=True)

কোডের ঠিক আগে যেখানে আমি আসলে প্লট করেছি, অর্থাৎ,

    import matplotlib.pyplot as plt
    fig = plt.figure()
    # AND SO ON....

2

স্থায়ীভাবে ব্যাকএন্ড পরিবর্তন করতে আপনি এটি ব্যবহার করতে পারেন:

  1. প্রথমে matplotlibrcফাইলটি সনাক্ত করুন:

    import matplotlib
    
    matplotlib.matplotlib_fname()
    # '/Users/serafeim/.matplotlib/matplotlibrc'
    
  2. টার্মিনালটি খুলুন এবং করুন:

    cd /Users/serafeim/.matplotlib/
    ls
    
  3. ফাইলটি সম্পাদনা করুন (এটি উপস্থিত না থাকলে এই কমান্ডটি ব্যবহার করুন: touch matplotlibএটি তৈরি করতে):

    vim matplotlibrc
    
  4. এই লাইনটি যুক্ত করুন এবং সংরক্ষণ করুন:

    backend: TkAgg
    


0

আপনি যদি আইপিথন কনসোল ব্যবহার করে থাকেন (স্পাইডারের মধ্যে অন্তর্ভুক্ত) আপনি দ্রুত ব্যাকএন্ডগুলি স্যুইচ করতে বিল্ট-ইন ম্যাজিক কমান্ডগুলি ব্যবহার করতে পারেন , যেমন:

%matplotlib qt

কমান্ডটি ব্যবহারের জন্য উপলভ্য ব্যাকএন্ডের একটি তালিকা পান:

%matplotlib --list

উপলভ্য ম্যাটপ্ল্লোলিব ব্যাকএন্ডস: ['tk', 'gtk', 'gtk3', 'wx', 'qt4', 'qt5', 'qt', 'osx', 'nbagg', 'নোটবুক', 'আগ্র' এসভিজি ',' পিডিএফ ',' পিএস ',' ইনলাইন ',' আইপিম্পল ',' উইজেট ']


0

Extra Info

যদিও প্রত্যেকে তাদের নিজস্ব পছন্দসই ব্যাক-এন্ড দেখায়, আপনাকে কী ইনস্টল করতে হবে এবং প্রয়োজনীয়তাগুলি কী তা নির্ধারণ করতে এটি যথেষ্ট অগোছালো। কমপক্ষে যখন আপনি সাধারণ বিভ্রান্তিকর এবং প্রযুক্তিগত ডকুমেন্টেশন বোঝার চেষ্টা করবেন। আজ আমি বিভিন্ন পরীক্ষা-নিরীক্ষা করেন এবং মনে হয় আমি খুঁজে পেয়েছি প্রতিটি ব্যাক এন্ড জন্য সবচেয়ে সহজ সমাধান দিয়ে প্লটে বিভক্ত পাবে আছে matplotlib (বিল্ট-ইন করা Qt ছাড়া) উইন্ডোজ এবং Py3.8.5 ব্যবহার করে। আমার অনুসন্ধানগুলি এখানে:

#--------------------------------------
# Installing the matplotlib backends
#--------------------------------------
# https://matplotlib.org/users/installing.html

pip install pycairo                     # [1] Cairo :   GTK3 based backend (replaces: cairocffi)    [1.2 Mb]
#pip install mplcairo                   # [1] Cairo :   Easy & Specific for matplotlib              [1.7 Mb]
#pip install PyQt5                      # [2] Qt5   :   Require: Qt's qmake tool                    []
pip install PySide2                     # [3] Qt5   :   Require: shiboken2 & Clang lib bindings     [136 Mb]
pip install wxPython                    # [4] WxAgg :   ??                                          [18.1 Mb]
pip install tornado                     # [5] WebAgg:   Require: pycurl,twisted,pycares ??          [422 kb]

এই সমস্ত পিপিআই বা রেপসের লিঙ্কগুলি এখানে রয়েছে:

[1] https://pypi.org/project/pycairo/       # Requires GTK3+: https://www.gtk.org/
[1] https://pypi.org/project/mplcairo/      # https://github.com/matplotlib/mplcairo
[2] https://pypi.org/project/PyQt5/         # 
[3] https://pypi.org/project/PySide2/       # 
[4] https://pypi.org/project/wxPython/      # https://github.com/wxWidgets/Phoenix/
[4] https://github.com/wxWidgets/wxWidgets/releases
[5] https://pypi.org/project/tornado/       # https://github.com/tornadoweb/tornado

যাইহোক, এবং অজানা জন্য প্রচুর পরিমাণে ডকুমেন্টেশন Tcl/Tkএবং tkinterপাইথনগুলির প্যাকেজগুলি দেখে আমি আশ্চর্য হয়েছি যে আমি এটি ইনস্টল করতে সক্ষম হইনি, না কীভাবে ডিএলএলগুলি পাইথনে আমদানি করতে পারে তার কোনও কার্যকর নির্দেশিকা খুঁজে পাইনি। (লিনাক্সের জন্য এটি অপ্রয়োজনীয় যেমন আপনি কেবল ওএস প্যাকেজ ম্যানেজারটি ব্যবহার করেন apt-get install <tk-what-not>তবে উইন্ডোজের জন্য এই বিকল্পটি উপলভ্য নয় এবং কোনও সাধারণ অ্যানালগ নেই। আপনি পেতে পারেন এমন অনেকগুলি এবং বিভিন্ন বাইনারিগুলির একটি তালিকা এখানে রয়েছে।

[6] http://www.bawt.tcl3d.org/download.html                 # Use Tcl-Pure (no additional packages)
[6] https://www.magicsplat.com/tcl-installer/index.html     # 
[6] https://www.irontcl.com/                                # 
[6] https://www.activestate.com/products/tcl/downloads/     # 
[6] http://tclkits.rkeene.org/fossil/wiki/Downloads         # 
[6] http://kitcreator.rkeene.org/kitcreator                 # 

সম্ভবত কেউ আমাকে আলোকিত করতে পারে কীভাবে এগুলির কোনওটি পাইথনে আমদানি করা যায়?


What backends are available and where?

আসুন নীচের ওয়ান-লাইনারগুলি দিয়ে নিজেকে আলোকিত করুন:

python.exe -c "import matplotlib as m; help(m);"
python.exe -c "import matplotlib as m; print('I: {}\nN: {}'.format(m.rcsetup.interactive_bk,m.rcsetup.non_interactive_bk));"

# I: ['GTK3Agg', 'GTK3Cairo', 'MacOSX', 'nbAgg', 'Qt4Agg', 'Qt4Cairo', 'Qt5Agg', 'Qt5Cairo', 'TkAgg', 'TkCairo', 'WebAgg', 'WX', 'WXAgg', 'WXCairo']
# N: ['agg', 'cairo', 'pdf', 'pgf', 'ps', 'svg', 'template']

python.exe -c "import matplotlib as m; p=m.get_backend();print('current backend is:',p);"
# agg

python.exe -c "import matplotlib as m; p=m.matplotlib_fname(); print('The matplotlibrc is located at:\n',p);"
# C:\Python38\lib\site-packages\matplotlib\mpl-data\matplotlibrc

Setting the back-end

ডকুমেন্টেশন যেমন বলে: আপনার ব্যাকএন্ডটি কনফিগার করার জন্য 3 টি উপায় রয়েছে:

  1. rcParams["backend"]আপনার matplotlibrc ফাইলে (ডিফল্ট: 'agg') প্যারামিটার সেট করা হচ্ছে
  2. MPLBACKENDপরিবেশ (শেল) ভেরিয়েবল সেট করা
  3. ফাংশন ব্যবহার করে matplotlib.use()

Using the backend

অবশেষে, আপনার উপলভ্য ব্যাকএন্ড ব্যবহার করা এটি করার বিষয় মাত্র:

import matplotlib 
#matplotlib.use('tkagg', force=True)        # Agg rendering to a Tk canvas
#matplotlib.use('wxcairo', force=True)      # Cairo rendering to a wxWidgets canvas
#matplotlib.use('wxagg', force=True)        # Agg rendering to a wxWidgets canvas
matplotlib.use('webagg', force=True)        # On show() will start a tornado server with an interactive figure.

#matplotlib.use('qt5cairo', force=True)     # Cairo rendering to a Qt5 canvas
#matplotlib.use('qt5agg', force=True)       # Agg rendering to a Qt5 canvas

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