2010-07-30 9 views
87

Ich habe den folgenden Code:Set Colorbar Bereich in matplotlib

import matplotlib.pyplot as plt 

cdict = { 
    'red' : ((0.0, 0.25, .25), (0.02, .59, .59), (1., 1., 1.)), 
    'green': ((0.0, 0.0, 0.0), (0.02, .45, .45), (1., .97, .97)), 
    'blue' : ((0.0, 1.0, 1.0), (0.02, .75, .75), (1., 0.45, 0.45)) 
} 

cm = m.colors.LinearSegmentedColormap('my_colormap', cdict, 1024) 

plt.clf() 
plt.pcolor(X, Y, v, cmap=cm) 
plt.loglog() 
plt.xlabel('X Axis') 
plt.ylabel('Y Axis') 

plt.colorbar() 
plt.show() 

So ergibt sich ein Graph der 'v' Werte auf den Achsen X vs Y, die angegebene colormap verwenden. Die X- und Y-Achsen sind perfekt, aber die colormap Pannen zwischen min und max von v I das colormap erzwingen möchte liegen im Bereich zwischen 0 und 1.

I daran gedacht, mit:.

plt.axis(...) 

Um die Bereiche der Achsen festzulegen, werden nur die Argumente für die Min- und Max-Werte von X und Y verwendet, nicht die Farbpalette.

Edit:

Aus Gründen der Klarheit, lassen Sie uns sagen, dass ich einen Graphen, dessen Werte liegen haben (0 ... 0,3) und einen weiteren Graphen, dessen Werte (0,2 ... 0,8).

In beiden Graphen möchte ich den Bereich der Farbbalken (0 ... 1) sein. In beiden Graphen möchte ich, dass dieser Farbbereich identisch ist, wobei der gesamte obige cdict-Bereich verwendet wird (so dass 0,25 in beiden Graphen die gleiche Farbe haben wird). In der ersten Grafik werden alle Farben zwischen 0.3 und 1.0 nicht im Diagramm angezeigt, sondern in der Farbleisten-Taste an der Seite. In der anderen werden alle Farben zwischen 0 und 0,2 und zwischen 0,8 und 1 nicht im Diagramm erscheinen, sondern in der Farbleiste an der Seite.

Antwort

114

Mit vmin und vmax wird der Bereich für die Farben erzwungen. Hier ein Beispiel:

enter image description here

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

cdict = { 
    'red' : ((0.0, 0.25, .25), (0.02, .59, .59), (1., 1., 1.)), 
    'green': ((0.0, 0.0, 0.0), (0.02, .45, .45), (1., .97, .97)), 
    'blue' : ((0.0, 1.0, 1.0), (0.02, .75, .75), (1., 0.45, 0.45)) 
} 

cm = m.colors.LinearSegmentedColormap('my_colormap', cdict, 1024) 

x = np.arange(0, 10, .1) 
y = np.arange(0, 10, .1) 
X, Y = np.meshgrid(x,y) 

data = 2*(np.sin(X) + np.sin(3*Y)) 

def do_plot(n, f, title): 
    #plt.clf() 
    plt.subplot(1, 3, n) 
    plt.pcolor(X, Y, f(data), cmap=cm, vmin=-4, vmax=4) 
    plt.title(title) 
    plt.colorbar() 

plt.figure() 
do_plot(1, lambda x:x, "all") 
do_plot(2, lambda x:np.clip(x, -4, 0), "<0") 
do_plot(3, lambda x:np.clip(x, 0, 4), ">0") 
plt.show() 
10

nicht sicher, ob dies die eleganteste Lösung ist (das ist, was ich verwendet), aber Sie können Ihre Daten auf den Bereich zwischen 0 und 1 und ändern Sie dann die colorbar maßstabs:

import matplotlib as mpl 
... 
ax, _ = mpl.colorbar.make_axes(plt.gca(), shrink=0.5) 
cbar = mpl.colorbar.ColorbarBase(ax, cmap=cm, 
         norm=mpl.colors.Normalize(vmin=-0.5, vmax=1.5)) 
cbar.set_clim(-2.0, 2.0) 

Mit den beiden verschiedene Grenzen können Sie den Bereich und die Legende der Farbleiste steuern. In diesem Beispiel wird nur der Bereich zwischen -0,5 und 1,5 in der Leiste angezeigt, während die Farbabbildung zwischen -2 und 2 liegt (dies könnte also Ihr Datenbereich sein, den Sie vor der Skalierung aufnehmen).

Anstatt die Farbskala zu skalieren, skalieren Sie Ihre Daten und passen die Farbleiste an diese an.

+1

Ich denke, das ist etwas, auf subtile Weise anders tut ... sorry ich war wahrscheinlich nicht genau genug in meiner Frage. Ihre Lösung wird die Farben so skalieren, dass das, was früher den Wert 1,0 darstellt, jetzt den maximalen Wert in meinen Daten darstellt. Die Farbleiste zeigt 0..1, wie ich es brauche (mit vmin = 0, vmax = 1), aber alles über diesem maximalen Wert wird die gleiche Farbe haben ... – Paul

+1

... Ich habe meine Frage aktualisiert, um zu zeigen, was Ich bin klar hinterher. Entschuldigung, wenn ich zu vage war. – Paul

+0

Ihre Antwort hat mir geholfen, mein Problem zu lösen! – punyidea

39

Verwenden Sie die CLIM Funktion (entspricht CAXIS Funktion in MATLAB):

plt.pcolor(X, Y, v, cmap=cm) 
plt.clim(-4,4) 
plt.show() 
+1

Ich glaube, clim() skaliert die Farbachsen, aber die Farben selbst ändern die Werte. Der Punkt bei einem bestimmten Bruchteil der Skala hat die gleiche Farbe, unabhängig von der Skalierung, aber der Wert, den er repräsentiert, ändert sich. – Paul

Verwandte Themen