2016-02-08 3 views
1

Я пытаюсь создать сюжет, который использует ту же самую цветовую гамму, что и Met Office, поэтому я могу легко сравнить свои сюжеты с их. Пример их есть на HereЦветовая шкала - близко, но недостаточно близко

Моих текущих ближайших усилий здесь: Here

Я ценю мой код грязный - я не мог найти способ, чтобы установить цвет для значений выше определенного порога (в противном случае он становится белым), следовательно, цикл.

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

Многие, большое спасибо за любую помощь.

Мой код для построения рисунков показан ниже;

from Scientific.IO.NetCDF import NetCDFFile      
from mpl_toolkits.basemap import Basemap      
from matplotlib import pyplot as plt      
import numpy as np 


myfile = NetCDFFile('ERA_Dec_89-94.nc', 'r') 
Lat = NetCDFFile('/home/james/Documents/Lat_Lon_NC_Files/latitudes_d02.nc','r') 
Long = NetCDFFile('/home/james/Documents/Lat_Lon_NC_Files/longitudes_d02.nc','r') 


XLAT = Lat.variables['XLAT'][:]  
XLONG = Long.variables['XLONG'][:]  
ERA_Data = myfile.variables['Monthlyrain'][:] 

plot = np.zeros([1000,1730]) 

plot[:,:] = np.average(ERA_Data[:,:,:],axis=0) 

m = Basemap(projection='merc',resolution='f',llcrnrlat=49,llcrnrlon=-11,urcrnrlat=61,urcrnrlon=3) 
m.drawparallels(np.arange(-90., 91., 5.), labels=[1,0,0,0], fontsize=11) 
m.drawmeridians(np.arange(-180., 181., 5.), labels=[0,0,0,1], fontsize=11) 
m.drawcoastlines() 


X, Y = m(XLONG, XLAT) 

for i in range(0,1729): 
    for j in range(0,999): 
     if plot[j,i] >250: 
      plot[j,i] = 250.001 
     if plot[j,i] < 40: 
      plot[j,i] = 40 

scale = [40,40.001,60,80,100,125,150,200,250, 250.001] 
cs = m.contourf(X,Y,plot,scale, cmap='PuOr') 
cbar = m.colorbar(cs, ticks= [40.0005,50,70,90,112.5,137.5,175,225,250.0005]) 
cbar.set_ticklabels(['<40','40-60', '60-80', '80-100', '100-125', '125-150', '150-200', '200-250', '>250']) 

plt.title('Some Title') 
cbar.set_label('Monthly average rainfall (mm)') 

print "Finished" 

plt.show() 
+0

В чем проблема? Вы хотите, чтобы цвета соответствовали более близко? Вы хотите ограничить рисование земли? Что-то еще, полностью? Чем более конкретны ваши вопросы, тем выше вероятность того, что у кого-то есть хороший ответ ... – kazemakase

+0

Извините - два компонента, в которых мне нужна была помощь, были с цветами, чтобы они соответствовали более близким (я думаю, xnx ответил так, что я отдам это), и также как назначить цвет любому значению, превышающему пороговое значение (устраняя необходимость в цикле) –

ответ

0

Первая часть (получение цветов справа) was already answered. Чтобы ограничить значения определенным диапазоном, у вас есть несколько вариантов.

  • Используйте cmap.set_over и cmap.set_under установить вне Bounds цвета, как описано here

  • использование np.clip вместо петли, чтобы ограничить значения в certian диапазоне:

    plot = np.clip(plot, 40, 250)

0

Если вопрос просто Colormap, вы можете выбрать компоненты RGB цветов от экрана и превратить их в ListedColormap, отображенной на границах осадков в диаграмме вы даете в качестве примера. Например,

bounds = [0, 40, 60, 80, 100, 125, 150, 200, 250, 1000] 
rgblist = [(51,0,0), (102,51,0), (153,102,51), (204,153,102), (255, 255, 255), 
      (204,204,255), (153,153,255), (51,102,255), (0,0,153)] 
clist = [[c/255 for c in rgb] for rgb in rgblist] 

from matplotlib import colors 
cmap = colors.ListedColormap(clist) 
norm = colors.BoundaryNorm(bounds, cmap.N) 

ax.imshow(arr, cmap=cmap, norm=norm) 
plt.show() 
+0

Спасибо за ответ - я дам это! –

+0

Вопрос: где я могу найти номера для каждого цвета? Как узнать, какие значения использовать для RGBlist? Спасибо –

+0

Есть много инструментов для этого. например, на Mac, в приложении/Утилиты/цифровой цветной метр - приложение для определения компонентов RGB пикселя под курсором. – xnx

Смежные вопросы