Python matplotlib手册颜色映射

3
我有一些二维的数据需要使用matplotlib basemap在python中进行绘图。这些数据的值的范围从0到1000以上不等。是否可以创建具有固定分级和颜色的手动颜色映射?它应该看起来像:
对于数值 - 设置颜色
- 0-1 - 白色 - 1-5 - 深绿色 - 5-10 - 浅绿色 - 10-25 - 黄色 - 25-50 - 棕色 - 50-100 - 橙色 - 100-500 - 浅红色 - 500-1000 - 暗红色 - > 1000 - 紫色
我刚开始接触Python,所以欢迎任何建议。

我没有提到数据是以grib文件形式存在,并且具有适当的经纬度坐标。因此,我需要在经纬度地图上手动绘制它们的颜色条(就像我上面指定的那样)。 - Alexander Kurganskiy
2个回答

6

恰恰是你想要的。

不过,你需要输入它的方式有点令人困惑,因此这个可能更有帮助。

要获取大于1000的部分,你需要掩码值超过1000并让其余比例从0-1000。

from matplotlib.colors import LinearSegmentedColormap
cMap = []
for value, colour in zip([0,1,5,10,25,50,100,500,1000],["White", "DarkGreen", "LightGreen", "Yellow", "Brown", "Orange", "IndianRed", "DarkRed", "Purple"]):
    cMap.append((value/1000.0, colour))

customColourMap = LinearSegmentedColormap.from_list("custom", cMap)

这是创建自定义色图所需的全部内容。只需将其作为命名参数传递给plot函数(无论您使用哪个函数),即可使用它。
下面是示例:enter image description here

@will,如果我有一个连续函数,我该怎么使用它(而不是将其分段采样)? - undefined
@Royi - 我觉得没有办法在某种程度上不进行取样就完成这个任务 - 你总是需要有节点来将两者连接在一起。 - undefined
@will,我可以创建一个伪连续函数,这样对于[0, 1]中的每个值,它都会生成一个三元组。似乎没有适用于这种情况的包装器。我猜你可以继承colormap类?只是我不知道怎么做... - undefined
@Royi 我会创建一个函数,该函数会在任意分辨率上对你的连续函数进行采样,并为着色函数创建停止点。你希望它连续的原因是什么? - undefined
@will,你提出的建议是可行的。我想要的是一个可调用的函数,这样就不是在两个点之间进行插值,而是可以直接计算出解决方案。 - undefined
显示剩余5条评论

0
应该可以像这样工作:
from matplotlib import pyplot
from matplotlib.colors import LinearSegmentedColormap

def create_cmap(data, colours, stops=None):
    min_x = min(data)
    max_x = max(data)
    
    if stops is not None:
        min_x = min(min_x, min(stops))
        max_x = max(max_x, max(stops))
    
    if stops is None:
        d_x = (max_x - min_x)/(len(colours)-1)
        stops = [min_x + i*d_x for i in range(len(colours))]
    
    if min_x < min(stops):
        stops = [min_x] + stops
        colours = [colours[0]] + colours
        
    if max_x > max(stops):
        stops = stops + [max_x]
        colours = colours + [colours[-1]]
    
    stops = [(s-min_x)/(max_x-min_x) for s in stops]
    
    cmap_data = list(zip(stops, colours))
    cmap = LinearSegmentedColormap.from_list('continuous_map', cmap_data)
    
    def cmap_wrapper(x):
        x = max(min_x, min(x, max_x))
        x_n = (x-min_x)/(max_x-min_x)
        return cmap(x_n)
    
    return cmap_wrapper



colours = ['xkcd:white', 'xkcd:darkgreen', 'xkcd:lightgreen', 'xkcd:yellow', 'xkcd:brown', 'xkcd:orange', 'xkcd:coral', 'xkcd:crimson', 'xkcd:purple']
stops = [0, 1, 5, 10, 25, 50, 100, 500, 1000]

cmap = create_cmap(stops, colours, stops=stops)

fig = pyplot.figure(figsize=(10,10))
ax = fig.add_subplot(1,1,1)

for y in range(1000):
    ax.plot([0,1],[y,y],c=cmap(y))
    
pyplot.show()

enter image description here


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