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)
我使用哈希函数来获取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)