2010-07-19 15 views
45

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

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

+0

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

उत्तर

0

तो मुझे पूरा यकीन नहीं है कि यह वही है जो आप खोज रहे हैं।

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

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

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

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

+2

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

1

आप एक अलग पायथन प्रक्रिया भी उस प्लॉट को बना सकते हैं, संभवतः अचार की मदद से या joblib

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

matplotlib doc से लिया:

32

एक "प्रायोगिक" सुविधा नहीं है।

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

+0

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

+1

@TSR 'न्यूबैकेंड' को जीयूआई बैकएंड के साथ बदलें 'Qt4Agg' – YashTD

10

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

import matplotlib 
matplotlib.use('agg') 

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

यदि आपने pyplot आयात किया है तो यह काम नहीं करता है। –

+0

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

+0

हम्म। वास्तव में आईपीथन का एक quirk हो सकता है। नियमित कंसोल में अच्छी तरह से काम करने लगता है। –

15

छह साल बाद और मैं जब तय करने के लिए जो 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 अदला-बदली के रूप में सरल है पुनः आयात उन अभी भी हो रही परेशानी के लिए नई backend

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

Switched to: WXAgg 

मजबूर कर के बाद matplotlib.pyplot , यह कोड प्रिंट करेगा:
गैर गुई बैकएंड की सूची;
गुई बैकएंड की सूची;
और फिर यह देखने के लिए कि क्या यह मौजूद है और कार्य कर रहा है, प्रत्येक गुई बैकएंड का उपयोग करने का प्रयास करें।

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

धन्यवाद! इस उदाहरण के लिए मुझे उपयुक्त बैक-एंड खोजने में बहुत मदद मिली: http://stackoverflow.com/questions/11874767/real-time-plotting-in-while-loop-with-matplotlib –

+0

@ जेम्ससल्सन ने यह सुनकर खुशी की उत्तर 6 साल देर से हुआ था, –

+0

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