2012-02-06 48 views
31

Có cách nào trong matplotlib xác định một phần màu của chuỗi không?Màu sắc một phần của văn bản trong matplotlib

Ví dụ:

plt.ylabel("Today is cloudy.") 

Làm thế nào tôi có thể hiển thị "hôm nay" như đỏ, "là" như màu xanh lá cây và "mây". màu xanh?

Cảm ơn.

+2

Tôi nghĩ bạn sẽ phải hack nó bằng 3 hộp văn bản riêng biệt. – wim

+0

Hỏi danh sách gửi thư matplotlib. Nó có thể là có thể với renderer tùy chỉnh hoặc "Artist" có lẽ. –

+1

Cũng tại https://github.com/matplotlib/matplotlib/issues/697 –

Trả lời

18

Tôi chỉ biết cách thực hiện điều này không tương tác và thậm chí chỉ với phần phụ trợ 'PS'.

Để làm điều này, tôi sẽ sử dụng Latex để định dạng văn bản. Sau đó, tôi sẽ bao gồm các gói 'màu', và thiết lập màu sắc của bạn như bạn muốn.

Dưới đây là một ví dụ để làm điều này:

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

Điều này dẫn đến (chuyển đổi từ ps để png sử dụng ImageMagick, vì vậy tôi có thể đăng nó ở đây): enter image description here

+1

Tôi sẽ sử dụng cái này, nếu nó chỉ hoạt động với phần phụ trợ PDF :) Vì lý do nào đó, tôi không bao giờ có thể đặt các trục được đặt đúng cách canvas trong khi tôi đang làm việc với phần cuối của ps. –

+0

Tôi xin lỗi - tôi không có ý nói xuống điều này. Tôi có nghĩa là để upvote nó, và tôi phải có misclicked trước đó. – mixedmath

+0

Giải pháp rất đẹp. Có cách nào để tạo'pdf' không? Ngoài việc lưu nó dưới dạng 'ps' và sau đó là' ps2pdf', điều này sẽ làm tăng mọi thứ trong đồ thị của tôi ... –

18

đây là phiên bản tương tác (cùng một tôi được đưa lên 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

Có vẻ như các từ không được căn chỉnh chính xác trong phiên bản theo chiều dọc. – Alex

+1

Điều này thực sự là một lỗi trong matplotlib tại thời điểm tôi đã viết bình luận đó. Nó đã được sửa chữa, như bạn có thể thấy [ở đây] (http://matplotlib.org/examples/text_labels_and_annotations/rainbow_text.html). –

4

Mở rộng câu trả lời Yann của, màu LaTeX tại 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") 

Lưu ý rằng kịch bản python này đôi khi không thành công với Undefined control sequence sai sót trong nỗ lực đầu tiên. Chạy nó một lần nữa là sau đó thành công.

Các vấn đề liên quan