2014-06-08 11 views
13

मैं अजगर में एक आकृति बनाने की कोशिश कर रहा हूं और ऐसा करता हूं कि वही एनोनेट टेक्स्ट में दो रंग होंगे, एनोननेट का आधा नीला हो जाएगा और दूसरा आधा लाल हो जाएगा।matplotlib एक ही एनोटेट में दो अलग-अलग रंग

मुझे लगता है कि कोड स्वयं को समझाता है। मेरे पास हरे रंग के एनोनेट के साथ 3 लाइनें 1 हरी है, नीली annonate के साथ 1 नीली है।

तीसरा लाल साजिश 1 और साजिश 2 का सारांश है, और मैं चाहता हूं कि यह आधा अनाजदार नीला और आधा हरा हो।

IPython -pylab

x=arange(0,4,0.1) 

exp1 = e**(-x/5) 
exp2 = e**(-x/1) 
exp3 = e**(-x/5) +e**(-x/1) 

figure() 
plot(x,exp1) 
plot(x,exp2) 
plot(x,exp1+exp2) 
title('Exponential Decay') 


annotate(r'$e^{-x/5}$', xy=(x[10], exp1[10]), xytext=(-20,-35), 
     textcoords='offset points', ha='center', va='bottom',color='blue', 
      bbox=dict(boxstyle='round,pad=0.2', fc='yellow', alpha=0.3), 
      arrowprops=dict(arrowstyle='->', connectionstyle='arc3,rad=0.95', 
          color='b')) 

annotate(r'$e^{-x/1}$', xy=(x[10], exp2[10]), xytext=(-5,20), 
     textcoords='offset points', ha='center', va='bottom',color='green', 
      bbox=dict(boxstyle='round,pad=0.2', fc='yellow', alpha=0.3), 
      arrowprops=dict(arrowstyle='->', connectionstyle='arc3,rad=-0.5', 
          color='g')) 

annotate(r'$e^{-x/5} + e^{-x/1}$', xy=(x[10], exp2[10]+exp1[10]), xytext=(40,20), 
     textcoords='offset points', ha='center', va='bottom', 
      bbox=dict(boxstyle='round,pad=0.2', fc='yellow', alpha=0.3), 
      arrowprops=dict(arrowstyle='->', connectionstyle='arc3,rad=-0.5', 
          color='red')) 

क्या यह संभव है?

+0

@bli क्या आपने [इस सवाल] को देखा [https://stackoverflow.com/questions/9169052/partial-coloring-of-text-in-matplotlib)? – ImportanceOfBeingErnest

+0

धन्यवाद। यह उत्तर वास्तव में काफी प्रासंगिक है: https://stackoverflow.com/a/42768093/1878788 – bli

उत्तर

7

मुझे नहीं लगता कि आपके पास एक ही एनोटेशन में एकाधिक रंग हो सकते हैं, जहां तक ​​मुझे पता है- annotate केवल पैरामीटर के रूप में एक टेक्स्ट ऑब्जेक्ट लेता है, और टेक्स्ट ऑब्जेक्ट केवल एकल रंगों का समर्थन करते हैं। तो, मेरे ज्ञान के लिए, स्वचालित रूप से ऐसा करने का कोई "मूल" या "सुरुचिपूर्ण" तरीका नहीं है।

हालांकि, एक वर्कअराउंड है: आप ग्राफ में मनमाने ढंग से कई टेक्स्ट ऑब्जेक्ट्स रख सकते हैं। मैं एनोटेशन color='black' सेट

  1. ;: तो यहाँ कैसे मैं यह कर करेंगे:

    fig1 = figure() 
    # all the same until the last "annotate": 
    annotate(r'$e^{-x/5}$'+r'$e^{-x/1}$', xy=(x[10], exp2[10]+exp1[10]), xytext=(40,20), 
         textcoords='offset points', ha='center', va='bottom',color='white', 
          bbox=dict(boxstyle='round,pad=0.2', fc='yellow', alpha=0.3), 
          arrowprops=dict(arrowstyle='->', connectionstyle='arc3,rad=-0.5', 
              color='r')) 
    
    fig1.text(0.365, 0.62, r'$e^{-x/5}$', ha="center", va="bottom", size="medium",color="blue") 
    fig1.text(0.412, 0.62, r'$e^{-x/1}$', ha="center", va="bottom", size="medium",color="green") 
    

    मैं क्या किया था

  2. मैंने दो टेक्स्ट ऑब्जेक्ट्स को 0.5, 0.5 (जो fig1 का केंद्र) पर बनाया है;
  3. मैंने मैन्युअल रूप से पदों को तब तक बदल दिया जब तक वे annotate द्वारा उत्पन्न काले पाठ के साथ मोटे तौर पर ओवरलैप नहीं कर रहे थे (जो कि text पर दो कॉलों में दिखाई देने वाले मानों को समाप्त कर दिया गया है);
  4. मैंने एनोटेशन color='white' सेट किया है, इसलिए यह ओवरलैपिंग टेक्स्ट के रंग में हस्तक्षेप नहीं करता है।

यहाँ उत्पादन है:

multi-colour annotated graph

यह बहुत ही सुंदर नहीं है, और यह आवश्यक फेरबदल करने पदों कुछ अंकन की आवश्यकता होती है, लेकिन यह काम किया जाता है।

आप कई भूखंडों की जरूरत है, शायद उसके प्लेसमेंट स्वचालित करने के लिए एक तरीका है: आप fig1 वस्तु की दुकान नहीं है, तो text के लिए निर्देशांक वास्तविक एक्स हो जाते हैं, y में निर्देशांक ग्राफ-मुझे लगता है थोड़ा मुश्किल है कि साथ काम करने के लिए, लेकिन हो सकता है कि यह आपको एनोटेशन के xy निर्देशांक का उपयोग करके स्वचालित रूप से उत्पन्न करने में सक्षम करे? मेरे लिए परेशानी के लायक नहीं है, लेकिन अगर आप ऐसा करते हैं, तो मैं कोड देखना चाहता हूं।

+2

इसे साजिश करने के बाद मुझे एहसास हुआ कि आपकी साजिश में '+' है, जिसे मैंने पहले नहीं देखा था। मुझे यकीन है कि आपके लिए अतिरिक्त 'टेक्स्ट' के साथ साजिश करने के लिए निर्देश पर्याप्त हैं। यह भी देखें [यह उत्तर] (http://stackoverflow.com/a/9185143/3540074), यह करने के लिए यह एक और अधिक शानदार तरीका प्रदान करता है, लेकिन मैं इसे काम करने में सक्षम नहीं था। – kadu

1

टेक्स्ट को आधा नीला, आधा हरा बनाने के लिए आप r'$\textcolor{blue}{e^{-x/5}} + \textcolor{green}{e^{-x/1}}$' का उपयोग कर सकते हैं। उदाहरण के लिए अपने स्वयं के कोड का उपयोग करना:

enter image description here

छवि निम्नलिखित कोड से उत्पन्न होता है। डिफ़ॉल्ट matplotlibrc सेटिंग्स के साथ matplotlib v2.1.2 के साथ परीक्षण किया गया।

  1. आप एक pgf बैकएंड उपयोग करने की आवश्यकता:

    import matplotlib as matplotlib 
    matplotlib.use('pgf') 
    matplotlib.rc('pgf', texsystem='pdflatex') # from running latex -v 
    preamble = matplotlib.rcParams.setdefault('pgf.preamble', []) 
    preamble.append(r'\usepackage{color}') 
    
    from numpy import * 
    from matplotlib.pyplot import * 
    
    x=arange(0,4,0.1) 
    
    exp1 = e**(-x/5) 
    exp2 = e**(-x/1) 
    exp3 = e**(-x/5) +e**(-x/1) 
    
    figure() 
    plot(x,exp1) 
    plot(x,exp2) 
    plot(x,exp1+exp2) 
    title('Exponential Decay') 
    
    
    annotate(r'$e^{-x/5}$', xy=(x[10], exp1[10]), xytext=(-20,-25), 
         textcoords='offset points', ha='center', va='bottom',color='blue', 
         bbox=dict(boxstyle='round,pad=0.2', fc='yellow', alpha=0.3), 
         arrowprops=dict(arrowstyle='->', connectionstyle='arc3,rad=0.95', 
              color='b')) 
    
    annotate(r'$e^{-x/1}$', xy=(x[10], exp2[10]), xytext=(25,20), 
         textcoords='offset points', ha='center', va='bottom',color='green', 
         bbox=dict(boxstyle='round,pad=0.2', fc='yellow', alpha=0.3), 
         arrowprops=dict(arrowstyle='->', connectionstyle='arc3,rad=-0.5', 
              color='g')) 
    
    annotate(r'$\textcolor{blue}{e^{-x/5}} + \textcolor[rgb]{0.0, 0.5, 0.0}{e^{-x/1}}$', 
         xy=(x[10], exp2[10]+exp1[10]), xytext=(40,20), 
         textcoords='offset points', ha='center', va='bottom', 
         bbox=dict(boxstyle='round,pad=0.2', fc='yellow', alpha=0.3), 
         arrowprops=dict(arrowstyle='->', connectionstyle='arc3,rad=-0.5', 
              color='red')) 
    
    savefig('test.png') 
    

    यह मुख्य रूप से निम्न परिवर्तन के साथ अपने कोड है।

  2. Usepackage colorpgf.preamble
  3. में, 1 और 2 एनोटेशन के साथ कुछ अतिव्यापी नहीं है तो xytext बदल जाता है।
  4. टी 2 एनोटेशन में color='g' वास्तव में आरजीबी के शुद्ध "ग्रीन" रंग (0, 255, 0) का उपयोग नहीं किया। \textcolor[rgb]{0.0, 0.5, 0.0} इसे समान दिखता है।
+0

धन्यवाद, यह काम करता है। मेरे अपने मामले में, मुझे टीएक्स के साथ स्मृति समस्याएं थीं, संभवतः स्कैटरप्लॉट में प्लॉट करने के लिए अंक की एक महत्वपूर्ण संख्या के कारण। मैंने 'texsystem' के लिए' lualatex "' का उपयोग करके इस मुद्दे को हल किया। – bli

+0

@bli, हां, 'matplotlib.rc ('pgf', texsystem = 'pdflatex') की उस पंक्ति को हटाया जाना चाहिए। मुझे लगता है कि डिफ़ॉल्ट टेक्सास सिस्टम भी काम करता है। – gepcel

संबंधित मुद्दे