在matplotlib中反转色彩映射

Mer*_*moz 216 python matplotlib

我想知道如何简单地反转给定色图的颜色顺序,以便与plot_surface一起使用.

pto*_*ato 408

标准色图也都有反转版本.它们具有相同的名称,_r并在最后添加.(这里的文件.)


Gil*_*les 16

在matplotlib中,颜色映射不是列表,但它包含颜色列表colormap.colors.该模块matplotlib.colors提供了ListedColormap()从列表生成颜色映射的功能.所以你可以通过这样做来反转任何颜色图

colormap_r = ListedColormap(colormap.colors[::-1])
Run Code Online (Sandbox Code Playgroud)

  • +1.但是,这通常不会反转任何色彩映射.只有`ListedColormap`s(即离散,而不是插值)具有`colors`属性.反转`LinearSegmentedColormaps`有点复杂.(你需要反转`_segmentdata`字典中的每一项.) (7认同)
  • 关于反转`LinearSegmentedColormaps`,我只是为一些colourmaps做了这个.[这是关于它的IPython笔记本.](http://nbviewer.ipython.org/github/kwinkunks/notebooks/blob/master/Matteo_colourmaps.ipynb) (3认同)

Jm *_*m M 12

解决方案非常简单.假设您要使用"秋天"色彩映射方案.标准版:

cmap = matplotlib.cm.autumn
Run Code Online (Sandbox Code Playgroud)

要反转色彩图色谱,请使用get_cmap()函数并将'_r'附加到色彩图标题,如下所示:

cmap_reversed = matplotlib.cm.get_cmap('autumn_r')
Run Code Online (Sandbox Code Playgroud)


Mat*_*ijn 11

由于LinearSegmentedColormaps是基于红色,绿色和蓝色的字典,因此必须反转每个项目:

import matplotlib.pyplot as plt
import matplotlib as mpl
def reverse_colourmap(cmap, name = 'my_cmap_r'):
    """
    In: 
    cmap, name 
    Out:
    my_cmap_r

    Explanation:
    t[0] goes from 0 to 1
    row i:   x  y0  y1 -> t[0] t[1] t[2]
                   /
                  /
    row i+1: x  y0  y1 -> t[n] t[1] t[2]

    so the inverse should do the same:
    row i+1: x  y1  y0 -> 1-t[0] t[2] t[1]
                   /
                  /
    row i:   x  y1  y0 -> 1-t[n] t[2] t[1]
    """        
    reverse = []
    k = []   

    for key in cmap._segmentdata:    
        k.append(key)
        channel = cmap._segmentdata[key]
        data = []

        for t in channel:                    
            data.append((1-t[0],t[2],t[1]))            
        reverse.append(sorted(data))    

    LinearL = dict(zip(k,reverse))
    my_cmap_r = mpl.colors.LinearSegmentedColormap(name, LinearL) 
    return my_cmap_r
Run Code Online (Sandbox Code Playgroud)

看它有效:

my_cmap        
<matplotlib.colors.LinearSegmentedColormap at 0xd5a0518>

my_cmap_r = reverse_colourmap(my_cmap)

fig = plt.figure(figsize=(8, 2))
ax1 = fig.add_axes([0.05, 0.80, 0.9, 0.15])
ax2 = fig.add_axes([0.05, 0.475, 0.9, 0.15])
norm = mpl.colors.Normalize(vmin=0, vmax=1)
cb1 = mpl.colorbar.ColorbarBase(ax1, cmap = my_cmap, norm=norm,orientation='horizontal')
cb2 = mpl.colorbar.ColorbarBase(ax2, cmap = my_cmap_r, norm=norm, orientation='horizontal')
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

编辑


我没有收到user3445587的评论.它在彩虹色图上工作正常:

cmap = mpl.cm.jet
cmap_r = reverse_colourmap(cmap)

fig = plt.figure(figsize=(8, 2))
ax1 = fig.add_axes([0.05, 0.80, 0.9, 0.15])
ax2 = fig.add_axes([0.05, 0.475, 0.9, 0.15])
norm = mpl.colors.Normalize(vmin=0, vmax=1)
cb1 = mpl.colorbar.ColorbarBase(ax1, cmap = cmap, norm=norm,orientation='horizontal')
cb2 = mpl.colorbar.ColorbarBase(ax2, cmap = cmap_r, norm=norm, orientation='horizontal')
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

但它特别适用于自定义声明的色彩映射,因为没有_r自定义声明的色彩映射的默认值.以下示例来自http://matplotlib.org/examples/pylab_examples/custom_cmap.html:

cdict1 = {'red':   ((0.0, 0.0, 0.0),
                   (0.5, 0.0, 0.1),
                   (1.0, 1.0, 1.0)),

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

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

blue_red1 = mpl.colors.LinearSegmentedColormap('BlueRed1', cdict1)
blue_red1_r = reverse_colourmap(blue_red1)

fig = plt.figure(figsize=(8, 2))
ax1 = fig.add_axes([0.05, 0.80, 0.9, 0.15])
ax2 = fig.add_axes([0.05, 0.475, 0.9, 0.15])

norm = mpl.colors.Normalize(vmin=0, vmax=1)
cb1 = mpl.colorbar.ColorbarBase(ax1, cmap = blue_red1, norm=norm,orientation='horizontal')
cb2 = mpl.colorbar.ColorbarBase(ax2, cmap = blue_red1_r, norm=norm, orientation='horizontal')
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


Dav*_*sby 9

从Matplotlib 2.0开始,有reversed()一种用于ListedColormapLinearSegmentedColorMap对象的方法,因此您只需

cmap_reversed = cmap.reversed()

是文档。

  • 这是(在我看来)迄今为止最好的答案 (2认同)