Есть ли способ в matplotlib частично указать цвет строки?
Пример:
plt.ylabel("Today is cloudy.")
Как я могу показать "сегодня" как красный, "есть" как зеленый и "облачный". как синий?
Спасибо.
Есть ли способ в matplotlib частично указать цвет строки?
Пример:
plt.ylabel("Today is cloudy.")
Как я могу показать "сегодня" как красный, "есть" как зеленый и "облачный". как синий?
Спасибо.
Я знаю только, как сделать это неинтерактивно, и даже тогда только с бэкэндом "PS".
Чтобы сделать это, я бы использовал Latex для форматирования текста. Затем я бы включил пакет "color" и установил ваши цвета по вашему желанию.
Вот пример этого:
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')
В результате (преобразуется из ps в png с помощью ImageMagick, поэтому я могу опубликовать его здесь):
здесь интерактивная версия (то же самое я отправил в список)
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)
Расширение ответа Янна, теперь раскраска LaTeX также работает с экспортом PDF:
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")
Обратите внимание, что этот python script иногда терпит неудачу с ошибками Undefined control sequence
в первой попытке. Выполнение этого снова успешно.