2013-05-06 26 views
19

Chcę użyć colormap rainbow na obrazku przy użyciu imshow. Działa doskonale, ale chcę przedefiniować kolor dla wartości 0. Zamiast fioletowego, chcę użyć białego.Jak na nowo zdefiniować kolor dla konkretnej wartości w matplotlib colormap

Chcę to zrobić tylko dla wartości zero, wszystkie inne wartości mogą pozostać z domyślnymi wartościami w mapie kolorów.

Każdy pomysł jak to zrobić bez konieczności ręcznej edycji mapy kolorów?

+1

Patrz: http://stackoverflow.com/questions/16152052/matplotlib-python-change-single-color-in-colormap/16163481 –

+0

pytanie jest inne, nie chcę edytować bezpośrednio obozu ... Definicja mapy kolorów tęczy nie jest jednoznaczna – otmezger

+0

Nie musisz w ogóle edytować rampy, miałem na myśli tworzenie zamaskowanej tablicy z maskowanymi zerami i używanie 'cmap.set_bad ('biały')'. Ale obejście to jest równoważne z użyciem 'cmap.set_under()' od dołu. –

Odpowiedz

29

Można również użyć set_under który myślę czyni bardziej semantyczny sens niż przy użyciu set_bad

my_cmap = matplotlib.cm.get_cmap('rainbow') 
my_cmap.set_under('w') 
imshow(np.arange(25).reshape(5, 5), 
     interpolation='none', 
     cmap=my_cmap, 
     vmin=.001) 

Można dostosować colorbar również pokazać „pod” (i symetryczny „over”) kolor za pomocą kwarg extend, patrz example i docs.

uzyskać odpowiedź na duplikat z bardziej kompletnych przykłady patrz How to create matplotlib colormap that treats one value specially?

+0

działa jak urok! dzięki. Jedynym problemem jest to, że pasek kolorów nie pokazuje białego, ale to nie jest duży problem ... – otmezger

+1

(edytowane w celu rozwiązania powyższej kwestii) – tacaswell

+0

Po zmodyfikowaniu cmap za pomocą 'set_under',' set_over' lub 'set_bad' zmodyfikowano' cmap'. Nawet jeśli ponownie użyjemy 'matplotlib.cm.get_cmap', oryginalny cmap pozostanie zmodyfikowany. Jak wrócić do pierwotnego stanu? Lub alternatywnie jak utworzyć nowy do modyfikacji bez zmiany oryginalnego cmap? –