离散 pyplot 散点颜色条

Discrete pyplot scatter colobar

我正在创建一个带有颜色条的散点图

plt.scatter(X, Y, c=Z)
plt.colorbar()
plt.show()
plt.close()

其中 X 和 Y 是浮点数组,Z 是整数数组。 尽管 Z 是一个整数数组(此处为 1-14),但颜色栏显示浮点数。

如何显示离散颜色条 1-14?

我发现了一些试图回答类似问题的东西 here,但我对答案(包含一些使 0 变灰的复杂情况)理解得不够好,无法应用它。

查看 the second answer 您的链接问题。如果您在调用 scatter 之前离散化您的颜色图,它将自动按照您的意愿工作:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cm as cm

n = 14
X = np.random.rand(20)
Y = np.random.rand(20)
Z = np.random.randint(low=0,high=n,size=X.shape)

plt.figure()
plt.scatter(X,Y,c=Z,cmap=cm.hot)
plt.colorbar()

plt.figure()
plt.scatter(X,Y,c=Z,cmap=cm.get_cmap('hot',n))
plt.colorbar()

比较结果:

请注意,默认颜色图是 jet。但直到 viridis 开始 starting from version 2.0 作为新的(而且很棒的)默认值。

如果困扰您的是颜色条上的数字是 floating-point,您可以在其中设置手动 ticks,而不考虑颜色的离散化:

plt.figure()
plt.scatter(X,Y,c=Z,cmap=cm.jet)
plt.colorbar(ticks=np.unique(Z))
#or
#plt.colorbar(ticks=range(Z.min(),Z.max()+1))

结果:

请注意,由于我使用了几个 random-generated 点,并非每个数字都出现在 Z 中,因此 unique 可能不是最好的方法(请参阅上图)。这就是为什么我还添加了基于min/max的解决方案。您可以根据您的实际应用调整您的需求限制。

这是我的土地利用类型的离散颜色条,看起来像你的作品,因为 Z 值也是一个从 1-14 的整数数组。

我的方法

creat the colormap and colorbar label manually learned from here

我的代码

cMap = ListedColormap(['white', '#8dd3c7','#ffffb3','#bebada',  \               
                       '#b2182b','#80b1d3','#fdb462','#b3de69','#6a3d9a',\
                       '#b2df8a', '#1f78b4', '#ccebc5','#ffed6f'])

## If you want to use the colormap from plt.cm..., you can use(take 'jet' for example) 
cMap = plt.cm.get_cmap("jet",lut=13)  

### here you can change your data in    
lulc = plt.pcolormesh(lulc,cmap = cMap,alpha = 0.7)   

z_range = np.linspace(1,14,14)
list = z_range.astype('S10')

k = -0.05
for i in range(0,13,1):
    k = k + 1/13.0
   ax.annotate(list[i],xycoords='axes fraction',xy=(1.12,k),fontsize = 14, \
               fontstyle = 'italic',zorder =3)

cbar = plt.colorbar(lulc,ticks = [ ])
for label in cbar.ax.yaxis.get_ticklabels()[::-1]:
    label.set_visible(False)    

我的结果


(来源:tietuku.com

希望能帮到你!