如何在Python中按字符给文本着色?

xen*_*ity 1 python matplotlib seaborn jupyter-notebook

我想给字符串着色,但每个字符都不同。我有一个包含文本的数组和一个值在 -1 到 1 之间的数组,其中 -1 应该代表“红色”,1 应该代表“绿色”。0 可以是白色、黄色或介于红色和绿色之间的褪色。

每个角色都应该有与得分有关的颜色。

数据如下:

array([['a', 'c', 'm', 'e', 't', 'e', 'l', 'l', 'm', 'e'],
   ['0.1716490432811229', '0.062389299621661884',
    '0.26545182258229466', '-0.07999088246625552',
    '-0.4499291603930515', '-0.7465421931327068', '-0.812006046307664',
    '-0.8443500193245104', '-0.865253671942029','-0.8697487071105282',]],
  dtype='<U32')
Run Code Online (Sandbox Code Playgroud)

我能够生成颜色:

import matplotlib as mpl
import matplotlib.cm as cm

norm = mpl.colors.Normalize(vmin=-1, vmax=1)
cmap = cm.RdYlGn
x = 0.3

m = cm.ScalarMappable(norm=norm, cmap=cmap)
#print(m.to_rgba(x))

color = m.to_rgba(ws)
color
Run Code Online (Sandbox Code Playgroud)

结果如下所示(r、g、b、a):

array([[ 0.87435602,  0.94709727,  0.57708574,  1.        ],
       [ 0.9561707 ,  0.98154556,  0.68904268,  1.        ],
       [ 0.83529412,  0.93048827,  0.5349481 ,  1.        ],
       [ 0.68627451,  0.86620531,  0.43852364,  1.        ],
       [ 0.46889658,  0.77131872,  0.39577086,  1.        ],
       [ 0.45905421,  0.76701269,  0.39469435,  1.        ],
       [ 0.07597078,  0.54809689,  0.2887351 ,  1.        ],
       [ 0.08796617,  0.57024221,  0.30026913,  1.        ],
       (truncated...)
Run Code Online (Sandbox Code Playgroud)

目标环境是IPython或JupyterHub。彩色文本可以是文本(首选)、图像、HTML 或绘制的数据框/seaborn。但文本应该易于阅读,并且可以是 50 到 100 个字符。

Imp*_*est 5

要在 Jupyter 笔记本中创建 HTML 输出,您可以使用display(HTML(<your html here>)). <span>可以通过用相应的颜色定义 a 中的每个字母来对单个字母进行着色。

解决方案可能如下所示:

import matplotlib.colors as mcolors
from matplotlib import cm
import numpy as np

from IPython.core.display import display, HTML

def format_chars(chars,numbers):
    numbers = np.array(numbers).astype(float)
    norm = mcolors.Normalize(vmin=-1, vmax=1)
    cmap = cm.RdYlGn
    colors = cmap(norm(numbers))
    hexcolor = [mcolors.to_hex(c) for c in colors]
    letter = lambda (c,l): "<span style='color:{};'>{}</span>".format(l,c)
    text = " ".join(list(map(letter, zip(chars,hexcolor))))
    text = "<div style='font-size:14pt;font-weight:bold;'>" + text + "</div>"
    display(HTML(text))
    return colors

chars = ['a', 'c', 'm', 'e', 't', 'e', 'l', 'l', 'm', 'e']
vals = ['0.17', '0.062', '0.26', '-0.0799', '-0.449', 
        '-0.746', '-0.812', '-0.844', '-0.865','-0.87']

col = format_chars(chars,vals)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述