离散 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)
希望能帮到你!
我正在创建一个带有颜色条的散点图
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)
希望能帮到你!