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. Однако, учитывая, что образец карты, связанный в вопросе, имел определенные цвета, я решил использовать эти цвета напрямую.

Другие вопросы по тегам