有没有办法保存自定义 matplotlib 颜色条以在其他地方使用?

tsh*_*wen 5 python matplotlib colormap

有没有办法将自定义maplotlib颜色图 ( matplotlib.cm)保存为文件(例如,调色板文件 ( .cpt),就像在 MATLAB 中使用的那样)以供共享,然后在其他程序中使用?(例如Panopoly , MATLAB ...)

例子

下面LinearSegmentedColormap是通过修改现有颜色图(通过截断,如此处链接的另一个问题中所示)制作的新颜色

import matplotlib
import matplotlib.pyplot as plt
import numpy as np

# Get an existing colorbar
cb = 'CMRmap'
cmap = plt.get_cmap( cb )

# Variables to modify (truncate) the colormap with
minval = 0.15 
maxval = 0.95
npoints = 100 

# Now modify (truncate) the colorbar
cmap = matplotlib.colors.LinearSegmentedColormap.from_list( 
    'trunc({n},{a:.2f},{b:.2f})'.format(n=cmap.name, a=minval,
    b=maxval), cmap(np.linspace(minval, maxval, npoints)))

# Now the data can be extracted as a dictionary
cdict = cmap._segmentdata

# e.g. variables ('blue', 'alpha', 'green', 'red')
print( cdict.keys() )

# Now, is it possible to save to this as a .cpt?
Run Code Online (Sandbox Code Playgroud)

更多详情

我知道在 matplotlib 中加载外部颜色图的方法(例如显示在这里这里)。

来自NASA GISS 的Panoply文档

调色板表 (CPT) 表示通用映射工具程序使用的调色板格式。该格式定义了颜色条极值之间的多个纯色和/或渐变带,而不是有限数量的不同颜色。

Imp*_*est 2

以下是一个函数,它将颜色图、一些限制 (vminvmax) 以及颜色数量作为输入,并从中创建一个 cpt 文件。

import matplotlib.pyplot as plt
import numpy as np

def export_cmap_to_cpt(cmap, vmin=0,vmax=1, N=255, filename="test.cpt",**kwargs):
    # create string for upper, lower colors
    b = np.array(kwargs.get("B", cmap(0.)))
    f = np.array(kwargs.get("F", cmap(1.)))
    na = np.array(kwargs.get("N", (0,0,0))).astype(float)
    ext = (np.c_[b[:3],f[:3],na[:3]].T*255).astype(int)
    extstr = "B {:3d} {:3d} {:3d}\nF {:3d} {:3d} {:3d}\nN {:3d} {:3d} {:3d}"
    ex = extstr.format(*list(ext.flatten()))
    #create colormap
    cols = (cmap(np.linspace(0.,1.,N))[:,:3]*255).astype(int)
    vals = np.linspace(vmin,vmax,N)
    arr = np.c_[vals[:-1],cols[:-1],vals[1:],cols[1:]]
    # save to file
    fmt = "%e %3d %3d %3d %e %3d %3d %3d"
    np.savetxt(filename, arr, fmt=fmt, 
               header="# COLOR_MODEL = RGB",
               footer = ex, comments="")

# test case: create cpt file from RdYlBu colormap
cmap = plt.get_cmap("RdYlBu",255)
# you may create your colormap differently, as in the question

export_cmap_to_cpt(cmap, vmin=0,vmax=1,N=20)
Run Code Online (Sandbox Code Playgroud)

生成的文件看起来像

# COLOR_MODEL = RGB
0.000000e+00 165   0  38 5.263158e-02 190  24  38
5.263158e-02 190  24  38 1.052632e-01 215  49  39
1.052632e-01 215  49  39 1.578947e-01 231  83  55
1.578947e-01 231  83  55 2.105263e-01 244 114  69
2.105263e-01 244 114  69 2.631579e-01 249 150  86
2.631579e-01 249 150  86 3.157895e-01 253 181 104
3.157895e-01 253 181 104 3.684211e-01 253 207 128
3.684211e-01 253 207 128 4.210526e-01 254 230 153
4.210526e-01 254 230 153 4.736842e-01 254 246 178
4.736842e-01 254 246 178 5.263158e-01 246 251 206
5.263158e-01 246 251 206 5.789474e-01 230 245 235
5.789474e-01 230 245 235 6.315789e-01 206 234 242
6.315789e-01 206 234 242 6.842105e-01 178 220 235
6.842105e-01 178 220 235 7.368421e-01 151 201 224
7.368421e-01 151 201 224 7.894737e-01 120 176 211
7.894737e-01 120 176 211 8.421053e-01  96 149 196
8.421053e-01  96 149 196 8.947368e-01  70 118 180
8.947368e-01  70 118 180 9.473684e-01  59  86 164
9.473684e-01  59  86 164 1.000000e+00  49  54 149
B 165   0  38
F  49  54 149
N   0   0   0
Run Code Online (Sandbox Code Playgroud)

并将采用所需的格式。