Python matplotlib меняет цвет по умолчанию для значений, превышающих диапазон цветов

При заполнении сетки цветом, например, при использовании контура в pyplot, мне нужно найти способ изменить цвет, который pyplot использует для заполнения данных, выходящих за пределы указанного диапазона цветовой полосы. Я хочу иметь статическую цветовую полосу, которая автоматически не меняет свой диапазон, чтобы соответствовать максимальному/минимальному значению данных, поэтому неизбежны случайные экстремальные значения, выходящие за его границы, и для таких значений необходимо указывать цвета.

Цвет по умолчанию для значений, выходящих за границы цветовой полосы, — белый, что может резко конфликтовать с окружающими данными, если цветовая карта не имеет белого цвета в качестве конечных цветов. Пример изображения показан ниже — обратите внимание на белую заливку, когда значения превышают отрицательный диапазон цветовой полосы:

введите описание изображения здесь

Я считаю, что есть способ указать, какой цвет использовать на каждой границе, если они превышены, с помощью rcParams, но я нигде не смог найти информацию об этом.

Любая помощь будет оценена по достоинству.


person Levi Cowan    schedule 08.07.2012    source источник


Ответы (1)


Цвета за границами можно установить с помощью методов set_over и set_under палитры; см. документацию. Вам нужно будет указать эти значения при создании вашей палитры. Однако я не вижу никаких настроек matplotlibrc, чтобы установить для этого значение по умолчанию. Вы также можете задать вопрос в списке рассылки matplotlib.

Редактировать: я вижу, что происходит. Белая область, которую вы описываете, не выходит за пределы цветового диапазона. Это просто пустой фон осей. Поскольку вы рисуете только определенные уровни, любые уровни за пределами этого диапазона вообще не будут отображаться, оставляя эти области пустыми. Чтобы получить то, что вы хотите, сделайте следующее:

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)

Аргумент «расширить» является ключевым; он сообщает, что convertf должен продолжить и нарисовать все контуры, но свернуть все за пределами заданного диапазона в категории «слишком большие» и «слишком маленькие». Вызов cs.set_clim необходим, чтобы обойти странность, которую я обнаружил в контуре во время отладки; по какой-то причине, когда вы используете extend, он манипулирует ограничениями данных, поэтому нам нужно сбросить их обратно к тому, что мы хотим.

Кроме того, просто из соображений стиля вам не следует делать что-то вроде Colormap.set_under(cmap,color='k'). Это вызов метода класса и явная передача экземпляра, что является странным способом сделать это. Просто сделайте cmap.set_under(color="k").

person BrenBarn    schedule 08.07.2012
comment
Хорошо, но при попытке использовать эти методы возникает проблема. Вот строка кода, которая работала до того, как я попробовал их: cs = m.contourf(x,y,data,clevs,cmap=pyplot.cm.Spectral) И вот что я только что попробовал: 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) Что приводит к этой ошибке: 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' - person Levi Cowan; 09.07.2012
comment
Вы создаете экземпляр базового класса Colormap, создавая новую пустую Colormap, не используя спектральную карту цветов. Самый простой способ сделать то, что вы хотите, это, вероятно, сделать cmap = pyplot.cm.Spectral, а затем сделать cmap.set_under(...). Это изменит цветовую карту Spectral, чтобы она имела указанное заниженное значение. Обратите внимание, что, поскольку вы изменяете фактический объект цветовой карты Spectral, это останется в силе на всех последующих графиках, использующих цветовую карту Spectral. - person BrenBarn; 09.07.2012
comment
Это имеет смысл, но использование этого не изменило результирующий график, а цвет над/под по-прежнему остается белым. - person Levi Cowan; 09.07.2012
comment
Делать это абстрактно становится слишком сложно. Вам нужно будет предоставить пример кода. - person BrenBarn; 09.07.2012
comment
Здесь. Этот сценарий пытается установить нижний цвет на черный вместо белого, но значения ниже нижней границы цветовой полосы по-прежнему остаются белыми. Извините, не знаю, как красиво оформить несколько строк кода в комментариях. 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() - person Levi Cowan; 09.07.2012
comment
Смотрите мой отредактированный ответ. Описанная вами область не является белой, потому что белый цвет указан как выходящий за пределы допустимого диапазона. Он белый, потому что фон графика белый, и вы вообще ничего не рисуете в этой области, потому что рисуете только определенные уровни. - person BrenBarn; 09.07.2012
comment
Идеально. Это работает, и теперь я понимаю проблему. Большое спасибо за ваше время. - person Levi Cowan; 09.07.2012
comment
Это работает отлично, но холодно, у нас есть прямоугольная цветовая полоса вместо двойного массива? @БренБарн - person Agape Gal'lo; 15.10.2018
comment
@AgapeGal'lo: я не понимаю, что вы имеете в виду, и не понимаю, как это связано с этим вопросом. Если у вас есть новые вопросы, пожалуйста, задавайте их отдельным вопросом на сайте. - person BrenBarn; 15.10.2018