Python Matploblib imshow,带有自定义颜色贴图(例如,自定义贴图和自定义缩放)

Python Matploblib imshow,带有自定义颜色贴图(例如,自定义贴图和自定义缩放),python,matplotlib,colors,Python,Matplotlib,Colors,我在试图让imshow使用自定义“增强”功能(如自定义彩色地图)绘制数据时,已经绞尽脑汁。我使用的是预先确定的配色方案,有预先确定的比例,所以我没有想出这种疯狂的颜色/比例组合 简而言之,我有一个十六进制列表,列出了制作自定义颜色贴图所需的颜色,以及相关的比例: colors = ['#000000', '#060606', '#4b4b4b', '#707070', '#404040', '#707070', '#a0a0a0', '#000000', '#ffffff', '#888888'

我在试图让imshow使用自定义“增强”功能(如自定义彩色地图)绘制数据时,已经绞尽脑汁。我使用的是预先确定的配色方案,有预先确定的比例,所以我没有想出这种疯狂的颜色/比例组合

简而言之,我有一个十六进制列表,列出了制作自定义颜色贴图所需的颜色,以及相关的比例:

colors = ['#000000', '#060606', '#4b4b4b', '#707070', '#404040', '#707070', '#a0a0a0', '#000000', '#ffffff', '#888888', '#585858']

scale = [0, 59, 68, 97, 175, 188, 199, 209, 215, 221, 226]
正如你所看到的,我的比例不接近线性。这似乎是临时编的

不管怎样,我对matplotlib还是有点陌生,我很难从树上看到森林,也很难找到一个: 1个自定义颜色贴图,考虑到其不是线性或指数 2将自定义颜色贴图映射到这个愚蠢的不规则比例 3在imshow中绘制它

为了记录在案,我正在使用basemap在图像下绘制海岸线/国家等。这是一张气象卫星图像,供关心的人使用

我开始使用colors.ListedColorMap,但这给了我一个均匀分布的colormap。不用说,下面为简洁而缩短的代码块会生成一个均匀缩放的彩色贴图,在图像上重复多次,使图像无法读取:

enhancement_colormap = matplotlib.colors.ListedColormap(colors)
m = Basemap(projection='geos', lon_0=sat_lon, resolution='i', area_thresh=1000, llcrnrx=X1.min(),llcrnry=Y1.min(), urcrnrx=X1.max(),urcrnry=Y1.max())
m.imshow(np.flipud(data1),cmap=enhancement_colormap)
关于如何结合定制的彩色地图和比例,并让它在imshow中绘图,有什么想法吗?如果我的挫败感使我无法给出一个简单的答案,我向你道歉


谢谢

因此您需要指定颜色的间隔。这可以使用BoundaryNorm轻松完成,但需要知道colormap的最大值

假设最大值为250,我们可以将其添加到比例中,这样这个列表现在表示区间边界。因此,比例有一个元素多于颜色


您想要一个离散的颜色贴图,即只有列表中的那些颜色出现在贴图中,还是一些颜色之间有渐变的连续贴图?此外,显示的数据是否严格在范围[0226]内?简言之,给定列表和规模,期望的输出是什么?好问题。显然,我只想要那11种颜色,不使用渐变。数据的范围实际上在0-250之间,范围的顶部似乎有点波动,第一个颜色000000表示0-59范围,585858表示226+的任何值。我应该澄清一下。道歉!虽然渐变贴图看起来会更好…但是做这两种贴图的方法有那么大的不同吗?这太棒了!完美的当我这么做的时候,有没有办法“渐变”缩放比例值之间的不均匀比例?我以前在contourf中用numpy linspace做过这个…我只是对如何正确地将该逻辑导入到imshow中感到困惑…对不起,我不知道“渐变”是什么意思缩放值之间的不均匀缩放意味着什么。
import matplotlib.pyplot as plt
import matplotlib.colors
import numpy as np

colors = ['#000000', '#060606', '#4b4b4b', '#707070', '#404040', '#707070', 
          '#a0a0a0', '#000000', '#ffffff', '#888888', '#585858']

scale = [0, 59, 68, 97, 175, 188, 199, 209, 215, 221, 226, 250]

cmap=matplotlib.colors.ListedColormap(colors)
norm=matplotlib.colors.BoundaryNorm(scale, len(colors))

data = np.atleast_2d(np.arange(250))
plt.imshow(data, aspect="auto", cmap=cmap, norm=norm)

plt.show()