"""Test :func:`~vacumm.misc.plot.plot2d` with specified cell bounds""" # Imports from vcmq import MV2, N, code_file_name, plot2d, os # Init var = MV2.reshape(MV2.arange(4*3), (3, 4)) var.units = 'Count' var.long_name = 'Navets' x = var.getAxis(1) x.units = 'km' x.long_name = 'Distance' y = var.getAxis(0) y.units = 'm' y.long_name = 'Height' y.designateLevel() # Bounds y[:] = [1.5, 3.5, 4.5] y2db = N.array([0., 3, 4, 5]) # Plot figfile = code_file_name(ext='png') if os.path.exists(figfile): os.remove(figfile) plot2d(var, savefig=figfile, show=False, close=True, y2db=y2db, fill='pcolor', xmin=-.5, xmax=3.5, ymin=0, ymax=5, cmap='jet') # Unittest result = {"files":figfile}
sill = 9. range = 40 farvalue = 20 # Input xi = [20., 26., 50., 70] yi = [20, 26., 70., 20] zi = [15., 6., 2., 4.] # Output positions nx = ny = 101 xg = N.linspace(1, 100, 101) yg = N.linspace(1, 100, 101) # Some inits xi = N.array(xi) yi = N.array(yi) zi = N.array(zi) xxg, yyg = N.meshgrid(xg, yg) xo = xxg.ravel() yo = yyg.ravel() vgm = variogram_model('linear', n=0, s=sill, r=range) # Setup the kriger sck = SimpleCloudKriger(xi, yi, zi, vgf=vgm, farvalue=farvalue) # Interpolate zo = sck(xo, yo) # Check a far value zzg = zo.reshape(ny, nx)
# Create hourly time axis taxi = sp.getTime() taxi.toRelativeTime('hours since 2000') ctimesi = taxi.asComponentTime() ct0 = round_date(ctimesi[0], 'hour') ct1 = round_date(ctimesi[-1], 'hour') taxo = create_time(lindates(ct0, ct1, 1, 'hour'), taxi.units) # Lag error # - estimation els = [] lags = N.arange(1, 6) for lag in lags: els.append(N.sqrt(((sp[lag:] - sp[:-lag])**2).mean())) els = N.array(els) a, b, _, _, _ = linregress(lags, els) # - plot P.figure(figsize=(6, 6)) P.subplot(211) P.plot(lags, els, 'o') P.plot([0, lags[-1]], [b, a * lags[-1] + b], 'g') P.axhline(b, color='0.8', ls='--') P.ylim(ymin=0) P.xlabel('Lag [hour]') P.ylabel('Error [m s-1]') add_key(1) P.title('Linear lag error model') # Interpolation sph, speh = regrid1d(sp,
"""Test the :func:`~vacumm.misc.grid.masking.polygons` function""" from vcmq import N, P, polygons, create_polygon, plot_polygon, create_grid from _geoslib import Polygon # Data xx = N.array([0., 5., 4., 1.]) yy = N.array([0., 0., 2., 2.]) clip = [-3, -3, 0, 0] xaxis = yaxis = N.linspace(-2., 2., 20.) def plot_polygons(polys, **kwargs): for p in polys: plot_polygon(p, **kwargs) ## Single known argument #pp0 = polygons(Polygon(N.array([xx, yy]).T)) # ## Classic data #pp0 = polygons([N.array([xx, yy]), N.array([xx, yy]).T+6.]) # ## Classic with projection #proj = lambda x, y: (x*1.5, y*1.5) #pp1 = polygons([N.array([xx, yy])]) # ## Classic with clipping #pp2 = polygons([-N.array([xx, yy])], clip=clip) # From grid pp3 = polygons([create_grid(xaxis, yaxis)])
for i, np in enumerate(nps): xc = P.rand(1)*dxy*2.5 yc = P.rand(1)*dxy*2.5 x = P.rand(np)*dxy+xc y = P.rand(np)*dxy+yc xx.extend(x) yy.extend(y) P.scatter(x, y, c=colors[i:i+1], s=40) P.title('Original (mixed clouds)') # Spliting indices, centroids = cloud_split(xx, yy, getdist=False, getcent=True, npmax=npmax) # Plot P.subplot(122, aspect=1) xx = N.array(xx) yy = N.array(yy) msize = 0 for i, select in enumerate(indices): x = xx[select] y = yy[select] P.scatter(x, y, c=colors[i:i+1], s=40, label='size=%i'%len(x)) P.scatter(centroids[i:i+1, 0], centroids[i:i+1, 1], c=colors[i:i+1], s=100, lw=2) msize = max(len(x), msize) P.legend(loc='upper left').get_frame().set_alpha(.5) P.title('Split clouds: max size=%i'%npmax) savefigs(code_file_name(ext='png'), pdf=True, verbose=False) #P.tight_layout() P.close() # For unitest
# Create hourly time axis taxi = sp.getTime() taxi.toRelativeTime("hours since 2000") ctimesi = taxi.asComponentTime() ct0 = round_date(ctimesi[0], "hour") ct1 = round_date(ctimesi[-1], "hour") taxo = create_time(lindates(ct0, ct1, 1, "hour"), taxi.units) # Lag error # - estimation els = [] lags = N.arange(1, 6) for lag in lags: els.append(N.sqrt(((sp[lag:] - sp[:-lag]) ** 2).mean())) els = N.array(els) a, b, _, _, _ = linregress(lags, els) # - plot P.figure(figsize=(6, 6)) P.subplot(211) P.plot(lags, els, "o") P.plot([0, lags[-1]], [b, a * lags[-1] + b], "g") P.axhline(b, color="0.8", ls="--") P.ylim(ymin=0) P.xlabel("Lag [hour]") P.ylabel("Error [m s-1]") add_key(1) P.title("Linear lag error model") # Interpolation sph, speh = regrid1d(sp, taxo, method="cellerr", erri=spe, errl=-a, geterr=True)
"""Test the fortran function :f:func:`cellerr1d`, :f:func:`cellerr1dx` et :f:func:`cellerr1dxx`""" from vcmq import cdms2, data_sample, N, P, meshcells, minmax, code_file_name, os from vacumm.misc.grid._interp_ import cellerr1d, cellerr1dx, cellerr1dxx # Academic example pure 1d # - data yi = N.array([-2., 2., 6., 12., 15.]) vari = N.ma.array(yi) vari[-1] = N.ma.masked errm = N.ma.array([1, 2, 1., 2., 3.]) yo = N.array([5., 15]) mv = 1e20 vari = vari.reshape(1, -1).filled(mv) errm = errm.reshape(1, -1).filled(mv) errl = N.ones(1) # - interp varo, erro = cellerr1d(vari, yi, yo, mv, errm, errl) # - truth errot = N.array([ 1 / N.sqrt(1 / (errm[0, 1]**2 + N.abs(yo[0] - yi[1]) * errl[0]) + 1 / (errm[0, 2]**2 + N.abs(yo[0] - yi[2]) * errl[0])), N.sqrt(errm[0, 3]**2 + N.abs(yo[1] - yi[3]) * errl[0]) ]) varot = N.array([ vari[0, 1] / (errm[0, 1]**2 + N.abs(yo[0] - yi[1]) * errl[0]) + vari[0, 2] / (errm[0, 2]**2 + N.abs(yo[0] - yi[2]) * errl[0]), vari[0, 3] / (errm[0, 3]**2 + N.abs(yo[1] - yi[3]) * errl[0]) ]) * errot**2 # - check result = [(N.testing.assert_allclose, [erro.ravel(), errot]),
x1, y1 = 0., 0. x2, y2 = 3., 1. x3, y3 = 2., 4. x4, y4 = -1., 2. # Format and convert xx, yy = N.meshgrid(N.arange(-2, 4, 0.25), N.arange(-1, 5, 0.25)) nxy = xx.shape xx.shape = -1 yy.shape = -1 pp, qq = [], [] for x, y in zip(xx, yy): p, q = curv2rect(x1, x2, x3, x4, y1, y2, y3, y4, x, y) pp.append(p) qq.append(q) pp = N.array(pp) qq = N.array(qq) # Plot xp = [x1, x2, x3, x4, x1] yp = [y1, y2, y3, y4, y1] P.subplot(211) levels = N.array([-10, 0, 1, 10.]) o = P.contourf(xx.reshape(nxy), yy.reshape(nxy), pp.reshape(nxy), levels=levels) P.colorbar(o) P.plot(xp, yp, 'k') P.subplot(212) o = P.contourf(xx.reshape(nxy),
sill = 12. range = 40 # Input xi = [20., 26., 50., 70] yi = [20, 26., 70., 50] zi = [2., 6., 15., 4.] ei = [.3, .6, 3., .3] # Output positions nx = ny = 101 xg = N.linspace(1, 100, 101) yg = N.linspace(1, 100, 101) # Some inits xi = N.array(xi) yi = N.array(yi) zi = N.array(zi) ei = N.array(ei) zi -= zi.mean() xxg, yyg = N.meshgrid(xg, yg) xo = xxg.ravel() yo = yyg.ravel() vgm = variogram_model('linear', n=0, s=sill, r=range) # Setup the krigers sck = SimpleCloudKriger(xi, yi, zi, vgf=vgm)#, farvalue=0) scke = SimpleCloudKriger(xi, yi, zi, vgf=vgm, e=ei)#, farvalue=0) #sck = OrdinaryCloudKriger(xi, yi, zi, vgf=vgm) #scke = OrdinaryCloudKriger(xi, yi, zi, vgf=vgm, e=ei)
"""Test the fortran function :f:func:`cellerr1d`, :f:func:`cellerr1dx` et :f:func:`cellerr1dxx`""" from vcmq import cdms2, data_sample, N, P, meshcells, minmax, code_file_name, os from vacumm.misc.grid._interp_ import cellerr1d, cellerr1dx, cellerr1dxx # Academic example pure 1d # - data yi = N.array([-2., 2., 6. , 12., 15.]) vari = N.ma.array(yi) vari[-1] = N.ma.masked errm = N.ma.array([1, 2, 1., 2., 3.]) yo = N.array([5., 15]) mv = 1e20 vari = vari.reshape(1, -1).filled(mv) errm = errm.reshape(1, -1).filled(mv) errl = N.ones(1) # - interp varo, erro = cellerr1d(vari, yi, yo, mv, errm, errl) # - truth errot = N.array([ 1/N.sqrt( 1/(errm[0, 1]**2+N.abs(yo[0]-yi[1])*errl[0]) + 1/(errm[0, 2]**2+N.abs(yo[0]-yi[2])*errl[0])), N.sqrt(errm[0, 3]**2+N.abs(yo[1]-yi[3])*errl[0]) ]) varot = N.array([ vari[0, 1]/(errm[0, 1]**2+N.abs(yo[0]-yi[1])*errl[0]) + vari[0, 2]/(errm[0, 2]**2+N.abs(yo[0]-yi[2])*errl[0]), vari[0, 3]/(errm[0, 3]**2+N.abs(yo[1]-yi[3])*errl[0]) ])*errot**2 # - check result = [(N.testing.assert_allclose, [erro.ravel(), errot]),
x1, y1 = 0., 0. x2, y2 = 3., 1. x3, y3 = 2., 4. x4, y4 = -1., 2. # Format and convert xx, yy = N.meshgrid(N.arange(-2, 4, 0.25), N.arange(-1, 5, 0.25)) nxy = xx.shape xx.shape = -1 yy.shape = -1 pp, qq = [], [] for x, y in zip(xx, yy): p, q = curv2rect(x1,x2,x3,x4,y1,y2,y3,y4,x,y) pp.append(p) qq.append(q) pp = N.array(pp) qq = N.array(qq) # Plot xp = [x1, x2, x3, x4, x1] yp = [y1, y2, y3, y4, y1] P.subplot(211) levels = N.array([-10, 0, 1, 10.]) o = P.contourf(xx.reshape(nxy), yy.reshape(nxy), pp.reshape(nxy), levels=levels) P.colorbar(o) P.plot(xp, yp, 'k') P.subplot(212) o = P.contourf(xx.reshape(nxy), yy.reshape(nxy), qq.reshape(nxy), levels=levels) P.colorbar(o) P.plot(xp, yp, 'k') figfile = code_file_name(ext='png')
y = P.rand(np) * dxy + yc xx.extend(x) yy.extend(y) P.scatter(x, y, c=colors[i:i + 1], s=40) P.title('Original (mixed clouds)') # Spliting indices, centroids = cloud_split(xx, yy, getdist=False, getcent=True, npmax=npmax) # Plot P.subplot(122, aspect=1) xx = N.array(xx) yy = N.array(yy) msize = 0 for i, select in enumerate(indices): x = xx[select] y = yy[select] P.scatter(x, y, c=colors[i:i + 1], s=40, label='size=%i' % len(x)) P.scatter(centroids[i:i + 1, 0], centroids[i:i + 1, 1], c=colors[i:i + 1], s=100, lw=2) msize = max(len(x), msize) P.legend(loc='upper left').get_frame().set_alpha(.5) P.title('Split clouds: max size=%i' % npmax) savefigs(code_file_name(ext='png'), pdf=True, verbose=False)
# Lecture de la température f =cdms2.open(data_sample('mars3d.tsigyx.nc')) data_in = f('TEMP', time=slice(0,2)) # T-YX (- = level) # Détermination des profondeurs d'après les sigma sigma_converter = NcSigma.factory(f) # détection auto et initialisation du convertisseur # -> VERIFIER QUE sigma_class EST BIEN SigmaGeneralized depths_in = sigma_converter.sigma_to_depths(selector=dict(time=slice(0,2))).filled() # lecture eta, etc + conversion # (Equivalent à depths_in = sigma_converter(selector=dict(time=slice(0,2))).filled()) f.close() # Creation de l'axe des profondeurs cibles depths = N.array([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20, 22,24,26,28,30,32,34,36,38,40,45,50,55,60,65,70,75,80,85,90,95,100,120,140,160]) depths = -depths[::-1] # croissantes et négatives depth_out = create_depth(depths) # Interpolation data_out = regrid1d(data_in, depth_out, axi=depths_in, axis=1, method='linear', extrap=1) # Plot kw = dict(vmin=10, vmax=14, xhide='auto', add_grid=True, ymax=0, fill='contourf') # FILL=PCOLOR ? section2(data_in[0, :, 10], yaxis=depths_in[0, :, 10], subplot=211, title='Sigma', show=False, **kw) s = section2(data_out[0, :, 10], subplot=212, title='Z', show=False, savefig=__file__, **kw)
"""Test the :func:`~vacumm.misc.grid.masking.create_polygon` function""" from vcmq import N, P, create_polygon, plot_polygon, code_file_name from _geoslib import Polygon # Data xx = N.array([0., 5., 4., 1.]) yy = N.array([0., 0., 2., 2.]) # From Polygon P.figure(figsize=(5, 5)) p0 = create_polygon(Polygon(N.array([xx, yy]).T)) plot_polygon(p0, color='b', label='From poly') # From data p1 = create_polygon(N.array([xx, yy]).T-.25) plot_polygon(p1, color='r', label='From data') # From transposed data p2 = create_polygon(N.array([xx, yy])-0.5) plot_polygon(p2, color='g', label='From transposed data') # From min/max p3 = create_polygon([xx.min(), yy.min(), xx.max(), yy.max()]) plot_polygon(p3, color='m', label='From min/max') # With projection proj = lambda x, y: (x*1.5, y*1.5) p4 = create_polygon(p0, proj=proj) plot_polygon(p4, color='cyan', label='With projection') # Save
"""Test the :func:`~vacumm.misc.grid.masking.create_polygon` function""" from vcmq import N, P, create_polygon, plot_polygon, code_file_name from _geoslib import Polygon # Data xx = N.array([0., 5., 4., 1.]) yy = N.array([0., 0., 2., 2.]) # From Polygon P.figure(figsize=(5, 5)) p0 = create_polygon(Polygon(N.array([xx, yy]).T)) plot_polygon(p0, color='b', label='From poly') # From data p1 = create_polygon(N.array([xx, yy]).T - .25) plot_polygon(p1, color='r', label='From data') # From transposed data p2 = create_polygon(N.array([xx, yy]) - 0.5) plot_polygon(p2, color='g', label='From transposed data') # From min/max p3 = create_polygon([xx.min(), yy.min(), xx.max(), yy.max()]) plot_polygon(p3, color='m', label='From min/max') # With projection proj = lambda x, y: (x * 1.5, y * 1.5) p4 = create_polygon(p0, proj=proj) plot_polygon(p4, color='cyan', label='With projection') # Save
f = cdms2.open(data_sample('mars3d.tsigyx.nc')) data_in = f('TEMP', time=slice(0, 2)) # T-YX (- = level) # Détermination des profondeurs d'après les sigma sigma_converter = NcSigma.factory( f) # détection auto et initialisation du convertisseur # -> VERIFIER QUE sigma_class EST BIEN SigmaGeneralized depths_in = sigma_converter.sigma_to_depths(selector=dict( time=slice(0, 2))).filled() # lecture eta, etc + conversion # (Equivalent à depths_in = sigma_converter(selector=dict(time=slice(0,2))).filled()) f.close() # Creation de l'axe des profondeurs cibles depths = N.array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95, 100, 120, 140, 160 ]) depths = -depths[::-1] # croissantes et négatives depth_out = create_depth(depths) # Interpolation data_out = regrid1d(data_in, depth_out, axi=depths_in, axis=1, method='linear', extrap=1) # Plot kw = dict(vmin=10,