Pytanie Python matplotlib zmienia domyślny kolor dla wartości przekraczających zakres kolorów paska


Podczas wypełniania siatki kolorem, na przykład przy użyciu contourf w pyplot, muszę znaleźć sposób na zmianę koloru, który pyplot wykorzystuje do wypełnienia danych przekraczających określony zakres paska kolorów. Chciałbym mieć statyczny pasek kolorów, który nie zmienia automatycznie jego zasięgu, aby pasował do maksimum / min danych, więc czasami sporadyczne ekstremalne wartości przekraczające jego granice są nieuniknione, a kolory należy określać dla takich wartości.

Domyślnym kolorem dla wartości przekraczających granice paska kolorów jest kolor biały, który może rażąco kolidować z otaczającymi danymi, jeśli mapa kolorów nie ma białych jako kolorów końcowych. Przykładowy obraz pokazano poniżej - zauważ białe wypełnienie, gdy wartości przekraczają ujemny zakres paska kolorów:

enter image description here

Wierzę, że istnieje sposób na określenie, jakiego koloru użyć przy każdym wiązaniu, jeśli zostaną przekroczone przez użycie rcParams, ale nie byłem w stanie znaleźć nigdzie informacji na ten temat.

Każda pomoc będzie doceniona.


18
2017-07-08 19:37


pochodzenie




Odpowiedzi:


Kolory poza obszarem można ustawić za pomocą set_over i set_under metody mapy kolorów; widzieć dokumentacja. Będziesz musiał podać te wartości podczas tworzenia mapy kolorów. Nie widzę jednak żadnego ustawienia matplotlibrc, aby ustawić domyślne dla tego. Możesz również zapytać na liście dyskusyjnej matplotlib.

Edycja: widzę, co się dzieje. Biały obszar, który opisujesz, nie wykracza poza granice zakresu kolorów. To po prostu puste tło osi. Ponieważ wykreślasz tylko niektóre poziomy, wszelkie poziomy spoza tego zakresu nie zostaną wykreślone w ogóle, pozostawiając te obszary puste. Aby uzyskać to, czego chcesz, wykonaj następujące czynności:

cs = pyplot.contourf(x,y,z,levels=np.arange(50, 220, 20), cmap=pyplot.cm.jet, extend="both")
cs.cmap.set_under('k')
cs.set_clim(50, 210)
cb = pyplot.colorbar(cs)

Argument "rozszerzania" jest kluczem; mówi konturowi, aby kontynuował i rysował wszystkie kontury, ale zwinął wszystko poza podanym zakresem w kategorie "zbyt duże" i "zbyt małe". The cs.set_clim wywołanie jest konieczne, aby obejść dziwność, którą odkryłem w contourf podczas debugowania tego; z jakiegoś powodu, gdy używasz extend, manipuluje limitami danych, więc musimy zresetować je z powrotem do tego, co chcemy, aby były.

Ponadto, tak jak w przypadku stylu, nie powinieneś robić takich rzeczy jak Colormap.set_under(cmap,color='k'). To wywołuje metodę klasy i jawnie przekazuje instancję, co jest dziwnym sposobem. Po prostu zrób cmap.set_under(color="k").


24
2017-07-08 19:59



Ok, ale pojawia się problem przy próbie użycia tych metod. Oto linia kodu, która działała przed ich wypróbowaniem: cs = m.contourf(x,y,data,clevs,cmap=pyplot.cm.Spectral)  Oto, co właśnie wypróbowałem: cmap=matplotlib.colors.Colormap('Spectral') matplotlib.colors.Colormap.set_under(cmap,color=(0.4667,0,0.5333)) cs = m.contourf(x,y,data,clevs,cmap=cmap)  Który powoduje ten błąd: File "/usr/lib/pymodules/python2.7/matplotlib/contour.py", line 943, in _process_colors self.monochrome = self.cmap.monochrome AttributeError: Colormap instance has no attribute 'monochrome' - Levi Cowan
Tworzysz podstawową klasę Colormap, tworząc nową, pustą Colormap, nie używając "widmowej" mapy kolorów. Najłatwiej jest zrobić najprostszy sposób robienia tego, co chcesz cmap = pyplot.cm.Spectral a następnie zrobić cmap.set_under(...). Spowoduje to modyfikację spektralnej mapy kolorów, aby uzyskać podaną wartość. Zauważ, że skoro modyfikujesz rzeczywisty obiekt Colormap Spectral, będzie on obowiązywał na wszystkich kolejnych poletkach przy użyciu spektralnej mapy kolorów. - BrenBarn
To ma sens, ale zastosowanie tego nie zmieniło wynikowego wykresu, a kolor "over / under" jest nadal biały. - Levi Cowan
Robi się to zbyt trudne w abstrakcji. Musisz podać przykładowy kod. - BrenBarn
Tutaj. Ten skrypt próbuje ustawić kolor "under" na czarny zamiast białego, ale wartości poniżej dolnej granicy paska kolorów są nadal białe. Niestety nie wiem, jak dobrze sformatować wiele linii kodu w komentarzach. from matplotlib import pyplot as plt from numpy import arange,meshgrid from matplotlib.colors import Colormap x,y = arange(-10,10),arange(-10,10) x,y=meshgrid(x,y) z = x**2+y**2 clevs=arange(50,220,20) cmap=plt.cm.jet Colormap.set_under(cmap,color='k') cs = plt.contourf(x,y,z,clevs,cmap=cmap) plt.colorbar(cs) plt.show() - Levi Cowan