使用色图
原则上,RGB值矩阵就是一种色图。在 matplotlib 中使用色图来绘制图表是有意义的。但这里稍微复杂一些的是,这些值的间距并不均匀。因此,一个想法是将它们映射为从 0 开始的整数。然后用这些值创建一个色图,并使用 BoundaryNorm 将其与之配合以获得等间隔的颜色条。最后,可以将颜色条的刻度标签设置回初始值。
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.colors
a =np.array([[156, 138, 156],
[1300, 137, 156],
[138, 138, 1300],
[137, 137, 137]])
ca = np.array([[156,200,200,200],
[138,170,255,245],
[137,208,130,40],
[1300,63,165,76]])
u, ind = np.unique(a, return_inverse=True)
b = ind.reshape((a.shape))
colors = ca[ca[:,0].argsort()][:,1:]/255.
cmap = matplotlib.colors.ListedColormap(colors)
norm = matplotlib.colors.BoundaryNorm(np.arange(len(ca)+1)-0.5, len(ca))
plt.imshow(b, cmap=cmap, norm=norm)
cb = plt.colorbar(ticks=np.arange(len(ca)))
cb.ax.set_yticklabels(np.unique(ca[:,0]))
plt.show()
绘制RGB数组
您可以从数据中创建一个RGB数组,直接作为imshow
进行绘制。为此,您可以使用来自颜色数组的颜色对原始数组进行索引,并重塑生成的数组,使其处于适合使用imshow绘图的正确形状。
![输入图像描述](https://istack.dev59.com/3z84B.webp)
import numpy as np
import matplotlib.pyplot as plt
a =np.array([[156, 138, 156],
[1300, 137, 156],
[138, 138, 1300],
[137, 137, 137]])
ca = np.array([[156,200,200,200],
[138,170,255,245],
[137,208,130,40],
[1300,63,165,76]])
u, ind = np.unique(a, return_inverse=True)
c = ca[ca[:,0].argsort()][:,1:]/255.
b = np.moveaxis(c[ind][:,:,np.newaxis],1,2).reshape((a.shape[0],a.shape[1],3))
plt.imshow(b)
plt.show()
结果与上述相同,但没有颜色条(因为此处没有要映射的数量)。
imshow
会导致对数据的错误理解,因为我将其与某种连续性联系起来。我更喜欢使用非常大的点来传达数据的离散性,因此我更倾向于使用scatter
。如果您同意,我可以发布另一个答案,使用scatter
。请让我知道您是否有兴趣。 - gboffiimshow
)_暗示_您正在表示一个连续的、通常可微分的场——另一方面,据我所知,您的数据是离散的,离散数据经常使用scatter
显示,颜色代表_z_值。 - gboffi