2012-02-06 15 views
31

Bir dizenin rengini kısmen belirtmek için matplotlib'de bir yol var mı?Matplotlib içindeki metnin kısmi renklendirilmesi

Örnek: kırmızı olarak "bugün" nasıl gösterilebilir?

plt.ylabel("Today is cloudy.") 

, yeşil ve "bulutlu." "Is" mavi mi

Teşekkürler.

+2

Bunu 3 ayrı metin kutusuyla kesmeniz gerektiğini düşünüyorum. – wim

+0

Matplotlib posta listesine sorun. Belki de özel renderer veya "Sanatçı" ile mümkün olabilir. –

+1

Ayrıca, https://github.com/matplotlib/matplotlib/issues/697 adresinden de –

cevap

18

Yalnızca etkileşimli olmayan bir şekilde ve sadece 'PS' arka ucunda bile nasıl yapılacağını biliyorum.

Bunu yapmak için, metni biçimlendirmek için Lateks'i kullanırdım. Sonra 'renk' paketini dahil edip renklerinizi istediğiniz gibi ayarlayacağım. İşte

Bunu yapmanın bir örnektir:

Bu sonuçlanır
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 kullanarak png için ps dönüştürülmüş, bu yüzden buraya sonrası olabilir): enter image description here

+1

Bunu kullanıyorum, eğer sadece PDF arka ucu ile çalışmak gerekiyorsa :) Herhangi bir sebepten dolayı, eksenleri düzgün bir şekilde yerleştiremiyorum. ben ps arka uç ile çalışırken tuval. –

+0

Üzgünüm - Bunu reddetmek istemedim. Onu reddetmek istedim ve daha önce yanlış seçilmeliydim. – mixedmath

+0

Çok güzel bir çözüm. 'pdf 'oluşturmak için bir yolu var mı? Grafiğimde her şeyi halledebilen ps 've ps2pdf' olarak kaydetmenin yanı sıra ... –

18

burada interaktif versiyonu (Ben the list gönderilen aynı bir)

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

Sözler, dikey sürümde tam olarak hizalanmadı gibi görünüyor. – Alex

+1

Bu yorum yazdığım anda matplotlib'deki bir hataydı. O zamandan beri [burada] görebildiğiniz gibi düzeltildi (http://matplotlib.org/examples/text_labels_and_annotations/rainbow_text.html). –

4

şimdi also works with PDF export Yann'ın cevabı, LaTeX renklendirme genişletme: Bu python komut dosyası bazen ilk denemede Undefined control sequence hataları ile başarısız olduğunu

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

Not. Tekrar çalıştırmak daha sonra başarılı olur.