Colormap未正确分类数据

时间:2017-03-10 16:22:33

标签: matplotlib plot ipython colorbar

这是我使用底图绘制Geogtiff文件数据的脚本。数据是分类的,该域名中有13个类别。问题是某些类别会聚集成一种颜色,因此会丢失一些分辨率 不幸的是,我不知道如何解决这个问题。我读到plt.cm.get_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))

以下是域名(编号类)中的类别:

np.unique(data_new)

array([ 0,  1,  4,  5,  7, 10, 11, 12, 13, 14, 15, 16, 17], dtype=uint8)

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

1 个答案:

答案 0 :(得分:1)

首先,此色彩映射问题与底图的使用无关。因此,以下适用于任何matplotlib图。

此处的问题是,从n值创建色彩映射会在色彩映射范围内平均分配这些值。因此,图像中的某些值落入色彩映射中的相同颜色范围内。

为了防止这种情况,可以生成具有初始类别数的色彩映射表,如下所示。

enter image description here

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()

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

enter image description here

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()