Следующая статья принадлежит Юнтай Шуши, автор Юнтай Шуши.
Краткое описание этого раздела: Универсальное руководство по цветовой карте и цветовой панели.
Введение в главу:
В matplotlib и cartopy, если общими командами рисования являются классы коллекций с отображением цветов, вы можете в основном использовать функции cmap и colorbar для анализа данных. cmap — это таблица сопоставления цветов, а colorbar — это цветовая панель анализа цвета. Первая функция предназначена только для раскрашивания рисуемого объекта, а вторая реализует соответствие между уровнями цвета и значениями.
Общие команды рисования scatter, контур, контур, pcolormesh и т. д. могут быть введены в cmap и colorbar. Следующие четыре изображения рисуются с использованием четырех вышеуказанных команд рисования, и таблица сопоставления цветов, используемая в каждом изображении, изменяется:
Введение cmap
В качестве специализированного пакета библиотеки визуализации данных matplotlib специально разработал функцию cm для использования плоттерами. Если вам нужно использовать карту цветов, вы можете использовать оператор get для получения карты цветов:
importmatplotlib as mpl
colormap=mpl.cm.get_cmap(' Reds ' )
ax.contourf(cmap=colormap)
Вы также можете добавить имя карты цветов непосредственно после cm вместо строки. Здесь два метода эквивалентны:
colormap=mpl.cm.Reds
Конечно, здесь эта команда get кажется громоздкой. Более простой метод — напрямую передать строку, представляющую карту цветов, непосредственно в cmap в команде рисования:
ax.contourf(cmap='Reds ')
При использовании таблицы сопоставления цветов не обязательно запоминать все репрезентативные строки. Прежде чем использовать ее, мы можем выполнить поиск на официальном сайте.
Cmap по умолчанию в Matplotlib — viridis.
Перевернуть порядок цветов cmap
Поскольку карта цветов cmap представляет собой массив с фиксированным порядком хранения, мы можем перевернуть соответствующий порядок cmap и значений, когда это необходимо. Команда переворота заключается в добавлении '_r' в конец строки в карте цветов.
ax1.contourf(X,Y,Z,cmap='Reds')
ax2.contourf(X,Y,Z,cmap='Reds_r')
Классификация cmap
matplotlib специально предоставляет различные таблицы сопоставления цветов, которые подробно описаны в руководстве «Выбор цветовых карт в Matplotlib» в разделе «Учебные пособия» на официальном сайте.
Согласно инструкции на официальном сайте, цветовая карта кратко имеет следующие шесть категорий:
1. Последовательный: яркость и насыщенность цветов изменяются постепенно, используя один оттенок для отображения упорядоченной информации. Cmap по умолчанию в Matplotlib — «viridis» попадает в эту категорию. Этот тип визуального воздействия невелик. Если разделение градиента хорошее, в определенный момент последовательные соседние уровни цвета могут перепутаться.
2. Расхождение: яркость и насыщенность разных цветов постепенно меняются. В основном используется для отображения данных, симметричных относительно 0.
3. Циклический: Яркость двух разных цветов постепенно меняется, заканчиваясь ненасыщенным цветом в середине и начале (или конце) карты цветов. Обычно применяется к значениям, зацикленным на конечных точках.
4. Качественный: таблица сопоставления цветов, в которой различные цвета сочетаются в неупорядоченном порядке. Используется для отображения неупорядоченной информации.
5. Разное: различные контрастные цвета соединяются вместе, обычно используются для отображения изменений в деталях информации.
Ниже приведены различные таблицы сопоставления цветов, предоставленные официальным сайтом matplotlib:
Вот еще несколько рекомендуемых практических cmap:
GnBu、gray、cool、bwr、RdBu、tab20c
Среди них GnBu, RdBu и tab20c относительно мягкие, тогда как Cool и BWR оказывают сильное визуальное воздействие.
Внедрение внешнего cmap
Поскольку таблица сопоставления цветов, предоставляемая matplotlib, ограничена, нам также необходимо использовать пакеты внешних библиотек для предоставления дополнительных таблиц сопоставления цветов. Два внешних пакета библиотеки цветов, обычно используемых в науках об атмосфере и океане, — это Palettable и cmaps. Оба этих пакета библиотеки можно установить с помощью команды conda. Palettable используется во многих местах как классический пакет библиотеки цветов; пакет библиотеки cmaps переносит цвета платформы NCL на платформу Python Jiahui Xuelin.
Вот несколько примеров таблиц отображения цветов cmaps:
Дополнительные названия таблиц сопоставления цветов можно найти на официальном сайте.
При использовании cmaps вам нужно только импортировать пакет библиотеки, а затем ввести имя цвета. После введения его можно рассматривать и использовать как обычную внутреннюю карту цветов matplotlib:
import cmaps
cmap=cmaps.MPL_RdYlGn
ax.contourf(cmap=cmap)
перехватить cmap
в ежедневном использовании,Вероятно, нам нужна только часть карты цветов.,В это время вам необходимо выполнить работу по перехвату cmap,Как упоминалось ранее, массивы, объединенные в серию списков цветов, являются сутью cmap.,Таким образом, мы можем легко подумать о перехвате cmap путем разрезания,нарезая,Мы отсекли все теплые цвета на цветовой панели jet_r.
import numpy asnp
importmatplotlib as mpl
importmatplotlib.pyplot as plt
frommatplotlib.colors import ListedColormap
cmap=mpl.cm.jet_r#Получить цветную полосу
newcolors=cmap(np.linspace(0,1,256))#Операция сегментирования
newcmap=ListedColormap(newcolors[125:])#Выбор фрагмента
fig=plt.figure(figsize=(1.5,0.3),dpi=500)
ax1=fig.add_axes([0,0,1,0.45])
ax2=fig.add_axes([0,0.5,1,0.45])
norm =mpl.colors.Normalize(vmin=0, vmax=10)
fc1=fig.colorbar(mpl.cm.ScalarMappable(norm=norm,cmap='jet_r'),
cax=ax1,
orientation='horizontal',
extend='both')
fc2=fig.colorbar(mpl.cm.ScalarMappable(norm=norm,cmap=newcmap),
cax=ax2,
orientation='horizontal',
extend='both')
for i in[fc1,fc2]:
i.ax.tick_params(labelsize=3,width=0.5,length=0.5)
i.outline.set_linewidth(0.5)
Сращивание cmap
Поскольку оно можетнарезаяспособперехватить cmap, то мы можем использовать комбинацию естественных обратных методов. cmap。
import numpy asnp
importmatplotlib as mpl
importmatplotlib.pyplot as plt
frommatplotlib.colors import ListedColormap
import cmaps
plt.rcParams['font.sans-serif']=['FangSong']
cmap1=cmaps.spread_15lev_r
cmap2=cmaps.sunshine_diff_12lev
list_cmap1=cmap1(np.linspace(0,1,15))
list_cmap2=cmap2(np.linspace(0,1,12))
new_color_list=np.vstack((list_cmap1,list_cmap2))
new_cmap=ListedColormap(new_color_list,name='new_cmap ')
fig=plt.figure(figsize=(1.5,0.5),dpi=500)
ax1=fig.add_axes([0,0,1,0.33])
ax2=fig.add_axes([0,0.33,1,0.33])
ax3=fig.add_axes([0,0.66,1,0.33])
norm =mpl.colors.Normalize(vmin=0, vmax=10)
fc1=fig.colorbar(mpl.cm.ScalarMappable(norm=norm,
cmap=cmap1),cax=ax1,
orientation='horizontal',extend='both')
fc2=fig.colorbar(mpl.cm.ScalarMappable(norm=norm,
cmap=cmap2),cax=ax2,
orientation='horizontal',extend='both')
fc3=fig.colorbar(mpl.cm.ScalarMappable(norm=norm,
cmap=new_cmap),cax=ax3,
orientation='horizontal',extend='both')
основы цветной панели
Цветовая панель — это специальный графический элемент, используемый в командах рисования с отображением цветов для представления соответствия между цветами и значениями. В отличие от команды Legend, matplotlib позволяет пользователям добавлять цветные полосы неограниченное количество раз без использования других функций.
Введение цветовой панели может быть активным или пассивным. Активный и пассивный здесь нацелены на корреляцию между цветовой полосой и командами рисования фрагментов изображения.
Чтобы добавить цветовую панель, используйте следующую команду:
importmatplotlib.pyplot as plt
fig=plt.figure()
fig.colorbar()
или
plt.colorbar()
Введение активной цветовой панели
Активная цветовая полоса относится к методу добавления, который напрямую связан с командой рисования подграфа, к которому в данный момент добавлена цветовая полоса. В частности, команда рисования сокращается и затем передается в качестве источника сопоставления сгенерированной команде цветной панели, например:
CS=ax1.contourf(X,Y,Z,cmap=cmaps.sunshine_diff_12lev)
cb=fig.colorbar(CS,shrink=1,ax=ax1)
CS2=ax2.contourf(X,Y,Z,cmap=cmaps.MPL_RdYlGn)
cb2=fig.colorbar(CS2,shrink=1,ax=ax2)
Обе графики здесь являются активными цветными полосами. На рисунке 1 мы называем CS и CS2 источником генерируемой нами цветовой панели. Передавая коллекции контуров, представленные CS и CS2, мы относительно легко сгенерировали цветовую полосу.
Введение в пассивную цветовую панель
Пассивная цветовая полоса в основном относится к корреляции, которая не использует команды рисования в подграфе. Пользователь создает цветную полосу, которая не имеет прямой связи с подграфом, определяя такие параметры, как норма и cmap, такие как:
CS=ax1.contourf(X,Y,Z,cmap=cmaps.MPL_RdYlGn)
cb=fig.colorbar(CS,ax=ax1)
ax2.contourf(X,Y,Z,cmap=cmaps.MPL_RdYlGn)
cmap=cmaps.MPL_RdYlGn
bounds=np.arange(-2.0,2.5,0.5)
norm =mpl.colors.BoundaryNorm(bounds,cmap.N)
cb2=fig.colorbar(mpl.cm.ScalarMappable(norm=norm,cmap=cmap),
ax=ax2)
С помощью нормы и cmap, объявленных пользователем, мы получаем цветовую полосу, точно такую же, как активная цветовая полоса. Хотя это не так просто, как прямая передача активного источника, это более полезно для некоторой расширенной настройки на более позднем этапе.
Список важных параметров Colorbar
Как команда рисования, цветовая панель должна содержать множество параметров модификации. Ниже приведен краткий список каждого параметра:
1. отображаемый (отображаемый источник)
Этот параметр является источником изображения отображения, которое необходимо отрисовать.,Обычно команда рисования текущего подграфа по умолчанию:,Как упоминалось в предыдущем разделе, CS — это источник сопоставления, автоматически создаваемый mpl.cm.ScalarMappable. Для команды fig.colorbar,Этот параметр является обязательным,Однако если команда plt.colorbar используется без указания явного источника,Программа автоматически подтвердит отображаемые элементы текущего подграфа.
2. топор (положение фрагмента изображения, размещенного на цветовой панели)
Этот параметр управляет размещением нарисованной цветной полосы рядом с определенным фрагментом изображения. По умолчанию используется текущий фрагмент изображения. Вы можете передать один подграф или список подграфов.
3. cтопор (положение фрагмента изображения, размещенного на цветовой панели)
После установки этого параметра он имеет наивысший приоритет и будет охватывать сжатие, ось, аспект и другие параметры. Цветовая полоса будет размещена в указанной позиции, например:
cax=fig.add_axes([0.33,0,0.4,0.05])
CS=ax1.contourf(X,Y,Z,cmap=cmaps.MPL_RdYlGn)
cb=fig.colorbar(CS,shrink=1,cax=cax,orientation='horizontal')
ax2.contourf(X,Y,Z,cmap=cmaps.MPL_RdYlGn)
4. ориентация (особенность осей, горизонтальное и вертикальное положение размещения цветовой панели)
Этот параметр управляет горизонтальным и вертикальным положением цветовой панели. По умолчанию установлено вертикальное. Команда «Вертикально» — вертикально, а команда «Горизонтально» — горизонтально, как показано на рисунке под номером 3.
5. сжатие (функция осей, коэффициент сжатия цветовой панели)
Этот параметр управляет коэффициентом сжатия цветовой панели. При уменьшении длина и ширина цветовой панели будут меняться, например:
CS=ax1.contourf(X,Y,Z,cmap=cmaps.MPL_RdYlGn)
cb=fig.colorbar(CS,shrink=0.5,ax=ax1)
CS2=ax2.contourf(X,Y,Z,cmap=cmaps.MPL_RdYlGn)
cb2=fig.colorbar(CS,shrink=1.25,ax=ax2)
6. аспект (функция осей, соотношение сторон цветовой панели)
Этот параметр управляет соотношением длины и ширины цветовой панели, например:
7. площадка (характеристики осей, расстояние между цветовой полосой и фрагментом изображения)
Этот параметр управляет расстоянием между цветовой полосой и фрагментом изображения, например:
8. расширить (характеристики цветовой панели, расширение цветовой панели на обоих концах)
Этот параметр может контролировать, разрешено ли расширение на обоих концах цветовой панели, и после расширения будут создаваться острые углы. Необязательные переменные: «neither», «both», «min» и «max». Следует отметить, что этот параметр не только генерирует острые углы, но и меняет цвет заливки, например:
9. Extendfrac (характеристики цветовой панели, относительная длина расширения на обоих концах цветовой панели)
Этот параметр управляет относительной длиной полученного маленького треугольника и основной части цветовой панели, например:
10. Extendrect (характеристики цветовой панели, относительная форма расширения на обоих концах цветовой панели)
Этот параметр управляет формой маленьких треугольников, полученных из обоих концов, и имеет две дополнительные переменные: True и False. При значении False два конца представляют собой маленькие треугольники, а при значении True, два конца представляют собой прямоугольники, например:
11. интервал (характеристики цветовой панели, интервал заполнения цветовой панели)
Этот параметр определяет, связан ли интервал заполнения цветовой панели с числовым интервалом. Он имеет две дополнительные переменные: равномерную и пропорциональную. Среди них единообразие означает, что все длины цветовой заливки одинаково равны независимо от того, равны или нет числовые интервалы. Это переменная по умолчанию. Пропорциональность означает, что если числовой интервал велик или мал, длина раскраски также изменится соответственно. Чем больше числовой интервал, тем длиннее будет длина раскраски, и наоборот, например:
12. тики (характеристики цветовой панели, интервал шкалы цветовой панели)
Этот параметр управляет масштабом отображения цветной полосы.
13. формат (характеристики цветовой панели, система единиц измерения цветовой шкалы)
Этот параметр управляет единицей измерения значения масштаба, отображаемого цветовой полосой, например:
14. drawedges (характеристики цветовой панели, рисует ли цветовая панель линии на границе)
Этот параметр определяет, следует ли рисовать линии на пересечении каждого цвета, элемент управления логическим значением, например:
15. label (характеристики цветовой панели, метка цветовой панели)
Этот параметр позволяет передать строку, которая будет использоваться в качестве метки цветовой панели.
Функция осей Colorbar
Из сценария генерации мы знаем, что цветовая панель должна генерировать оси как паразитную ось, поэтому колобар может вызывать некоторые функции подграфа. Метод вызова следующий:
CS=ax1.contourf(X,Y,Z,cmap=cmaps.MPL_RdYlGn)
cb=fig.colorbar(CS,shrink=1,ax=ax1)
cb.ax
После вызова свойств субизображения мы можем использовать свойства субизображения для дальнейшего изменения цветовой панели, например:
def make_colorbar(cb):
cb.ax.tick_params(labelsize=4,length=0.5,width=0.5)
cb.outline.set_color('none')
cb=fig.colorbar(CS,shrink=1,ax=ax1)
cb2=fig.colorbar(mpl.cm.ScalarMappable(norm=norm,cmap=cmap),
ax=ax2)
for cb in[cb,cb2]:
make_colorbar(cb)
Мы также можем изменить цветовую полосу, используя упомянутый ранее генератор масштаба, например:
CS=ax1.contourf(X,Y,Z,cmap=cmaps.MPL_RdYlGn)
cb=fig.colorbar(CS,shrink=1,ax=ax1)
cb.ax.yaxis.set_minor_locator(mticker.MultipleLocator(0.25))
ax2.contourf(X,Y,Z,cmap=cmaps.MPL_RdYlGn)
cmap=cmaps.MPL_RdYlGn
bounds=np.arange(-2.5,2.5,0.5)
norm =mpl.colors.BoundaryNorm(bounds,cmap.N)
cb2=fig.colorbar(mpl.cm.ScalarMappable(norm=norm,cmap=cmap),
ax=ax2)
Техники рисования цветных полос с разными характеристиками
В какой-то момент цветная полоса, автоматически сгенерированная программой, после модификации все еще не может соответствовать нашим потребностям. На данный момент мы будем использовать некоторые средства для создания различных цветных полос с разными характеристиками. Ниже мы представим несколько распространенных методов рисования цветных полос особой формы.
1. кольцо цвета
Цвет кольца проявляется в том, что цветовая полоса не является линейной.,В рамках текущей структуры matplotlib,Существующие параметры цветной панели не могут быть изменены для получения аналогичной формы. В это время,Мы можем использовать только другие методы для имитации цветовой панели.
Здесь мы предоставляем два метода: во-первых, используйте метод гистограммы в полярной системе координат, во-вторых, используйте команду формы клина, чтобы нарисовать кольцо.
1.1 Метод построения гистограммы в полярной системе координат
Поскольку полярная система координат позволяет строить гистограммы,Гистограмму можно раскрасить с помощью параметра facecolor.,Поэтому его можно использовать в рисунке цвета кольца.,нравиться:
import numpy asnp
import xarray asxr
importmatplotlib.pyplot as plt
importcartopy.crs as ccrs
importcartopy.feature as cfeature
importcartopy.io.shapereader as shpreader
importmatplotlib.path as mpath
importmatplotlib as mpl
fromcartopy.util import add_cyclic_point
from matplotlibimport cm,colors
fromcartopy.mpl.gridliner import LONGITUDE_FORMATTER,
LATITUDE_FORMATTER
plt.rcParams['font.sans-serif']=['FangSong']#Используется для обычного отображения китайского языка
plt.rcParams['axes.unicode_minus']=False#Используется для обычного отображения отрицательных знаков
##Подготовка данных##
file=r'E:\aaaa\datanc\2019.6.23\fnl_20190620_00_00.grib2'
data=xr.open_dataset(file,engine='cfgrib',
backend_kwargs={'filter_by_keys':{'typeOfLevel': 'surface'}})
data['t']-273.15
data['latitude']
data['longitude']
cycle_t,cycle_lon = add_cyclic_point(data['t']-273.15,
coord=data['longitude'])
cycle_LON,cycle_LAT = np.meshgrid(cycle_lon,data['latitude'])
##рисование##
fig=plt.figure(figsize=(2,2),dpi=700)
ax1=fig.add_axes([0,0,1,1],polar=True)
ax1.set_axis_off()
ax2=fig.add_axes([0.127,0.123,0.75,0.75],
projection=ccrs.SouthPolarStereo())
ax2.add_feature(cfeature.LAND)
ax2.add_feature(cfeature.OCEAN)
ax2.add_feature(cfeature.COASTLINE,lw=0.75)
##Граница обрезанного фрагмента изображения 2 имеет круглую форму##
theta =np.linspace(0, 2*np.pi, 100)
center, radius =[0.5, 0.5], 0.5
verts =np.vstack([np.sin(theta), np.cos(theta)]).T
circle =mpath.Path(verts * radius + center)
ax2.set_boundary(circle,transform=ax2.transAxes)
##Нарисуйте карту цветов контуров##
cs=ax2.contourf(cycle_LON,cycle_LAT, cycle_t,
levels=np.arange(60,60,10),
cmap='RdBu_r',transform=ccrs.PlateCarree())
##Получить информацию о карте контурной раскраски##
cs.levels
cmap=cm.get_cmap('RdBu_r',len(cs.levels)-1)
angle=np.arange(0,0.5*np.pi,0.5*np.pi/(len(cs.levels)-1))
radius=np.array([2,2,2,2,2,2,2,2,2,2,2])
cmaps=cmap(range(len(cs.levels)-1))
ax1.set_theta_offset(np.pi/2)
ax1.bar(angle,radius,width=0.5*np.pi/11,color=cmaps,align='center')
for i,x,y inzip(cs.levels,angle,radius):
ax1.text(x-0.1,y+0.17,i,fontsize=3)
ax1.text(0.9,2.6,'Температура: ℃',fontsize=4)
1.2 Графический рисунок клина Кольцо цвета
Используйте графическую команду Wedge в matplotlib.patches, чтобы добавить цветную полосу в форме кольца в итерации цикла.
import numpy asnp
import xarray asxr
importmatplotlib.pyplot as plt
importcartopy.crs as ccrs
importcartopy.feature as cfeature
importcartopy.io.shapereader as shpreader
importmatplotlib.path as mpath
importmatplotlib as mpl
fromcartopy.util import add_cyclic_point
from matplotlibimport cm,colors
fromcartopy.mpl.gridliner import LONGITUDE_FORMATTER,
LATITUDE_FORMATTER
frommatplotlib.patches import Wedge
plt.rcParams['font.sans-serif']=['FangSong']
plt.rcParams['axes.unicode_minus']=False
file=r'E:\aaaa\datank\2019.6.23 сильный дождь\fnl_20190620_00_00.grib2'
data=xr.open_dataset(file,engine='cfgrib',
backend_kwargs={'filter_by_keys':{'typeOfLevel': 'surface'}})
data['t']-273.15
data['latitude']
data['longitude']
cycle_t,cycle_lon = add_cyclic_point(data['t']-273.15, coord=data['longitude'])
cycle_LON,cycle_LAT = np.meshgrid(cycle_lon,data['latitude'])
fig=plt.figure(figsize=(2,2),dpi=700)
ax=fig.add_axes([0,0,1,1],projection=ccrs.PlateCarree())
ax.add_feature(cfeature.LAND)
ax.add_feature(cfeature.OCEAN)
ax.add_feature(cfeature.COASTLINE,lw=0.3)
ax.spines['geo'].set_linewidth(0.5)
cs=ax.contourf(cycle_LON,cycle_LAT, cycle_t,
levels=np.arange(-60,60,10),cmap='RdBu_r',
transform=ccrs.PlateCarree(),extend='both')
cmap=cm.get_cmap('RdBu_r',len(cs.levels)-1)
cmaps=cmap(range(len(cs.levels)-1))
ax2=fig.add_axes([0.05,0.3,0.2,0.2])
delta=360/(len(cs.levels)-1)
for c,p inzip(cmaps,range(len(cs.levels)-1)):
wedge=Wedge((0.5,0.5),0.4,delta*p,delta*(p+1),facecolor=c,
edgecolor='k',width=0.1,linewidth=0.1)
ax2.add_patch(wedge)
ax2.axis('off')
2. Цветная полоса с треугольниками на обоих концах, отделенная от основной части цветовой полосы.
import numpy asnp
import xarray asxr
importmatplotlib.pyplot as plt
importmatplotlib.path as mpath
importmatplotlib as mpl
from matplotlibimport cm,colors
from matplotlib.patchesimport Rectangle
importcartopy.crs as ccrs
fromcartopy.util import add_cyclic_point
fromcartopy.mpl.gridliner import LONGITUDE_FORMATTER,
LATITUDE_FORMATTER
importcartopy.feature as cf
importcartopy.io.shapereader as shpreader
plt.rcParams['font.sans-serif']=['SimHei']
file=r'E:\aaaa\datanc\2019.6.23\fnl_20190620_00_00.grib2'
data=xr.open_dataset(file,engine='cfgrib',
backend_kwargs={'filter_by_keys':{'typeOfLevel': 'surface'}})
t=data['t']-278.15
lat=data['latitude']
lon=data['longitude']
proj=ccrs.LambertConformal(central_longitude=105,central_latitude=35)
reader= shpreader.Reader( r'F:\B\china.shp')
provinces=cf.ShapelyFeature(reader.geometries(),
crs=ccrs.PlateCarree(),
edgecolor='k',
facecolor='none',
alpha=1,lw=0.5)
extent=[80,130,10,60]
fig=plt.figure(figsize=(1.5,1.5),dpi=800)
ax=fig.add_axes([0,0.1,1,0.85],projection=proj)
ax.add_feature(cf.COASTLINE.with_scale('50m'),lw=0.25)
ax.add_feature(cf.OCEAN.with_scale('50m'),lw=0.5)
ax.add_feature(cf.LAND.with_scale('50m'),lw=0.5,edgecolor='none')
ax.add_feature(cf.RIVERS.with_scale('50m'),lw=0.25)
ax.add_feature(provinces,linewidth=0.3)
ax.add_geometries(shpreader.Reader(r'F:\B\nine.shp').geometries(),
crs=ccrs.PlateCarree(),edgecolor='k',
facecolor='k',alpha=1,lw=0.5)
ax.spines['geo'].set_linewidth(0.25)
ax.set_extent(extent)
ax2=fig.add_axes([0.054,0,0.892,0.1])
ax2.tick_params(axis='both',which='major',
direction='in',width=0.5,
length=0.5,labelsize=3)
for i in ['top','bottom','left','right']:
ax2.spines[i].set_linewidth(0.5)
ac=ax.contourf(lon,lat,t,cmap='Spectral_r',
levels=np.arange(-20,40,2),
transform=ccrs.PlateCarree())
ax.spines['geo'].set_linewidth(0.5)
ax2.set(xlim=(-3,30),ylim=(0,1))
num=ac.levels
colormap=cm.get_cmap('Spectral_r',len(num)-1)
cmaps=colormap(range(len(num)-1))
camps=cmaps.tolist()
for i,x,y,colorin zip(range(len(num)-2),
range(len(num)-2),
[0.25]*(len(num)-2),
cmaps[1:-1]):
rectangle=Rectangle([x,y],1,0.5,
facecolor=color,
alpha=1,
edgecolor='k',
linewidth=0.02)
ax2.add_patch(rectangle)
left=plt.Polygon(xy=[[-0.75,0.31],[-0.75, 0.69], [-2.5,0.5]],
facecolor=cmaps[0],edgecolor='k',linewidth=0.02)
right=plt.Polygon(xy=[[27.75,0.31],[27.75,0.69],[29.5,0.5]],
facecolor=cmaps[-1],edgecolor='k',linewidth=0.02)
ax2.add_patch(left)
ax2.add_patch(right)
for s in['top','bottom','left','right']:
ax2.spines[s].set_linewidth(0.5)
ax2.axis('off')
3. Цветовая полоса столбца с двойным масштабом
Сделайте на цветовой панели две галочки, чтобы отображать разные измерения.
import numpy asnp
importmatplotlib as mpl
importmatplotlib.pyplot as plt
importmatplotlib.colors as mcolors
plt.rcParams['font.sans-serif']=['SimHei']
##Первый шаг — создать цветную полосу осадков
fig=plt.figure(figsize=(1.5,0.2),dpi=500)
ax=fig.add_axes([0,0,1,0.5])
colorlevel=[0.1,10.0,25.0,50.0,100.0,250.0,500.0]#Уровень осадков
colordict=['#A6F28F','#3DBA3D','#61BBFF','#0000FF','#FA00FA','#800040']#Список цветов
cmap=mcolors.ListedColormap(colordict)#Создать карту цветов
норма=mcolors.BoundaryNorm(colorlevel,cmap.N)#Сгенерировать индекс
fc=fig.colorbar(mpl.cm.ScalarMappable(norm=norm,cmap=cmap),
cax=ax,orientation='horizontal',extend='both')
fc.ax.tick_params(which='major',labelsize=3,
direction='out',width=0.5,length=1)
fc.outline.set_linewidth(0.3)
##Второй шаг: создание столбца с двойным масштабом##
ax2=fc.ax# Вызовите атрибут ax объекта fc и назовите его ax2. На данный момент ax2 рассматривается как подграф.
ax2.xaxis.set_ticks_position('top')#Переместить числовую шкалу вверх
ax2.tick_params(labelsize=3,top=True,width=0.5,length=1)#Изменить образец тика
формулу и поставить на ней шкалу
ax3=ax2.secondary_xaxis('bottom')
ax3.tick_params(labelsize=3,width=0.5,length=1)
ax3.spines['bottom'].set_bounds(0.1,500)#Усекаем лишнюю часть
ax3.set_xticks([40,120,210,290,380,460])
ax3.set_xticklabels(['легкий дождь','умеренный дождь','сильный дождь','сильный дождь','сильный дождь','чрезвычайно сильный дождь'])
ax3.spines['bottom'].set_linewidth(0.3)#Изменить толщину нижней линии до толщины линии кадра
4. Столбец масштаба отделен от тела цветовой панели
При использовании достигается визуальный эффект отделения списка масштабов от основной части цветовой панели.
import numpy asnp
importmatplotlib as mpl
importmatplotlib.pyplot as plt
importmatplotlib.colors as mcolors
plt.rcParams['font.sans-serif']=['SimHei']
##Первый шаг — создание цветных полос##
fig=plt.figure(figsize=(1.5,0.2),dpi=500)
ax=fig.add_axes([0,0,1,0.5])
cmap =mpl.cm.cool
norm = mpl.colors.Normalize(vmin=5,vmax=10)
fc=fig.colorbar(mpl.cm.ScalarMappable(norm=norm,cmap=cmap),
cax=ax, orientation='horizontal')
fc.ax.tick_params(which='major',labelsize=3,
direction='out',width=0.5,length=1)
fc.outline.set_linewidth(0.3)
##Второй шаг: создание столбца с двойным масштабом##
ax2=fc.ax# Вызовите атрибут ax объекта fc и назовите его ax2. На данный момент ax2 рассматривается как подграф.
ax2.xaxis.set_ticks_position('top')#Переместить числовую шкалу влево
ax2.tick_params(labelsize=3,top=True,width=0.5,length=1)
ax3=ax2. Secondary_xaxis('bottom')#Создайте ax3 так, чтобы ax3 был точно таким же, как ax2
ax3.tick_params(labelsize=3,width=0.5,length=3)
ax3.spines['bottom'].set_bounds(5,10)#Усекаем лишнюю часть
ax3.set_xticks([5,10])
ax3.set_xticklabels(['0.1mm','500mm'])#Преобразуем количественные значения на ax3 в качественный текст
ax3.spines['bottom'].set_linewidth(0.3)#Изменить толщину нижней линии до толщины линии кадра
labels=fc.ax.get_xticklabels()
ax2.axis('off')
fc.outline.set_color('none')
ax3.spines['bottom'].set_position(('outward',10))
5. Используйте команду «Легенда», чтобы создать фальшивую цветовую полосу.
При рисовании изображений мы также можем использовать команду «Легенда» для создания смоделированной цветовой полосы, которая часто встречается в некоторых диаграммах осадков с прогнозами погоды и в справочниках числовых диапазонов. Если уровней меньше и известны все номера цветов, вы можете добавить легенду вручную, например:
larger1=mpatches.Rectangle((0,0), 1, 1, facecolor="#A6F28F")
larger2=mpatches.Rectangle((0,0), 1, 1, facecolor="#3DBA3D")
larger3=mpatches.Rectangle((0,0), 1, 1, facecolor="#61BBFF")
larger4=mpatches.Rectangle((0,0), 1, 1, facecolor="#0000FF")
larger5=mpatches.Rectangle((0,0), 1, 1, facecolor="#FA00FA")
labels=['0-10','10-25','25-50','50-100','100-250']
ax.legend([larger1,larger2,larger3,larger4,larger5],labels,
fontsize=12,frameon=False,
title='Легенда (мм)',facecolor='none',
loc='lower left', bbox_to_anchor=(-0.01,-0.02),
fancybox=False)
Подробные параметры легенды приведены в главе «Основные команды рисования», обращайтесь друг к другу.
Если мы не знаем конкретный номер цвета каждого раздела, мы можем использовать метод цикла для добавления легенд, например:
cs=ax.contourf(cycle_LON,cycle_LAT, cycle_t,
levels=np.arange(-60,60,10),cmap='RdBu_r',extend='both')
cmap=cm.get_cmap('RdBu_r',len(cs.levels)-1)
color_list=(cmap(range(len(cs.levels)-1)))
Rectangles=[ ]
text=[ ]
for l incs.levels[::-1]:
text.append(f'{int(l-10)}~{int(l)}')
for color incolor_list[::-1]:
Rectangles.append(mpatches.Rectangle((0,0), 1, 1, facecolor=color))
ax.legend(handles=Rectangles,labels=text,loc='lowerright', fontsize=3,
title='Температура',
frameon=False,
fancybox=False,
handletextpad=2,
handlelength=3,
handleheight=1.5,
title_fontsize=5,
bbox_to_anchor=(1.25,0),
labelspacing=0.5)
Здесь используется непосредственное управление цветовой картой для создания новой легенды. Вы также можете использовать get_facecolor, чтобы получить цвет текущего контура:
6. Один числовой интервал соответствует обработке нескольких задач с цветом.
Эта проблема возникает, когда таблица сопоставления цветов используется неправильно. Есть две причины: 1. Неправильное использование правил сопоставления цветов. Например, правило нормализации используется в главах, посвященных настройке cmap и colorbar. необходимо, чтобы числовой интервал соответствовал нескольким цветам; во-вторых, длина массива цветов, хранящегося в карте цветов, меньше длины массива уровней. Последняя причина чаще всего возникает при использовании cmaps для внедрения cmap в NCL. Например:
pc1=ax1.contourf(olon,olat,rain_new,
levels=np.arange(0,500,
cmap=cmaps.sunshine_9lev)
pc2=ax2.contourf(olon,olat,rain_new,
levels=np.array([0,50,100,250,300,500]),
cmap=cmaps.sunshine_9lev)
В настоящее время длина уровней может быть сокращена только до длины меньшего размера цветового массива, хранящегося в cmap. Цвета, хранящиеся на цветовой панели NCL, несовместимы. Например, sun_9lev, представленный выше, cmap хранит только 10 цветов, а установленные вами уровни достигают 100, тогда неизбежно произойдет несовпадение.
Цветовая карта Matplotlib в принципе не имеет такой ситуации, поскольку каждая cmap хранит 256 цветов.
Настраиваемая cmap и цветовая панель
В реальной визуализации данных cmap на самом деле представляет собой просто серию сохраненных массивов, представляющих цвета, которые не имеют реальной связи с числовыми значениями. Например, когда контурф рисует цветную контурную карту, пока параметр уровней изменяется, значение, представленное определенным цветом, будет меняться. Чтобы отразить это изменение, модуль цветов в matplotlib предоставляет нормализованные операторы для достижения нашей цели. . Читатели могут посетить официальный сайт, чтобы ознакомиться со всеми стандартизированными заявлениями. Здесь мы углубимся только в несколько часто используемых операторов класса.
1.LinearSegmentedColormap
Функция сегментации смешивания цветов. Эта команда может подготовить новую цветовую карту на основе списка цветов и сокращения значения N, введенного пользователем. Эта команда аналогична палитре в искусстве: она смешивает новые цвета с соседними цветами в исходном списке цветов. По мере изменения списка цветов и значения N новая созданная cmap также изменится. Как показано ниже, для создания новой cmap задаются два цвета «tab:red», «tab:blue» и разные значения N:
import matplotlib.colorsas mcolors
color_list=['tab:red','tab:blue']
new_cmap=mcolors.LinearSegmentedColormap.from_list('new_cmap',
color_list,N=2)
norm=mpl.colors.Normalize(vmin=5,vmax=10)
fc=fig.colorbar(mpl.cm.ScalarMappable(norm=norm,cmap=new_cmap),
cax=ax, orientation='horizontal')
Здесь нам требуется только, чтобы вновь созданная cmap имела только два цвета, чтобы два цвета, которые мы вводим, выводились напрямую без настройки цвета. Когда мы изменяем N на 5, что соответствует количеству числовых интервалов:
new_cmap=mcolors.LinearSegmentedColormap.from_list('new_cmap',
color_list,N=5)
В это время в средней части цветовой панели ясно видно, что два цвета смешиваются для создания нового цвета. Изменяя исходный список цветов и значение N, мы можем развернуть больше цветовых карт, например:
color_list=['tab:red','tab:blue','tab:green','#000000']
new_cmap=mcolors.LinearSegmentedColormap.from_list('new_cmap',
color_list,50)
norm=mpl.colors.Normalize(vmin=5,vmax=10)
fc=fig.colorbar(mpl.cm.ScalarMappable(norm=norm,cmap=new_cmap),
cax=ax, orientation='horizontal')
По умолчанию эта команда создает новое смешение цветов только между двумя соседними цветами.
2.ListedColormap
Функция объединения списка цветов. Эта команда может соединять только все цвета в списке цветов. Линии разделения цветов очевидны, и смешанных цветов не будет. Наиболее часто используемые из них — это настройка цветных полос метеорологических осадков и другие ситуации, требующие от пользователей настройки цветных полос.
colorlevel=[0.1,10.0,25.0,50.0,100.0,250.0,500.0]
colorlist=['#A6F28F','#3DBA3D','#61BBFF',
'#0000FF','#FA00FA','#800040']
cmap=mcolors.ListedColormap(colorlist)
norm=mcolors.BoundaryNorm(colorlevel,cmap.N)
fc=fig.colorbar(mpl.cm.ScalarMappable(norm=norm,cmap=cmap),
cax=ax, orientation='horizontal')
3.norm
Как упоминалось ранее, нам нужно сформировать сопоставление между цветами и значениями. Это правило сопоставления в модуле цветов называется нормой. При обычном рисовании контура вводимые нами уровни называются нормой. Правила отображения в это время имеют наивысший приоритет. Использование параметра уровней закроет другие команды нормы. Это наиболее распространенная ситуация, которая обычно используется при использовании cmap по умолчанию. Конечно, при дальнейшем использовании в связи с особыми потребностями рисования нам потребуются и другие правила отображения.
Разработчики Matplotlib не универсализировали команду для установки уровней, поэтому эту удобную команду можно использовать только в контуре и контуре. Другие распространенные команды сопоставления цветов, такие как scatter и pcolormesh, использовать нельзя. Для ограничения диапазона можно установить только vmin и vmax верхней и нижней строк. На данный момент мы можем использовать норму для указания правил сопоставления между значениями и. цвета, например:
import numpy asnp
import pandas aspd
importmatplotlib.pyplot as plt
importmatplotlib.colors as mcolors
importmatplotlib.ticker as mticker
importcartopy.crs as ccrs
importcartopy.io.shapereader as shpreader
importcartopy.mpl.ticker as cmt
import cmaps
importmatplotlib as mpl
fromscipy.interpolate import Rbf
plt.rcParams['font.sans-serif']=['FangSong']
plt.rcParams['axes.unicode_minus']=False
pro=ccrs.PlateCarree()
extent=[108.3,109.4,29.7,30.7]
def create_map(ax,extent):
ax.add_geometry(shpreader.Reader(r'E:\Личуань.shp').geometrys(),
crs=ccrs.PlateCarree(),linewidth=0.5,
edgecolor='k',facecolor='none')
ax.set_extent([108.3,109.35,29.7,30.7],crs=pro)
ax.set_xticks(np.arange(extent[0],extent[1], 0.2))
ax.set_yticks(np.arange(extent[2],extent[3]+0.2, 0.2)) ax.tick_params(which='both',labelsize=4,top=True,
ax.tick_params(which='both',labelsize=4,top=True,
right=True,width=0.5)
ax.xaxis.set_major_formatter(cmt.LongitudeFormatter())
ax.yaxis.set_major_formatter(cmt.LatitudeFormatter())
ax.grid(axis='both',which='major',linewidth=0.6,color='w',
alpha=0.45,linestyle='--',zorder=5)
ax.spines['geo'].set_linewidth(0.5)
ax.minorticks_on()
fig=plt.figure(figsize=(5,4.2),dpi=700)
ax1=plt.subplot(221,projection=pro,facecolor='#E8E6E7')
ax2=plt.subplot(222,projection=pro,facecolor='#E8E6E7')
ax3=plt.subplot(223,projection=pro,facecolor='#E8E6E7')
ax4=plt.subplot(224,projection=pro,facecolor='#E8E6E7')
for ax in [ax1,ax2,ax3,ax4]:
create_map(ax,extent)
filename=r'C:\Users\lenovo\Desktop\3.xlsx'
df=pd.read_excel(filename)
lon=df['долгота']
lat=df['широта']
rain=df['rain']
as1=ax1.scatter(lon,lat,c=rain,s=24,cmap='plasma_r')
cb1=fig.colorbar(as1,ax=[ax1],shrink=0.9)
ax1.set_title('разброс норм по умолчанию', размер шрифта = 7)
cmap =mpl.cm.plasma_r
colorlevel=[0.1,10,25,50,100,200,250,500]
norm=mcolors.BoundaryNorm(colorlevel,cmap.N)
as2=ax2.scatter(lon,lat,c=rain,s=24,cmap='plasma_r',norm=norm)
cb2=fig.colorbar(as2,ax=[ax2],shrink=0.9)
ax2.set_title('Укажите разброс нормы', fontsize=7)
olon=np.linspace(108,111,110)
olat=np.linspace(29,32,110)
olon,olat=np.meshgrid(olon,olat)
func=Rbf(lon,lat,rain,function='linear')
rain_new=func(olon,olat)
pc1=ax3.pcolormesh(olon,olat,rain_new,cmap='viridis_r')
cb3=fig.colorbar(pc1,ax=[ax3],shrink=0.9)
ax3.set_title('pcolormesh нормы по умолчанию', размер шрифта=7)
cmap2 =mpl.cm.viridis_r
norm2=mcolors.BoundaryNorm(colorlevel,cmap2.N)
pc2=ax4.pcolormesh(olon,olat,rain_new,norm=norm2,cmap='viridis_r')
cb4=fig.colorbar(pc2,ax=[ax4],shrink=0.9)
ax4.set_title('pcolormesh указанной нормы',fontsize=7)
for cb in[cb1,cb2,cb3,cb4]:
cb.ax.tick_params(length=2,labelsize=4)
Сравнивая два изображения разброса нормы по умолчанию и изображения pcolormesh, мы видим, что из-за строгого линейного отображения связь между уровнями цвета и значениями серьезно ухудшается, особенно однотоновая область, соответствующая области с низким значением, занимает большая площадь формата изображения. Затем за счет указания новой нормы соответствующие отношения отображения между цветами и значениями улучшаются. Вот некоторые общие нормы:
3.1 Normalize
То есть норма по умолчанию, то есть все цвета располагаются равномерно, независимо от размера числового интервала. Между числовыми значениями нет четкой разделительной линии, например:
3.2 BoundaryNorm
Как следует из названия, цвета этой команды соответствуют числовым интервалам один к одному, с четкими разделительными линиями. Только один цвет соответствует числовому интервалу. Это наше общее использование, например:
3.3 CenteredNorm
Правило сопоставления центра асимметрии делает наше значение центра тупым, а значение центра по умолчанию равно 0, например:
Эта команда закомментирована в версии matplotlib3.4.2 и временно недоступна.
3.4 LogNorm
Соответствующие правила индексированных числовых значений можно найти в документации официального сайта.
3.5 PowerNorm
Правила отображения по степенному закону изменяют исходное соответствие «Нормализация», изменяя значение гаммы. После изменения числовой интервал все еще может содержать несколько цветов, но эффект немного лучше, чем исходное значение по умолчанию, например:
3.6 TwoSlopeNorm
Эта команда приводит к тому, что цветные полосы имеют одинаковый масштаб вокруг центра. Если цветные полосы объединены, положением значения, заданного vcenter, является положение соединения, например:
В предыдущих двух цветных полосах, когда установлено vcenter=300, соединение между двумя цветными полосами привязывается к 300, когда установлено vcenter=0, соединение между двумя цветными полосами привязывается к 0;
Судя по этой особенности, у нас есть особое применение при отрисовке цветовой карты, аналогичное клепке значения 0, например:
При использовании цветовой шкалы на рисунке 3 выше нам нужно сделать красный и синий цвета Инь и Ян симметричными относительно значения 0, но мы можем обнаружить, что синие назначения на самом деле находятся в диапазоне от 0 до -0,5, а темный цвет находится в диапазоне от 0 до -0,5. синяя часть фактически не используется. В это время, если вы просто измените диапазоны vmin и vmax, как показано на рисунке 1, шкала 0 попадет в синюю область, а красный, синий, а также цвета инь и ян больше не будут симметричны относительно значения 0. Если используется TwoSlopeNorm, значение 0 можно установить в качестве центрального значения, как показано на рисунке 2:
Reds=mpl.cm.get_cmap('Reds')
Blues_r=mpl.cm.get_cmap('Blues_r')
Redslist=Reds(np.linspace(0,1, 256))
Bluerlist=Blues_r(np.linspace(0.25,1,256))
new_list=np.vstack((Bluerlist,Redslist))
ncmap=mcolors.LinearSegmentedColormap(colors=new_list,
name='newcmap')
norm=mcolors.TwoSlopeNorm(vmin=-0.5,vcenter=0,vmax=1)
3.7 FuncNorm
Пользовательские функции для отображения цветов. Подробную информацию можно найти в официальной документации сайта. Эта команда закомментирована в matplotlib3.4.2 и временно недоступна.