Python Matplotlib创建自定义色标

时间:2017-10-26 14:12:00

标签: python-2.7 matplotlib python-iris

我根据NetCDF文件中的降水数据创建了一个区域的降水量图。我想添加一个自定义比例,如果降水量小于800毫米,它将是一种颜色,800-1000mm另一种颜色等。类似于此处的地图:http://www.metmalawi.com/climate/climate.php

目前我正在使用渐变比例,但它并没有显示我需要的细节。这是目前情节的代码(其中'平均值'是我已经格式化的数据)。

    #load color palette
    colourA = mpl_cm.get_cmap('BuPu')

    #plot map with physical features 
    ax = plt.axes(projection=cartopy.crs.PlateCarree())
    ax.add_feature(cartopy.feature.COASTLINE)   
    ax.add_feature(cartopy.feature.BORDERS)
    ax.add_feature(cartopy.feature.LAKES, alpha=0.5)
    ax.add_feature(cartopy.feature.RIVERS)

    #set map boundary
    ax.set_extent([32.5, 36., -9, -17]) 

    #set axis tick marks
    ax.set_xticks([33, 34, 35]) 
    ax.set_yticks([-10, -12, -14, -16]) 
    lon_formatter = LongitudeFormatter(zero_direction_label=True)
    lat_formatter = LatitudeFormatter()
    ax.xaxis.set_major_formatter(lon_formatter)
    ax.yaxis.set_major_formatter(lat_formatter)

    #plot data and set colour range
    plot = iplt.contourf(Average, cmap=colourA, levels=np.arange(0,15500,500), extend='both')

    #add colour bar index and a label
    plt.colorbar(plot, label='mm per year')

    #give map a title
    plt.title('Pr 1990-2008 - Average_ERAINT ', fontsize=10)

    #save the image of the graph and include full legend
    plt.savefig('ERAINT_Average_Pr_MAP_Annual', bbox_inches='tight')

    plt.show()

任何人都知道我该怎么做?

谢谢!

1 个答案:

答案 0 :(得分:0)

这是一个伪装成Iris问题的matplotlib问题,因为问题已经通过Iris绘图程序出现,但要回答这个问题,我们只需要几个matplotlib命令。因此,我的答案基于matplotlib gallery example。这些是levels(包含每个轮廓上限的值)和colors(指定用于遮蔽每个轮廓的颜色)。如果有相同数量的级别和颜色,那就最好。

为了证明这一点,我将以下示例放在一起。鉴于没有提供样本数据,我制作了自己的三角数据。级别基于三角数据值,因此不会反映问题中所需的级别,但可以更改为原始级别。使用的颜色是问题链接中图像指定的级别的十六进制值。

代码:

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(-25, 25)
y = np.arange(-20, 20)
x2d, y2d = np.meshgrid(x, y)
vals = (3 * np.cos(x2d)) + (2 * np.sin(y2d))

colours = ['#bf8046', '#df9f24', '#e0de30', '#c1de2d', '#1ebf82',
           '#23de27', '#1dbe20', '#11807f', '#24607f', '#22427e']
levels = range(-5, 6)

plt.contourf(vals, levels=levels, colors=colours)
plt.colorbar()
plt.show()

制作的图片:

Example levelled/coloured contour plot

也可以从色彩图中选择颜色(这样做的一种方式显示为in this StackOverflow answer)。还有其他方法,包括上面链接的matplotlib库示例。但是,考虑到问题中链接的样本地图有特定的颜色,我选择直接使用这些颜色。