421 Stimmen

Umgekehrte Farbzuordnung in Matplotlib

Ich würde gerne wissen, wie man die Farbreihenfolge einer gegebenen Farbkarte einfach umkehren kann, um sie mit plot_surface zu verwenden.

758voto

ptomato Punkte 53719

Die Standard-Farbkarten haben auch alle umgekehrte Versionen. Sie haben die gleichen Namen mit _r am Ende angehängt. ( Dokumentation hier. )

52voto

Jm M Punkte 478

Die Lösung ist ziemlich einfach. Nehmen wir an, Sie möchten das Farbschema "Herbst" verwenden. Die Standardversion:

cmap = matplotlib.cm.autumn

Um das Farbspektrum der Farbkarte umzukehren, verwenden Sie die Funktion get_cmap() und fügen Sie '_r' an den Titel der Farbkarte an, etwa so:

cmap_reversed = matplotlib.cm.get_cmap('autumn_r')

35voto

David Stansby Punkte 1511

Seit Matplotlib 2.0 gibt es eine reversed() Methode für ListedColormap et LinearSegmentedColorMap Objekte, so dass Sie einfach Folgendes tun können

cmap_reversed = cmap.reversed()

Aquí ist die Dokumentation.

31voto

Gilles Punkte 476

In Matplotlib ist eine Farbkarte keine Liste, aber sie enthält die Liste ihrer Farben als colormap.colors . Und das Modul matplotlib.colors bietet eine Funktion ListedColormap() um eine Farbkarte aus einer Liste zu erzeugen. Sie können also jede Farbkarte umkehren, indem Sie

colormap_r = ListedColormap(colormap.colors[::-1])

13voto

Mattijn Punkte 10744

Als LinearSegmentedColormaps auf einem Wörterbuch mit den Farben Rot, Grün und Blau basiert, muss jedes Element umgekehrt werden:

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

Sehen Sie zu, dass es funktioniert:

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')

enter image description here

EDIT


Ich verstehe den Kommentar von user3445587 nicht. Es funktioniert gut auf der Regenbogen-Farbkarte:

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')

enter image description here

Aber es funktioniert besonders gut für benutzerdefinierte Farbkarten, da es keine Standard-Farbkarten gibt. _r für benutzerdefinierte Farbkarten. Das folgende Beispiel stammt aus 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')

enter image description here

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X