Matplotlib / Python में बैकएंड कैसे बदलें


90

मैं निम्नलिखित मुद्दे से जूझ रहा हूं। मुझे ऐसी रिपोर्टें तैयार करनी होंगी जिनमें चार्ट का संग्रह हो। ये सभी चार्ट, एक को छोड़कर, Matplotlib डिफ़ॉल्ट बैकेंड (TkAgg) का उपयोग करके बनाए गए हैं। एक चार्ट काहिरा बैकएंड का उपयोग करके बनाया जाना चाहिए, इसका कारण यह है कि मैं एक इग्राफ ग्राफ की साजिश रच रहा हूं और जिसे केवल काहिरा का उपयोग करके प्लॉट किया जा सकता है।

मुद्दा यह है कि मैं मक्खी पर बैकेंड नहीं बदल सकता, उदाहरण के लिए निम्नलिखित काम नहीं करता है:
matplotlib.pyplot.switch_backend('cairo.png') (मुझे पता है कि switch_backend कार्यक्षमता प्रयोगात्मक है)

और मैंने भी कोशिश की है matplotlib.use("cairo.png")लेकिन इससे समस्याएँ पैदा होती हैं क्योंकि matplotlib.use("cairo.png")आयात करने से पहले बयान आना चाहिए matplotlib.pyplot। लेकिन मुझे स्क्रिप्ट के जीवन के दौरान दो अलग-अलग बैकेंड की आवश्यकता है।

तो मेरा सवाल यह है कि क्या किसी के पास एक कोड स्निपेट है जो दिखाता है कि मैटलपोटलिब में बैकएंड को कैसे स्विच किया जाए?

बहुत बहुत धन्यवाद!

अद्यतन: मैंने एक स्निपेट लिखा है जो matplotlib को लोड करता है, डिफ़ॉल्ट बैकएंड को दिखाता है, matplotlib को अनलोड करता है, इसे पुनः लोड करता है और बैकेंड को बदलता है:

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: वास्तव में, यह अभी भी एक मुद्दा है, जो कोई भी जानता है कि कैसे गतिशील रूप से matplotlib बैकेंड स्विच करना है .... कृपया अपना उत्तर पोस्ट करें।


नहीं है pyplot.switch_backends()। यह आपके मामले में काम नहीं कर सकता है।
5

जवाबों:


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

Caveats: संस्करण 3.3.0 के बाद से matplotlib में परिवर्तन

  • Matplotlib.use के पहले पैरामीटर का नाम बदलकर arg से backend कर दिया गया है (केवल प्रासंगिक यदि आप कीवर्ड से गुजरते हैं)।
  • Matplotlib.use के पैरामीटर चेतावनी को हटा दिया गया है। बैकएंड को स्विच करने में विफलता अब हमेशा एक आयात को बढ़ाएगा यदि बल सेट है; यदि आवश्यक हो तो उस त्रुटि को पकड़ें।
  • पहले एक को छोड़कर matplotlib.use के सभी पैरामीटर अब केवल कीवर्ड हैं।

धन्यवाद! इस उदाहरण के लिए उपयुक्त बैक-एंड खोजने में मेरी मदद करने में बहुत काम आया: stackoverflow.com/questions/11874767/…
जेम्स नेल्सन

रॉक्स ऑफ सैक्सोनी, LOL बहुत उपयोगी है, मुझे अभी भी लगभग एक दशक पहले से उबंटू और एंड्रॉइड पोस्ट पर प्रतिक्रियाएं मिलती हैं।
जेम्स नेल्सन

warn=Falseतर्क अब उपलब्ध नहीं है।
नॉटआउट 2

@ not2qubit नोटेड - धन्यवाद। कैविट्स ने जोड़ा।
सैक्सोनी का रॉल्फ

37

एक "प्रयोगात्मक" सुविधा है:

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

matplotlib डॉक्टर से लिया गया ।

डिफ़ॉल्ट बैकएंड को newbackend पर स्विच करें। यह सुविधा प्रयोगात्मक है , और केवल एक छवि बैकएंड पर स्विच करने के लिए काम करने की उम्मीद है। उदाहरण के लिए, यदि आपके पास पोस्टस्क्रिप्ट स्क्रिप्ट का एक गुच्छा है जिसे आप एक इंटरैक्टिव ipython सत्र से चलाना चाहते हैं, तो आप GUI विंडोज़ पॉपअप के एक गुच्छा से बचने के लिए उन्हें चलाने से पहले PS बैकएंड पर स्विच करना चाह सकते हैं। यदि आप एक GUI बैकएंड से दूसरे में इंटरेक्टिवली स्विच करने का प्रयास करते हैं, तो आप विस्फोट करेंगे। इस कमांड को कॉल करने से सभी खुली हुई खिड़कियां बंद हो जाएंगी।


अपरिचित बैकएंड स्ट्रिंग "newbackend"। मुझे क्या करना चाहिए?
टीएसआर

5
@TSR ने GUI बैकएंड के साथ 'newbackend' को 'Qt4Agg' की तरह बदला
YashTD

14

सिर्फ reloadअंतर्निहित फ़ंक्शन ( importlib.reloadपायथन 3 में) का उपयोग क्यों नहीं करें ?

import matplotlib
matplotlib.use('agg')

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

जैसा कि आप matplotlib और matplotlib.pyplot को पुनः लोड नहीं कर सकते हैं? या आप सिर्फ यह कह रहे हैं कि मेरा कोड छीना गया अधूरा है?
फ्रेडबाबा

हम्म। वास्तव में IPython का एक क्विक रहा होगा। नियमित कंसोल में अच्छा काम करने लगता है।
मैड फिजिसिस्ट

1
मुझे लगता है कि यह एक उदाहरण है, जो दिखाता है, कि यह काम नहीं करता है: python -c "import matplotlib.pyplot as plt; import matplotlib; from importlib import reload; matplotlib = reload(matplotlib); matplotlib.use('Agg')"क्या यह सही है?
लुकास

6

इसलिए मुझे पूरी तरह से यकीन नहीं है कि यह वही है जो आप ढूंढ रहे हैं।

आप matplotlibrc फ़ाइल के माध्यम से अपने बैकएंड को बदल सकते हैं जिसमें आपके matplotlib के लिए कुछ निश्चित विन्यास होते हैं।

अपनी स्क्रिप्ट में आप डाल सकते हैं:

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

या बैकएंड के बीच स्विच करने के लिए ऐसा कुछ।


2
वास्तव में, आप अपने rcParams शब्दकोश में बैकएंड निर्दिष्ट कर सकते हैं लेकिन यह एक बैकएंड से दूसरे में स्विच करने की समस्या को हल नहीं करता है।
22

आप डिफॉल्ट फाइल में डिफ़ॉल्ट बैकएंड भी सेट कर सकते हैं, जिसे matplotlib द्वारा लिया गया है:~/.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

यदि आप एक IPython कंसोल (स्पाइडर के भीतर सहित) का उपयोग कर रहे हैं, तो आप बैकएंड को जल्दी से स्विच करने के लिए अंतर्निहित मैजिक कमांड का उपयोग कर सकते हैं , जैसे:

%matplotlib qt

कमांड के साथ उपयोग करने के लिए उपलब्ध बैकएंड की सूची प्राप्त करें:

%matplotlib --list

उपलब्ध matplotlib बैकेंड: ['tk', 'gtk', 'gtk3', 'wx', 'qt4', 'qt5', 'qt', 'osx', 'ngbg,' नोटबुक ',' agg ',' svg ',' pdf ',' ps ',' inline ',' ipympl ',' widget ']


0

Extra Info

यद्यपि हर कोई अपना पसंदीदा बैक-एंड दिखाता है, यह पता लगाने के लिए कि आपको क्या स्थापित करना है और क्या आवश्यकताएं हैं, यह काफी गड़बड़ है। कम से कम जब आप आम तौर पर भ्रामक और तकनीकी दस्तावेज को समझने की कोशिश करते हैं। आज मैंने कई प्रयोग किए हैं और मुझे लगता है कि मैंने प्रत्येक बैक-एंड के लिए सबसे सरल समाधान पाया है जो विंडोज में matplotlib के साथ साजिश रचने और Py3.8.5 (Qt बिल्ट-इन के बिना) का उपयोग करने में सक्षम है । यहाँ मेरे निष्कर्ष हैं:

#--------------------------------------
# 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]

यहाँ उन सभी PyPi या Repos के लिंक दिए गए हैं:

[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अजगर के लिए पैकेज के लिए प्रलेखन की विशाल मात्रा को देखते हुए , मैं इसे स्थापित करने में सक्षम नहीं था, और न ही DLL के अजगर में आयात करने के लिए कोई उपयोगी निर्देश पा सकता हूं। (लिनक्स के लिए यह तुच्छ है क्योंकि आप बस ओएस पैकेज मैनेजर का उपयोग करते हैं 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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.