我正在创建一个带有颜色条的散点图
plt.scatter(X, Y, c=Z)
plt.colorbar()
plt.show()
plt.close()
其中X和Y是浮点数组,Z是整数数组。 即使Z是整数数组(此处为1-14),颜色条也会显示浮点数。
如何显示离散色条1-14?
我发现了一些试图回答类似问题的问题here,但我不明白答案(包含一些使0为灰色的并发症)足以应用它。
答案 0 :(得分:3)
查看关联问题的the second answer。如果您在调用scatter
之前将您的colourmap离散化,它将自动按您的意愿运行:
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()
比较结果:
请注意,默认的colourmap是jet
。但只有viridis
才会starting from version 2.0作为新的(和精彩的)默认值。{/ p>
如果困扰您的是数字是彩色条上的浮点数,您可以在其中设置手动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))
结果:
请注意,由于我使用了一些随机生成的点,并非Z
中存在每个数字,因此unique
可能不是最佳方法(请参见上图中缺少的刻度)。这就是为什么我还添加了基于min/max
的解决方案。您可以根据实际应用定制您的需求限制。
答案 1 :(得分:0)
这是我的土地使用类型的离散颜色栏,它看起来像你的工作,因为Z值也是1-14的整数数组。
创建从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)