Python. Какую схему цветовой карты следует использовать для экспоненциальных данных?

Проблема

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

Код и диапазон данных

Вот как выглядят мои 8 192 значения данных, когда они нанесены по порядку на простой линейный график x-y. Точки данных находятся на оси x, а значения — на оси y. введите описание изображения здесь

Вот как выглядят мои данные в цветовом диапазоне LogNormal. Для меня слишком много мятно-зеленого и оранжево-красного.

#Set labels
lonlabels = ['0','45E','90E','135E','180','135W','90W','45W','0']
latlabels = ['90S','60S','30S','Eq.','30N','60N','90N']

#Set cmap properties
norm = colors.LogNorm() #creates logarithmic scale

#Create basemap
fig,ax = plt.subplots(figsize=(15.,10.))
m = Basemap(projection='cyl',llcrnrlat=-90,urcrnrlat=90,llcrnrlon=0,urcrnrlon=360.,lon_0=180.,resolution='c')
m.drawcoastlines(linewidth=1)
m.drawcountries(linewidth=1)
m.drawparallels(np.arange(-90,90,30.),linewidth=0.3)
m.drawmeridians(np.arange(-180.,180.,45.),linewidth=0.3)   
meshlon,meshlat = np.meshgrid(lon,lat)
x,y = m(meshlon,meshlat)

#Plot variables
trend = m.pcolormesh(x,y,lintrends[:,:,0],cmap='jet', norm=norm, shading='gouraud')

#Set plot properties
#Colorbar
cbar=m.colorbar(trend, size='8%',location='bottom',pad=0.8) #Set colorbar
cbar.set_label(label='Linear Trend (mm/day/decade)',size=25) #Set label
for t in cbar.ax.get_xticklabels():
     t.set_fontsize(25) #Set tick label sizes
#Titles & labels
fig.suptitle('Linear Trends of Precipitation (CanESM2)',fontsize=40,x=0.51,y=0.965)
ax.set_title('a) 1979-2014 Minimum Trend',fontsize=35)
ax.set_xticks(np.arange(0,405,45))
ax.set_xticklabels(lonlabels,fontsize=20)
ax.set_ylabel('Latitude',fontsize=25)
ax.set_yticks(np.arange(-90,120,30))
ax.set_yticklabels(latlabels,fontsize=20)

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

А вот как это выглядит с неизмененным цветовым диапазоном по умолчанию. (Тот же код, но без аргумента norm=norm.)

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

Вопрос

Есть ли математическая схема, которую я могу использовать для создания цветовой карты, которая лучше показывает диапазон моих данных? Или мне нужно сделать собственный диапазон?


person ChristineB    schedule 29.07.2016    source источник
comment
Поэтому, если вам не нравятся цвета, вы можете выбрать другую цветовую карту. Вот список возможных цветовых карт. matplotlib.org/examples/color/colormaps_reference.html. Вы также можете проверить, лучше ли PowerNorm вместо LogNorm для того, что вы хотите показать.   -  person cel    schedule 29.07.2016
comment
Дело не столько в самих цветах, сколько в ассортименте. Если бы я мог получить больше синих, голубых и желтых цветов на карте, я был бы счастлив. Во всяком случае, я играл с PowerNorm ранее, и это не сработало, но я просто попробовал еще раз, и после того, как я установил vmax = 3, теперь он выглядит более ровным, хотя и немного тяжелым для темно-синего цвета для всех нулевых значений. . (Я мало что могу с этим поделать.) Опубликуйте это как ответ, и я приму его.   -  person ChristineB    schedule 29.07.2016
comment
В соответствующей заметке: пожалуйста, не используйте карту цветов jet. Поскольку желтая часть палитры ярче, чем красная или синяя части, она привлекает внимание к медианным значениям вашего массива, которые наименее интересны с точки зрения визуализации данных. Существует множество более подходящих цветовых карт, которые помогут вашим графикам выглядеть лучше :).   -  person Andreq    schedule 30.07.2016
comment
Цветовая карта радуги, похожая на джет, на самом деле является стандартом в моей области для изображения графиков осадков.   -  person ChristineB    schedule 01.08.2016
comment
Другая вещь, которую вы можете попробовать, это SymLogNorm. Обычно вы используете его, когда вам нужно логарифмическое масштабирование с положительными и отрицательными значениями, но оно также работает, когда вы хотите разделить линейный и логарифмический диапазоны.   -  person Elliot    schedule 25.08.2016


Ответы (1)


Взлом

Вы можете попробовать применить максимальное значение, то есть для любого значения выше 2 просто заменить его на 2.

Тогда у вас будет один цвет (максимум), представляющий 2+, а остальные цвета будут распределены по вашим данным более равномерно.

person Graeme Stuart    schedule 25.08.2016
comment
В конце концов я так и сделал, но мне также нужно было переключить нормализацию на PowerNorm и поэкспериментировать со шкалой. - person ChristineB; 26.08.2016