将字符串与随机颜色matplotlib匹配的优雅方式

for*_*ect 14 python matplotlib

我想将一些数据的标签转换为颜色,以便使用matplotlib进行绘图

我有一个名单 ["bob", "joe", "andrew", "pete"]

是否有内置方法在matplotlib中使用颜色值映射这些字符串?我想过随机创建十六进制值,但我最终会得到相似的颜色或不可见的颜色.

我尝试了几种不同的尝试从下面的cmap答案创建键值的方法:

这个:

#names is a list of distinct names
cmap = plt.get_cmap('cool')
colors = cmap(np.linspace(0, 1, len(names)))
clr = {names[i]: colors[i] for i in range(len(names))}
ax.scatter(x, y, z, c=clr)
Run Code Online (Sandbox Code Playgroud)

unu*_*tbu 25

选择颜色贴图,例如viridis:

cmap = plt.get_cmap('viridis')
Run Code Online (Sandbox Code Playgroud)

colormap cmap是一个函数,它可以取0到1之间的值数组,并将它们映射到RGBA颜色.np.linspace(0, 1, len(names))产生一个从0到1长度的等间距数字的数组len(names).从而,

colors = cmap(np.linspace(0, 1, len(names)))
Run Code Online (Sandbox Code Playgroud)

viridis颜色图中选择等间距的颜色.

请注意,这不使用字符串的,它仅使用列表中字符串的序号位置来选择颜色.另请注意,这些不是随机颜色,这只是从任意字符串列表生成唯一颜色的简单方法.


所以:

import numpy as np
import matplotlib.pyplot as plt

cmap = plt.get_cmap('viridis')
names = ["bob", "joe", "andrew", "pete"]
colors = cmap(np.linspace(0, 1, len(names)))
print(colors)
# [[ 0.267004  0.004874  0.329415  1.      ]
#  [ 0.190631  0.407061  0.556089  1.      ]
#  [ 0.20803   0.718701  0.472873  1.      ]
#  [ 0.993248  0.906157  0.143936  1.      ]]

x = np.linspace(0, np.pi*2, 100)
for i, (name, color) in enumerate(zip(names, colors), 1):
    plt.plot(x, np.sin(x)/i, label=name, c=color)
plt.legend()
plt.show()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


这个问题

clr = {names[i]: colors[i] for i in range(len(names))}
ax.scatter(x, y, z, c=clr)
Run Code Online (Sandbox Code Playgroud)

是,c参数ax.scatter期望一个序列的长度相同的RGB(A)值的x或单一颜色.clr是一个字典,而不是一个序列.因此,如果colors长度与x您可以使用的相同

ax.scatter(x, y, z, c=colors)
Run Code Online (Sandbox Code Playgroud)


pom*_*ber 5

我使用哈希函数来获取0到1之间的数字,即使您不知道所有标签,也可以使用它:

x = [1, 2, 3, 4, 5]
labels = ["a", "a", "b", "b", "a"]
y = [1, 2, 3, 4, 5]

colors = [float(hash(s) % 256) / 256 for s in labels]      

plt.scatter(x, y, c=colors, cmap="jet")
plt.show()
Run Code Online (Sandbox Code Playgroud)