Matplotlib Colormap未正确分类数据

Matplotlib Colormap未正确分类数据,matplotlib,plot,ipython,colorbar,Matplotlib,Plot,Ipython,Colorbar,下面是我使用basemap从Geogtiff文件打印数据的脚本。数据是分类的,在这个领域有13个类别。问题是一些类别聚在一起形成一种颜色,因此一些分辨率会丢失。 不幸的是,我不知道如何解决这个问题。我读到plt.cm.get\u cmp更适合离散数据集,但不幸的是,我没有让它工作 gtif = 'some_dir' ds = gdal.Open(gtif) data = ds.ReadAsArray() gt = ds.GetGeoTransform() proj = ds.GetProjec

下面是我使用basemap从Geogtiff文件打印数据的脚本。数据是分类的,在这个领域有13个类别。问题是一些类别聚在一起形成一种颜色,因此一些分辨率会丢失。
不幸的是,我不知道如何解决这个问题。我读到
plt.cm.get\u cmp
更适合离散数据集,但不幸的是,我没有让它工作

gtif = 'some_dir'

ds = gdal.Open(gtif)
data = ds.ReadAsArray()
gt = ds.GetGeoTransform()
proj = ds.GetProjection()
xres = gt[1]
yres = gt[5]

xmin = gt[0] + xres
xmax = gt[0] + (xres * ds.RasterXSize) - xres
ymin = gt[3] + (yres * ds.RasterYSize) + yres
ymax = gt[3] - yres
xy_source = np.mgrid[xmin:xmax+xres:xres, ymax+yres:ymin:yres]
ds = None

fig2 = plt.figure(figsize=[12, 11])
ax2 = fig2.add_subplot(111)
ax2.set_title("Land use plot")
bm2 = Basemap(ax=ax2,projection='cyl',llcrnrlat=ymin,urcrnrlat=ymax,llcrnrlon=xmin,urcrnrlon=xmax,resolution='l')
bm2.drawcoastlines(linewidth=0.2)
bm2.drawcountries(linewidth=0.2)

data_new=np.copy(data)
data_new[data_new==255] = 0

nbins = np.unique(data_new).size
cb =plt.cm.get_cmap('jet', nbins+1)
img2 =bm2.imshow(np.flipud(data_new), cmap=cb)
ax2.set_xlim(3, 6)
ax2.set_ylim(50,53)
plt.show()

labels = [str(i) for i in np.unique(data_new)]
cb2=bm2.colorbar(img2, "right", size="5%", pad='3%', label='NOAH Land Use Category')
cb2.set_ticklabels(labels)
cb2.set_ticks(np.unique(data_new))
以下是在域中找到的类别(编号的类):


非常感谢你的帮助。我还附上了显示不匹配的输出图像。(不起作用)

首先,此颜色映射问题与基本映射的使用无关。因此,以下内容适用于任何matplotlib绘图

这里的问题是,从
n
值创建一个colormap会在colormap范围内均匀分布这些值。因此,图像中的某些值在colormap中属于相同的颜色范围

为了防止出现这种情况,可以生成一个具有初始类别数的颜色映射,如下所示


这可以扩展为排除图像中不存在的颜色,如下所示:


非常感谢您的快速回复!这将起作用,但唯一的问题是,对于我拥有的非常大的数据集(数千个点),嵌套for循环将非常缓慢。有没有一种方法可以对一个非常大的数据集进行优化?我编辑了一个更有效的版本,而不是使用循环。谢谢!有点像我认为可以避免循环的东西。祝你一周愉快!我试过了,但我不确定我能不能与我的声誉水平。或者可能是移动版本也许作为最后的评论,没有办法改变last for循环吗?我仍然遇到速度问题。
np.unique(data_new)

array([ 0,  1,  4,  5,  7, 10, 11, 12, 13, 14, 15, 16, 17], dtype=uint8)
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.colors

# generate some data
data = np.array( [ 0,  1,  4,  5,  7, 10]*8 )
np.random.shuffle(data)
data = data.reshape((8,6))

# generate colormap and norm
unique = np.unique(data)
vals = np.arange(int(unique.max()+1))/float(unique.max())
cols = plt.cm.jet(vals)
cmap = matplotlib.colors.ListedColormap(cols, int(unique.max())+1)
norm=matplotlib.colors.Normalize(vmin=-0.5, vmax=unique.max()+0.5)


fig, ax = plt.subplots(figsize=(5,5))
im = ax.imshow(data, cmap=cmap, norm=norm)
for i  in range(data.shape[0]):
    for j in range(data.shape[1]):
        ax.text(j,i,data[i,j], color="w", ha="center", va="center")

cb = fig.colorbar(im, ax=ax,  norm=norm)
cb.set_ticks(unique)

plt.show()
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.colors

# generate some data
data = np.array( [ 0,  1,  4,  5,  7, 10]*8 )
np.random.shuffle(data)
data = data.reshape((8,6))

unique, newdata = np.unique(data, return_inverse=1)
newdata = newdata.reshape(data.shape)

# generate colormap and norm
new_unique = np.unique(newdata)
vals = np.arange(int(new_unique.max()+1))/float(new_unique.max())
cols = plt.cm.jet(vals)
cmap = matplotlib.colors.ListedColormap(cols, int(new_unique.max())+1)
norm=matplotlib.colors.Normalize(vmin=-0.5, vmax=new_unique.max()+0.5)

fig, ax = plt.subplots(figsize=(5,5))
im = ax.imshow(newdata, cmap=cmap, norm=norm)
for i  in range(newdata.shape[0]):
    for j in range(newdata.shape[1]):
        ax.text(j,i,data[i,j], color="w", ha="center", va="center")

cb = fig.colorbar(im, ax=ax,  norm=norm)
cb.ax.set_yticklabels(unique)

plt.show()