发布时间:2023-10-29 08:00
python中matplotlib内置的离散cmap中颜色有限,最多的tab20也只有20个颜色,为了获得包含更多颜色的cmap,最简单的方法就是合并内置cmap,创建新的。
这里是考虑的离散cmap,如果是连续cmap,就不存在颜色个数不够用的情况了。
如下图所示,内置的qualitative系列包含下列离散cmap,最多只有20种颜色。
鉴于tab20b和tab20c的颜色各不相同,因此考虑合并它们得到一个新的cmap,可以直接用于更多颜色需求的图像绘制。
1. 函数get_cmap()通过指定str,获取相应cmap:
2. cmap实例其实类似于一个字典,以float形式输入[0, 1]之间的数字,能够得到对应的颜色rgba值(输入数字如果大于1,cmap会自动对其进行正则化)。
由于离散cmap中颜色个数有限,实际上一定范围内的float值对应的颜色是一样的。
3. 使用cmap.colors可以获得该cmap中包含的所有颜色的rgb值。
可以看出cmap中所有colors是以tuple的形式保存的。
4. cmap是ListedColormap实例,因此我们创建新的cmap也要借助该类型。
ListedColormap类可以通过接收一个colors的列表来创建cmap实例,因此考虑将合并后的总colors传给ListedColormap类,以此实现新cmap的创建。
上述代码可以看出,新创建的cmap拥有和内置cmap一样的性质和属性。
下面给出完整代码,运行下面代码,新创建的new_cmap能够和内置cmap一样直接在scatter等画图函数中直接使用。
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
import numpy as np
cmap1 = plt.get_cmap(\'tab20b\')
cmap2 = plt.get_cmap(\'tab20c\')
new_cmap = ListedColormap(cmap1.colors+cmap2.colors)
x = np.random.random([40, 2])
cluster_labels = np.arange(40)
plt.figure(figsize=[12, 8])
plt.scatter(x[:, 0], x[:, 1], s=500, c=cluster_labels, cmap=new_cmap, marker=\'o\', linewidths=2)
plt.colorbar()
plt.show()
上述代码运行结果如下,可以看出,40个数据点颜色各不相同,实现了对两个内置cmap的合并。
如果需要更多颜色,可以自行合并想要的内置cmap,创建新的可用cmap。