matplotlib 文本局部着色

ccgok5k5  于 2023-10-24  发布在  其他
关注(0)|答案(4)|浏览(121)

matplotlib中有没有一种方法可以部分指定字符串的颜色?
范例:

plt.ylabel("Today is cloudy.")

我如何将“今天”表示为红色,“是”表示为绿色,“多云”表示为蓝色?

emeijp43

emeijp431#

我只知道如何做到这一点非交互式,即使这样,只有与'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从ps转换为png,所以我可以在这里发布):

s4n0splo

s4n0splo2#

这是交互式版本。**编辑:**修复了Matplotlib 3中产生额外空格的错误。

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.05,0.05,"all unicorns poop rainbows ! ! !".split(), 
        ['red', 'orange', 'brown', 'green', 'blue', 'purple', 'black'],
        size=20)

bgtovc5b

bgtovc5b3#

扩展Yann的答案,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")

请注意,这个python脚本有时会在第一次尝试时失败,并出现Undefined control sequence错误。再次运行它就会成功。

tvmytwxo

tvmytwxo4#

在尝试了以上所有的方法之后,我又回到了我愚蠢但简单的方法,使用plt.text。唯一的问题是你需要调整每个单词之间的空格。你可能需要调整几次位置,但我仍然喜欢这种方式,因为它
1.使您不必安装tex编译器,
1.不需要任何特殊的后端,
1.使您不必配置matplotlib rc和configure back,或者由于usetex=True,它可能会减慢您的其他绘图速度

import matplotlib.pyplot as plt

fig, ax = plt.subplots()
label_x = -0.15
ax.text(label_x, 0.35, r"Today", color='red', rotation='vertical', transform=ax.transAxes)
ax.text(label_x, 0.5, r"is", color='green', rotation='vertical', transform=ax.transAxes)
ax.text(label_x, 0.55, r"cloudy", color='blue', rotation='vertical', transform=ax.transAxes)

相关问题