2016-04-21 6 views
0

У меня есть файл netCDF с текущими данными. Я рисую с базовым модулем в Python3.5.Базовая карта: сохранить фигуру с несколькими временными шагами и уникальным именем файла

Файл с текущими данными содержит приблизительно 2000 временных шагов (почасовое), и я хочу, чтобы он отображал все временные шаги и сохранил фигуру в уникальном имени файла. Это возможно?

u = data.variables['u'][0,0,:,:] 
v = data.variables['v'][0,0,:,:] 
Where the first 0 is the time step variable. 

Подпункт: Как создать постоянную цветовую панель, чтобы сравнение между графиком было точным?

+0

если у вас есть еще один вопрос, разместить его в отдельный вопрос. – John

ответ

2

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

EDIT2: Разный способ приблизиться к последовательному цветному номеру. Вычислите скорости для первого шага времени и используйте это для матрицы цветов для каждого графика.

import netCDF4 
from mpl_toolkits.basemap import Basemap 
import numpy as np 
import matplotlib.pyplot as plt 

def u_v_components(u,v,angle): 
     """ Rotate the u, v vectors from model grid to east/north coords """ 
     u_east = (np.cos(angle)*u - np.sin(angle)*v) 
     v_north = (np.sin(angle)*u + np.cos(angle)*v) 
     return u_east, v_north 

# Setting the map 
scale = 0.6 
width = 1800000 
height = 2300000 
lat_0 = 70.8 
lon_0 = 25 
fig, ax = plt.subplots(figsize = (10, 10)) 
m = Basemap(width=width*scale,height=height*scale, 
     resolution='i',projection='stere',\ 
     lat_ts=70,lat_0=lat_0,lon_0=lon_0) 

m.fillcontinents(color='#aaaaaa',lake_color='#cccccc') 
m.drawcountries(linewidth=0.2) 
m.drawmapboundary(fill_color='#cccccc') 

m.drawparallels(np.arange(-80.,81.,5.),labels=[False,True,True,False]) 
m.drawmeridians(np.arange(-180.,181.,10.),labels=[True,False,False,True]) 

dataurl = '/Users/JDMac/norkyst_800m_surfcurr_MAY-JUL_2010_NordNorge_middel.nc' 
data = netCDF4.Dataset(dataurl) 

# I moved the angle and grid operations out of the loop since they 
# only need to be done once. 
#angle array in dataset 
angle = data.variables['angle'][:,:] 

#gridlons and gridlats tell us the lon and lat of each 
# point in the grid. This is necessary for drawing on 
# the map. 
gridlons = data.variables['lon'][:,:] 
gridlats = data.variables['lat'][:,:] 

X, Y = m(gridlons, gridlats) 

YY = np.arange(0, Y.shape[0], 10) 
XX = np.arange(0, X.shape[1], 10) 
points = np.meshgrid(YY, XX) 

#current u-v component [time, depth, lon, lat] 
u = data.variables['u'][0,0,:,:] 
v = data.variables['v'][0,0,:,:] 

#rotate current u-v components from model grid to east-north coordinates 
u_east, v_north = u_v_components(u,v,angle) 

#pytagoras' theorem to calculate the current velocity and direction 
# Calculate speed for time step 0, then maintain this array to 
# consistently colorize your vector plot. 
speed = np.sqrt(u_east**2 + v_north**2) 

# Iterate through the time steps, subsetting the data 
# by time step as you go. 
# I don't know what the time dimension in your dataset is named, 
# so you may have to change it. 
for time in range(data.dimensions['time'].size): 
    #current u-v component [time, depth, lon, lat] 
    u = data.variables['u'][time,0,:,:] 
    v = data.variables['v'][time,0,:,:] 

    #rotate current u-v components from model grid to east-north coordinates 
    u_east, v_north = u_v_components(u,v,angle) 

    # Added the cmap kwarg which will define what colormap is 
    # used to color the arrows. Depending on your version of 
    # matplotlib, jet or viridis is the default if cmap is not specified. 
    m.quiver(X[points], Y[points], 
        u_east[points], v_north[points], 
        speed[points], 
        cmap=plt.cm.get_cmap('viridis')) 

    # I recommend using the Basemap colorbar method 
    # unless for some reason you need more control over all 
    # of the colorbar properties. The colorbar method allwos you to 
    # manipulate the relative size of the colorbar, the padding 
    # between it and the axes, as well as the location on the map. 
    cb = m.colorbar(mappable=plt.cgi(), 
         location='right') 
    cb.set_label('Strømhastighet i m/s') 

    plt.tight_layout() 

    # Give each output file a unique filename 
    # bbox_inches='tight' will remove as much whitespace as it can 
    plt.savefig('current{}.png'.format(time), 
          bbox_inches='tight', 
          dpi = 300) 
    # Clear the figure before re-use 
    plt.clf() 

# Garbage collection should close any open figures and datasets, but 
# it's good practice to do so explicitly 
plt.close('all') 
data.close() 

Несколько вещей:

  1. Я переместил операции сетки и настройки массива углов вне цикла я добавил, так как они только нужно сделать один раз
  2. Я сделал вектор вращения кусок в функцию, которую вы можете называть каждой итерацией цикла
  3. Когда вы выполняете шаги по шагу, я использую тот же массив скоростей, с которым matplotlib будет отображать цветовой код, чтобы (надеюсь) решить вашу проблему с постоянным цветом.
+0

Я ценю вашу помощь! Я получаю сообщение об ошибке, когда я пытаюсь запустить код: Traceback (самый последний вызов последнего): Файл «current.py», строка 75, в скорости [точки], IndexError: слишком много индексов для массива – joddm

+0

К сожалению, я пропустил эту деталь. NumPy пытается срезать теперь одномерный массив скоростей с помощью 2-мерного массива индексов (точек). Я исправил это в ответе. Дайте мне знать, как результаты получаются с тех пор, как я никогда не использовал аргумент Color от колчана, поэтому мне интересно узнать, работает ли моя идея! – AvlWx

+0

Теперь я получаю еще одно сообщение об ошибке, хочу, чтобы я мог отправить вам файл, но это 12 gb. Я отредактировал свой другой ответ с сообщением об ошибке, если вам интересно. – joddm

0

редактировать:

File "current.py", line 75, in <module> 
    speed[:]) 
    File "/usr/local/lib/python3.5/site-packages/mpl_toolkits/basemap/__init__.py", line 560, in with_transform 
    return plotfunc(self,x,y,u,v,*args,**kwargs) 
    File "/usr/local/lib/python3.5/site-packages/mpl_toolkits/basemap/__init__.py", line 3712, in quiver 
    ret = ax.quiver(x,y,u,v,*args,**kwargs) 
    File "/usr/local/lib/python3.5/site-packages/matplotlib/__init__.py", line 1812, in inner 
    return func(ax, *args, **kwargs) 
    File "/usr/local/lib/python3.5/site-packages/matplotlib/axes/_axes.py", line 4433, in quiver 
    q = mquiver.Quiver(self, *args, **kw) 
    File "/usr/local/lib/python3.5/site-packages/matplotlib/quiver.py", line 460, in __init__ 
    self.set_UVC(U, V, C) 
    File "/usr/local/lib/python3.5/site-packages/matplotlib/quiver.py", line 541, in set_UVC 
    mask = ma.mask_or(mask, C.mask, copy=False, shrink=True) 
    File "/usr/local/lib/python3.5/site-packages/numpy/ma/core.py", line 1693, in mask_or 
    return make_mask(umath.logical_or(m1, m2), copy=copy, shrink=shrink) 
ValueError: operands could not be broadcast together with shapes (7200,) (8,)