matplotlib 合并cmap,创建cmap,创建listedcolormap

python中matplotlib内置的离散cmap中颜色有限,最多的tab20也只有20个颜色,为了获得包含更多颜色的cmap,最简单的方法就是合并内置cmap,创建新的。

这里是考虑的离散cmap,如果是连续cmap,就不存在颜色个数不够用的情况了。

零、需求

如下图所示,内置的qualitative系列包含下列离散cmap,最多只有20种颜色。

鉴于tab20b和tab20c的颜色各不相同,因此考虑合并它们得到一个新的cmap,可以直接用于更多颜色需求的图像绘制。

一、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。

猜你喜欢

转载自blog.csdn.net/me_yundou/article/details/124775566