2010-07-30 12 views
87

Mam następujący kod:Set Colorbar klasy w 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() 

Więc ta produkuje wykres wartości „V” na osi X vs Y, przy użyciu określonego colormap. X i Y są doskonałe, ale colormap rozciąga się pomiędzy minimum i maksimum, na p ja jak wymusić colormap się w przedziale od 0 do 1.

mi, że zastosowania.

plt.axis(...) 

Aby ustawić zakresy osi, ale to bierze tylko argumenty dla min i maksimum X i Y, a nie mapy kolorów.

Edit:

Dla jasności, powiedzmy, że mam jeden wykres, którego wartości w przedziale (0 ... 0,3), a kolejny wykres, którego wartości (0,2 ... 0,8).

Na obu wykresach będę potrzebował zakresu paska koloru (0 ... 1). Na obu wykresach chcę, aby ten zakres kolorów był identyczny, używając pełnego zakresu cdict (powyżej 0,25 na obu wykresach będzie tego samego koloru). Na pierwszym wykresie wszystkie kolory w zakresie od 0,3 do 1,0 nie zostaną uwzględnione na wykresie, ale będą widoczne na klawiaturze z boku. Z kolei wszystkie kolory od 0 do 0,2 oraz od 0,8 do 1 nie będą widoczne na wykresie, ale będą widoczne na pasku z boku.

Odpowiedz

114

Używanie vmin i vmax wymusza zakres kolorów. Oto przykład:

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

Nie wiem, czy jest to najbardziej eleganckie rozwiązanie (to co kiedyś), ale można skalować dane z zakresu od 0 do 1, a następnie zmodyfikować colorbar:

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) 

z dwoma różne ograniczenia pozwalają kontrolować zakres i legendę paska kolorów. W tym przykładzie tylko zakres od -0,5 do 1,5 jest wyświetlany na pasku, podczas gdy bargraf pokrywa 2 do 2 (więc może to być twój zakres danych, który zapisujesz przed skalowaniem).

Zamiast skalować mapy kolorów, przeskaluj dane i dopasuj do nich pasek kolorów.

+1

myślę, że robi coś subtelnie inny ... Przepraszam, że prawdopodobnie nie był wystarczająco precyzyjny w moim pytaniu. Twoje rozwiązanie przeskaluje kolory tak, że to, co kiedyś reprezentowało wartość 1.0, będzie teraz reprezentować maksymalną wartość w moich danych. Kolor paska pokaże 0..1 tak jak tego potrzebuję (z vmin = 0, vmax = 1), ale wszystko powyżej tej maksymalnej wartości będzie tego samego koloru ... – Paul

+1

... Zaktualizowałem moje pytanie, aby pokazać, co Poszedłem wyraźniej. Przepraszam, jeśli byłem zbyt nieokreślony. – Paul

+0

Twoja odpowiedź pomogła mi rozwiązać mój problem! – punyidea

39

Użyj CLIM funkcja (odpowiednik CAXIS funkcji w programie MATLAB):

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

Wierzę, że clim() skaluje osie kolorów, ale same kolory zmieniają wartości. Punkt w pewnej części wzdłuż skali będzie miał ten sam kolor niezależnie od skali, ale wartość, którą reprezentuje, zmieni się. – Paul

Powiązane problemy