Python Matplotlib создает собственную цветовую гамму
Я создал карту уровней осадков в регионе на основе данных об осадках из файлов NetCDF. Я хотел бы добавить пользовательский масштаб так, чтобы, если осадки составляли менее 800 мм, это был один цвет, 800-1000 мм - другой и т. Д. Аналогично карте, найденной здесь: http://www.metmalawi.com/climate/climate.php
На данный момент я использую градиентную шкалу, но она не показывает детали, которые мне нужны. Это код графика на данный момент (где "Среднее" - это мои данные, которые я уже отформатировал).
#load color palette
colourA = mpl_cm.get_cmap('BuPu')
#plot map with physical features
ax = plt.axes(projection=cartopy.crs.PlateCarree())
ax.add_feature(cartopy.feature.COASTLINE)
ax.add_feature(cartopy.feature.BORDERS)
ax.add_feature(cartopy.feature.LAKES, alpha=0.5)
ax.add_feature(cartopy.feature.RIVERS)
#set map boundary
ax.set_extent([32.5, 36., -9, -17])
#set axis tick marks
ax.set_xticks([33, 34, 35])
ax.set_yticks([-10, -12, -14, -16])
lon_formatter = LongitudeFormatter(zero_direction_label=True)
lat_formatter = LatitudeFormatter()
ax.xaxis.set_major_formatter(lon_formatter)
ax.yaxis.set_major_formatter(lat_formatter)
#plot data and set colour range
plot = iplt.contourf(Average, cmap=colourA, levels=np.arange(0,15500,500), extend='both')
#add colour bar index and a label
plt.colorbar(plot, label='mm per year')
#give map a title
plt.title('Pr 1990-2008 - Average_ERAINT ', fontsize=10)
#save the image of the graph and include full legend
plt.savefig('ERAINT_Average_Pr_MAP_Annual', bbox_inches='tight')
plt.show()
Кто-нибудь знает, как я могу это сделать?
Спасибо!
1 ответ
Это вопрос matplotlib, замаскированный под вопрос Iris, так как проблема появилась в процедурах построения графиков Iris, но для ответа на это нам понадобится всего пара команд matplotlib. Таким образом, я основываю этот ответ на примере галереи matplotlib. Это levels
(содержит значения для верхней границы каждого контура) и colors
(указав цвета для тени каждого контура). Лучше всего, если будет одинаковое количество уровней и цветов.
Чтобы продемонстрировать это, я собрал следующий пример. Учитывая, что образцы данных не предоставлены, я сделал свои собственные тригонометрические данные. Уровни основаны на значениях тригонометрических данных, поэтому они не отражают уровни, требуемые в вопросе, но могут быть изменены на исходные уровни. Используемые цвета - это шестнадцатеричные значения уровней, указанных изображением в ссылке в вопросе.
Код:
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(-25, 25)
y = np.arange(-20, 20)
x2d, y2d = np.meshgrid(x, y)
vals = (3 * np.cos(x2d)) + (2 * np.sin(y2d))
colours = ['#bf8046', '#df9f24', '#e0de30', '#c1de2d', '#1ebf82',
'#23de27', '#1dbe20', '#11807f', '#24607f', '#22427e']
levels = range(-5, 6)
plt.contourf(vals, levels=levels, colors=colours)
plt.colorbar()
plt.show()
Полученное изображение:
Цвета также могут быть выбраны из цветовой карты (один из способов сделать это показан в ответе Stackru). Есть и другие способы, в том числе в приведенном выше примере с галереей matplotlib. Однако, учитывая, что образец карты, связанный в вопросе, имел определенные цвета, я решил использовать эти цвета напрямую.