2012-02-06 18 views
31

में पाठ का आंशिक रंग क्या आंशिक रूप से स्ट्रिंग के रंग को निर्दिष्ट करने के लिए matplotlib में कोई तरीका है?matplotlib

उदाहरण:

plt.ylabel("Today is cloudy.") 

मैं दिखा सकते हैं कैसे "आज" लाल के रूप में, हरे और "बादल छाए रहेंगे।" के रूप में "है" नीले रंग के रूप में?

धन्यवाद।

+2

मुझे लगता है कि आपको इसे 3 अलग-अलग टेक्स्ट बॉक्स के साथ हैक करना होगा। – wim

+0

matplotlib मेलिंग सूची पर पूछें। शायद कस्टम रेंडरर या "कलाकार" के साथ संभव हो सकता है। –

+1

https://github.com/matplotlib/matplotlib/issues/697 –

उत्तर

18

मुझे केवल यह पता है कि यह गैर-संवादात्मक तरीके से कैसे किया जाए, और फिर भी केवल 'पीएस' बैकएंड के साथ।

ऐसा करने के लिए, मैं टेक्स्ट को प्रारूपित करने के लिए लेटेक्स का उपयोग करूंगा। फिर मैं 'रंग' पैकेज शामिल करूंगा, और अपनी इच्छाओं के अनुसार अपने रंग सेट करूँगा।

यहाँ ऐसा करने का एक उदाहरण है:

import matplotlib 
matplotlib.use('ps') 
from matplotlib import rc 

rc('text',usetex=True) 
rc('text.latex', preamble='\usepackage{color}') 
import matplotlib.pyplot as plt 

plt.figure() 
plt.ylabel(r'\textcolor{red}{Today} '+ 
      r'\textcolor{green}{is} '+ 
      r'\textcolor{blue}{cloudy.}') 
plt.savefig('test.ps') 

इस में जो परिणाम (ImageMagick का उपयोग कर png को ps से परिवर्तित, इसलिए मैं इसे यहाँ पोस्ट कर सकता): enter image description here

+1

पर भी मैं इसका उपयोग करूंगा, अगर केवल पीडीएफ बैकएंड के साथ काम करना था :) किसी कारण से, मैं अक्ष को ठीक से नहीं रख सकता कैनवास जबकि मैं पीएस बैकएंड के साथ काम कर रहा हूं। –

+0

मुझे खेद है - मेरा मतलब यह नहीं था कि मैं इसे कम कर दूं। मेरा मतलब है कि इसे ऊपर उठाना, और मैंने पहले गलत तरीके से गलत किया होगा। – mixedmath

+0

बहुत अच्छा समाधान। क्या'pdf' बनाने का कोई तरीका है? इसे 'ps' और फिर' ps2pdf' के रूप में सहेजने के अलावा, जो मेरे ग्राफ में सबकुछ खराब कर देता है ... –

18

यहाँ इंटरैक्टिव संस्करण है (वही मैं the list पर पोस्ट किए गए)

import matplotlib.pyplot as plt 
from matplotlib import transforms 

def rainbow_text(x,y,ls,lc,**kw): 
    """ 
    Take a list of strings ``ls`` and colors ``lc`` and place them next to each 
    other, with text ls[i] being shown in color lc[i]. 

    This example shows how to do both vertical and horizontal text, and will 
    pass all keyword arguments to plt.text, so you can set the font size, 
    family, etc. 
    """ 
    t = plt.gca().transData 
    fig = plt.gcf() 
    plt.show() 

    #horizontal version 
    for s,c in zip(ls,lc): 
     text = plt.text(x,y," "+s+" ",color=c, transform=t, **kw) 
     text.draw(fig.canvas.get_renderer()) 
     ex = text.get_window_extent() 
     t = transforms.offset_copy(text._transform, x=ex.width, units='dots') 

    #vertical version 
    for s,c in zip(ls,lc): 
     text = plt.text(x,y," "+s+" ",color=c, transform=t, 
       rotation=90,va='bottom',ha='center',**kw) 
     text.draw(fig.canvas.get_renderer()) 
     ex = text.get_window_extent() 
     t = transforms.offset_copy(text._transform, y=ex.height, units='dots') 


plt.figure() 
rainbow_text(0.5,0.5,"all unicorns poop rainbows ! ! !".split(), 
     ['red', 'orange', 'brown', 'green', 'blue', 'purple', 'black'], 
     size=40) 

all unicorns poop rainbows

+0

ऐसा लगता है कि शब्द लंबवत संस्करण में बिल्कुल गठबंधन नहीं हैं। – Alex

+1

जब मैं उस टिप्पणी को लिखता था तो यह वास्तव में matplotlib में एक बग था। इसे तब से तय कर दिया गया है, जैसा कि आप देख सकते हैं [यहां] (http://matplotlib.org/examples/text_labels_and_annotations/rainbow_text.html)। –

4

यान का जवाब, LaTeX रंग अब also works with PDF export विस्तार:

import matplotlib 
from matplotlib.backends.backend_pgf import FigureCanvasPgf 
matplotlib.backend_bases.register_backend('pdf', FigureCanvasPgf) 

import matplotlib.pyplot as plt 

pgf_with_latex = { 
    "text.usetex": True,   # use LaTeX to write all text 
    "pgf.rcfonts": False,   # Ignore Matplotlibrc 
    "pgf.preamble": [ 
     r'\usepackage{color}'  # xcolor for colours 
    ] 
} 
matplotlib.rcParams.update(pgf_with_latex) 

plt.figure() 
plt.ylabel(r'\textcolor{red}{Today} '+ 
      r'\textcolor{green}{is} '+ 
      r'\textcolor{blue}{cloudy.}') 
plt.savefig("test.pdf") 

ध्यान दें कि यह अजगर स्क्रिप्ट कभी कभी पहले ही प्रयास में Undefined control sequence त्रुटियों के साथ विफल रहता है। इसे फिर से चलाना सफल है।