2012-02-06 3 views
31

부분적으로 문자열의 색상을 지정하는 방법이 matplotlib에 있습니까?matplotlib의 텍스트 부분 컬러링

예 : 내가 빨간색으로 "오늘"을 보여줄 수있는 방법

plt.ylabel("Today is cloudy.") 

로 녹색과 "구름." "입니다" 파란색으로?

감사합니다.

+2

3 개의 텍스트 상자로 해킹해야 할 것 같습니다. – wim

+0

matplotlib 메일 링리스트에 문의하십시오. 아마도 사용자 정의 렌더러 또는 "아티스트"에서 가능할 수 있습니다. –

+1

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

답변

18

이 방법은 비대화 형으로 만 수행 할 수 있으며, 'PS'백엔드에서만 사용할 수 있습니다.

이렇게하려면 텍스트 서식을 지정하기 위해 라텍스를 사용합니다. 그런 다음 '색상'패키지를 포함시키고 원하는대로 색상을 설정합니다. 여기

이 일의 예입니다

이 결과
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

PDF 백엔드와 만 작동하는 경우이 코드를 사용합니다 :) 어떤 이유로 든 제대로 축을 배치 할 수 없습니다. 내가 ps 백엔드로 작업하는 동안 캔버스. –

+0

죄송합니다 - 나는 이것을 downvote 것을 의미하지는 않습니다. 나는 그것을 upvote 의미하고, 내가 일찍 misclicked해야합니다. – mixedmath

+0

아주 좋은 해결책입니다. ''''''''''''''''를 만드는 방법이 있습니까? 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

지금 also works with PDF export 얀의 대답, LaTeX의 색상 확장이 파이썬 스크립트가 때때로 첫 번째 시도에서 Undefined control sequence 오류와 함께 실패

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

참고. 다시 실행하면 성공합니다.