如何在Python中逐个字符地着色?

时间:2018-01-17 13:26:17

标签: python matplotlib jupyter-notebook seaborn

我想为字符串着色,但字符不同。我有一个带有文本的数组和一个数值介于-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')

我能够生成颜色:

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

结果看起来像这样(它是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...)

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

1 个答案:

答案 0 :(得分:3)

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

解决方案可能如下所示:

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)

enter image description here