前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用 matplotlib 自定义Colormap

使用 matplotlib 自定义Colormap

作者头像
bugsuse
发布2020-04-21 17:48:41
3.8K0
发布2020-04-21 17:48:41
举报
文章被收录于专栏:气象杂货铺气象杂货铺

自定义 colormap 通常要使用 matplotlib.colors 模块中提供的函数和方法。 matplotlib.colors 是用来转换数字列表或颜色参数为 RGB 或 RGBA 的模块。RGB 和 RGBA 是具有3个或4个浮点数且数值在 [0, 1] 之间的序列。

创建 colormap 时通常需要以下两步:

  • 使用 Normalize 实例或子类将数据数组归一化为 [0 1]之间的数组
  • 使用 Colormap 子类的实例进行数据和颜色的映射

模块中提供了以下两个函数创建 colormap:

  • LinearSegmentedColormap 所有内置 colormap 实例均由此函数创建,但也可以自定义colormap
  • ListedColormap 从颜色列表创建 colormap

使用 LinearSegmentedColormap 的 from_list 方法创建 colormap

代码语言:javascript
复制
# R, G, B 三色
colors = [(1, 0, 0), (0, 1, 0), (0, 0, 1)]
# 用于进行 colormap 插值,表示 colormap 颜色区间
n_bins = [3, 6, 10, 100]  
# colormap 名
cmap_name = 'my_cmap'
fig, axs = plt.subplots(2, 2, figsize=(6, 9))
fig.subplots_adjust(left=0.02, bottom=0.06, right=0.95, top=0.94, wspace=0.05)
for n_bin, ax in zip(n_bins, axs.ravel()):
    # 创建 colormap
    cm = LinearSegmentedColormap.from_list(
        cmap_name, colors, N=n_bin)
    # n_bin 越小,插值得到的颜色区间越少
    im = ax.imshow(Z, interpolation='nearest', origin='lower', cmap=cm)
    ax.set_title("N bins: %s" % n_bin)
    fig.colorbar(im, ax=ax)
    
 plt.show()    

自定义颜色映射

使用RGB颜色字典定义 colormap,比如:

代码语言:javascript
复制
cdict = {'red':   ((0.0,  0.0, 0.0),
                   (0.5,  1.0, 1.0),
                   (1.0,  1.0, 1.0)),

         'green': ((0.0,  0.0, 0.0),
                   (0.25, 0.0, 0.0),
                   (0.75, 1.0, 1.0),
                   (1.0,  1.0, 1.0)),

         'blue':  ((0.0,  0.0, 0.0),
                   (0.5,  0.0, 0.0),
                   (1.0,  1.0, 1.0))}

cdict 字典中的每一个颜色都是由三个浮点值构成的元组,每一个元组的第2和3个元素均是 y 值,第一个元素是 x,表示在 [0, 1] 之间进行插值的步长,而且必须在[0, 1]之间划分。换句话说就是,x 值将 [0, 1]区间划分为多个小区间,y 表示每一个小区间的末端颜色值。

比如 cdict['green'] 中表示: 0-0.25 之间,绿色值为0,0.25-0.75 之间,绿色值在 [0, 1] 之间线性插值,0.75-1之间,绿色值为 1; cdict['red'] 和 cdict['blue'] 类似。

如果为非连续 colormap,自定义时会稍微复杂一些,而且不能很好的掌握颜色的设置。x[i] 和 x[i+1]之间的 x 值在 y1[i] 和 y0[i+1] 之间进行插值。

代码语言:javascript
复制
row i:   x    y0    y1                
                /               
               /         
row i+1: x    y0  y1

x[i] 和 x[i+1] 范围内的 x 值均插值为 y1[i] 和 y0[i+1] 间的值,因此,y0[0] 和 y1[-1] 是不会用到的,也就是说这两个值对结果没有影响。

下面使用 LinearSegmentedColormap 创建 colormap,并使用 register_cmap 注册定义的 colormap

代码语言:javascript
复制
blue_red = LinearSegmentedColormap('BlueRed', cdict)
plt.register_cmap(cmap=blue_red)

使用 ListedColormap 自定义 colormap

创建十六进制颜色索引列表,然后利用 ListedColormap 函数创建 colormap,并进行注册:

代码语言:javascript
复制
from matplotlib import cm, colors

cdict= ["#FFFFFF","#98F5FF","#87CEEB","#00FF00",\
        "#008B00","#FFFF00","#FFA500","#FF8C00",\
        "#FF0000","#AF0000","#8B0000","#FF00FF",\
        "#8A2BE2","#360CF9"]

cmaps = colors.ListedColormap(cdict,'indexed')
cm.register_cmap(name = 'dbzcmap',data = cdict,lut = 128)

使用 RGB 字典进行颜色定义可能没有直接使用十六进制颜色来创建 colormap 更直观且易理解。当然自定义 colormap 的方式很多,而且都能达到要求。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-03-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 气象杂货铺 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档