离散的pyplot散点图颜色条

4
我正在创建一个带有色条的散点图。
plt.scatter(X, Y, c=Z)
plt.colorbar()
plt.show()
plt.close()

X和Y是浮点数组,Z是整数数组。尽管Z是整数数组(范围为1-14),但色条显示浮点数。如下图所示:enter image description here

我该如何显示一个离散的1-14颜色条?

我找到了一个类似问题的答案,链接在这里,但我不理解其中的复杂性,无法应用它。

2个回答

4

请查看您所链接问题的第二个答案:https://dev59.com/xGUq5IYBdhLWcg3wHcz5#14777392。如果在调用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。但是自从版本2.0开始,viridis成为了新的(美妙的)默认值

如果您困扰的是颜色条上的数字是浮点数,则可以在其中设置手动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的解决方案。您可以根据实际应用程序调整限制。


这似乎是我正在寻找的内容,但是我的尝试 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' is not defined,即使使用了 import matplotlib.cm as cm - astromonerd
@astromonerd 这很不寻常。你试过关掉再打开吗?:) 你是在使用ipython还是普通的python脚本?我在前者中使用上述代码没有问题。无论如何,如果“import”没有抛出任何错误,那么你就不应该遇到那个错误。 - Andras Deak -- Слава Україні
@astromonerd 噢,我相信 scatter 的默认行为是使用 vmin=np.min(c),vmax=np.max(c),所以你可以省略一些打字的工作 :) - Andras Deak -- Слава Україні
我误标记了(并进行了更正),我正在使用ipython-notebook(v 3.0.0)。 - astromonerd
我重新启动了导入头文件的内核,现在它可以工作了。重启解决问题! - astromonerd
@astromonerd 很高兴听到这个消息,感谢您的反馈 :) - Andras Deak -- Слава Україні

0

这是我为土地利用类型创建的离散色条,它看起来像是你的工作,因为Z值也是从1到14的整数数组。

我的方法

手动创建颜色映射和颜色条标签,从这里学习

我的代码

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)

希望能有所帮助!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接