Python 离散pyplot散斑图

Python 离散pyplot散斑图,python,matplotlib,ipython-notebook,Python,Matplotlib,Ipython Notebook,我正在用颜色条创建散点图 plt.scatter(X, Y, c=Z) plt.colorbar() plt.show() plt.close() 其中X和Y是浮点数组,Z是整数数组。 即使Z是一个整数数组(这里是1-14),颜色栏也会显示浮动。 如何显示离散色条1-14 我发现一些东西试图回答一个类似的问题,但我不太理解这个答案(包含一些使0变成灰色的复杂因素),无法应用它 查看您的链接问题。如果在调用scatter之前对彩色地图进行离散化,它将自动按照您的要求工作: import num

我正在用颜色条创建散点图

plt.scatter(X, Y, c=Z)
plt.colorbar()
plt.show()
plt.close()
其中X和Y是浮点数组,Z是整数数组。 即使Z是一个整数数组(这里是1-14),颜色栏也会显示浮动。

如何显示离散色条1-14

我发现一些东西试图回答一个类似的问题,但我不太理解这个答案(包含一些使0变成灰色的复杂因素),无法应用它

查看您的链接问题。如果在调用
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
作为新的(非常好的)默认值出现之前

如果困扰您的是色条上的数字是浮点数,您可以在其中设置手动
刻度
,而不考虑颜色的离散化:

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
的解决方案。根据实际应用,您可以根据需要定制限制。

这是我的土地使用类型离散色条,它看起来像是您的作品,因为Z值也是1-14之间的整数数组

我的方法 创建从中手动学习的颜色映射和颜色条标签

我的代码 我的成绩
(来源:)


希望它能有所帮助

这似乎正是我所寻找的,但是我尝试的
plt.scatter(X,Y,c=Z,cmap=cm.get_cmap('RdPu',n),s=100,vmin=np.min(Z),vmax=np.max(Z))
产生了一个错误
NameError:name'cm'没有定义
,即使使用
导入matplotlib.cm作为cm
@astromonard也是最不寻常的。您是否尝试过再次打开它?:)您使用的是ipython还是常规python脚本?上面的代码在前者中对我来说很好。无论如何,如果
import
没有抛出任何错误,那么你就不应该得到这个错误。@astromonard哦,我相信
scatter
的默认行为是使用
vmin=np.min(c),vmax=np.max(c)
,这样你就可以省去一些打字:)我错误地标记(并更正)了我正在使用的ipython笔记本(v3.0.0)我重新启动了内核,将头导入其中,现在它可以工作了。为了赢得比赛,你可以一次又一次地关掉它。
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)