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