12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949 |
- # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*-
- #
- ########################################################################
- #
- # B a r a K u d a
- #
- # Ploting functions and utilities
- #
- ## Authors:
- # --------
- # 2010-2015: Laurent Brodeau (original primitive code)
- # 2016: Saeed Falahat (update to fancy grown-up coding!) :D
- #
- #######################################################################
- import os
- import sys
- import numpy as nmp
- import matplotlib as mpl
- mpl.use('Agg')
- import matplotlib.pyplot as plt
- import matplotlib.colors as colors
- reload(sys)
- sys.setdefaultencoding('utf8')
- # Some defaults:
- #WDTH_DEF = 10.
- #HGHT_DEF = 4.
- WDTH_DEF = 9.
- HGHT_DEF = 3.6
- FIG_SIZE_DEF = ( WDTH_DEF , HGHT_DEF )
- RAT_XY = WDTH_DEF/10.
- DPI_DEF = 120
- AXES_DEF = [0.09, 0.082, 0.89, 0.84]
- # Colors for line: (https://www.daftlogic.com/projects-hex-colour-tester.htm)
- b_blu = '#2C558A'
- b_red = '#AD0000'
- b_gre = '#3DE079' ; #b_gre = '#3A783E' ; # b_gre = '#42BD82'
- b_prp = '#8C008C'
- b_org = '#ED7C4C'
- clr_inf_box='0.9'
- v_dflt_colors = [b_blu, b_red, b_gre, b_org, b_prp, 'pink', '0.5', 'b', 'g', 'brown', 'orange',
- '0.25','0.75','k' ]
- nmax_colors = len(v_dflt_colors)
- # Some projections to use with BaseMap:
- #
- # zone PROJ llcrnrlon llcrnrlat urcrnrlon urcrnrlat lat1 lon0 mer/par continent-res
- # (lcc = Lambert conformal conic)
- projection_def = [
- ['nseas', 'lcc', -55., 40., 55., 75., 60., -20., 10., 'l' ], # Nordic seas
- ['natarct', 'lcc', -60., 40., 80., 72., 55., -32., 10., 'l' ], # NATL + Arctic
- ['labir', 'lcc', -62., 48., -10., 75., 50., -30., 5., 'l' ],
- ['labsp', 'lcc', -60., 48., 50., 75.5, 50., -30., 10., 'l' ],
- ['npol', 'stere', -75., 45., 100., 60., 80., -30., 10., 'l' ],
- ['npol2', 'stere', -55., 40., 145., 40., 80., -5., 10., 'l' ], # North Pole
- ['spstere', 'stere', 0., 0., 0., 0., -48., 90., 10., 'l' ], # South Pole Default matplotlib!
- ['matl' , 'cyl', -82.,-21., 12., 79., 30., -30., 15., 'l' ], # Nordic seas
- ['atmed', 'lcc', -18., 33., -2., 42., 30., -10., 5., 'h' ],
- ['kav7' , 'kav', 0., 0., 0., 0., 0., 0., 0., 'l' ] ] # global map-monde
- class plot :
- ''' This class encapsulates all the plot routines
- In order to use it you need to type as follows:
- plot(function name without the prefix __) (all the arguments of the function)
- for example for __vert_section we do as follows:
- plot("vert_section")(VX, VZ, XF, XMSK, rmin, rmax, dc, lkcont=True, cpal='jet',
- xmin=-80., xmax=85., dx=5, cfignm='fig', cbunit='', cxunit=' ',
- zmin = 0., zmax = 5000., l_zlog=False, cfig_type='png',
- czunit=' ', ctitle=' ', lforce_lim=False, i_cb_subsamp=1, l_z_increase=False )
- The reason to prefix all the function with double underscore __ is that all these function become private members of
- the plot class and they can not be accessed directly outside of the class. That is, you need to call these functios through the call wrapper
- as seen below in the function __call__.
- '''
- def __init__(self,splot) :
- self.splot = splot
- def __call__(self,*args, **kw) :
- if "_"+self.__class__.__name__+ "__" + self.splot in self.__class__.__dict__.keys() :
- self.__class__.__dict__["_"+self.__class__.__name__+ "__" + self.splot](self,*args, **kw)
- else :
- print "function " + "__" + self.splot + " does not exist"
- sys.exit()
- # Functions:
- def __vert_section(self, VX, VZ, XF, XMSK, rmin, rmax, dc, lkcont=False, cpal='jet', lzonal=True,
- xmin=-80., xmax=85., dx=5, cfignm='fig', cbunit='', cxunit=' ',
- zmin = 0., zmax = 5000., l_zlog=False, cfig_type='png',
- czunit=' ', ctitle=' ', lforce_lim=False, i_cb_subsamp=1, l_z_increase=False ):
- import barakuda_colmap as bcm
- font_ttl, font_xylb, font_clb, font_inf = __font_unity__(fig_dpi=DPI_DEF)
- zVZ = __prepare_z_log_axis__(l_zlog, VZ)
- if lforce_lim: __force_min_and_max__(rmin, rmax, XF)
- i_x_sbsmp = 1
- dxgap = nmp.amax(VX) - nmp.amin(VX)
- if dxgap > 140.: dx = 5.; i_x_sbsmp = 2
- if dxgap < 50.: dx = 2.
- if dxgap < 25.: dx = 1.
- cbgcol='w'
- if not lkcont:
- cbgcol='k'
- XF = nmp.ma.masked_where(XMSK == 0, XF) ; # Masking where mask is zero!
- fig = plt.figure(num = 1, figsize=(WDTH_DEF , RAT_XY*5.), dpi=None, facecolor='w', edgecolor='k')
- ax = plt.axes([0.07, 0.06, 0.98, 0.88], facecolor=cbgcol)
- vc = __vcontour__(rmin, rmax, dc)
- # Colormap:
- colmap = bcm.chose_colmap(cpal)
- pal_norm = colors.Normalize(vmin = rmin, vmax = rmax, clip = False)
- if lkcont:
- from barakuda_tool import drown
- Xtmp = nmp.zeros(nmp.shape(XF))
- Xtmp[:,:] = XF[:,:]
- drown(Xtmp, XMSK, k_ew=2, nb_max_inc=5, nb_smooth=5)
- cf = plt.contourf(VX, zVZ, Xtmp, vc, cmap=colmap, norm=pal_norm, zorder=0.1)
- plt.contour( VX, zVZ, Xtmp, vc, colors='k', linewidths=0.2, zorder=0.5)
- del Xtmp
- else:
- cf = plt.pcolormesh(VX, zVZ, XF, cmap=colmap, norm=pal_norm)
- # Colorbar:
- __nice_colorbar__(cf, plt, vc, i_sbsmp=i_cb_subsamp, lkc=lkcont, cunit=cbunit, cfont=font_clb, fontsize=10)
- # Masking "rock":
- if lkcont:
- pal_lsm = bcm.chose_colmap('mask')
- norm_lsm = colors.Normalize(vmin = 0., vmax = 1., clip = False)
- prock = nmp.ma.masked_where(XMSK > 0.5, XMSK)
- cm = plt.pcolormesh(VX, zVZ, prock, cmap=pal_lsm, norm=norm_lsm, zorder=1)
- # X-axis:
- if lzonal:
- __nice_longitude_axis__(ax, plt, xmin, xmax, dx*i_x_sbsmp, axt='x')
- else:
- __nice_latitude_axis__(ax, plt, xmin, xmax, dx*i_x_sbsmp, axt='x')
- # Depth-axis:
- __nice_depth_axis__(ax, plt, zmin, zmax, l_log=l_zlog, l_z_inc=l_z_increase, cunit=czunit, cfont=font_xylb)
- plt.title(ctitle, **font_ttl)
- plt.savefig(cfignm+'.'+cfig_type, dpi=DPI_DEF, orientation='portrait', transparent=False) ; #vert_section
- print ' => '+cfignm+'.'+cfig_type+' created!'
- plt.close(1)
- return
- def __2d(self,VX, VY, XF, XMSK, rmin, rmax, dc, corca='ORCA1', lkcont=True, cpal='jet',
- cfignm='fig', cbunit='', ctitle=' ', lforce_lim=False, i_cb_subsamp=1, cb_orient='vertical',
- cfig_type='pdf', lat_min=-75., lat_max=75., lpix=False, vcont_spec = []):
- #
- # Plot nicely a field given on ORCA coordinates on 2D world map without using any projection
- #
- # if VX = [0] and VY = [0] => ignoring lon and lat...
- import barakuda_tool as bt
- import barakuda_orca as bo
- import barakuda_colmap as bcm
- font_ttl, font_xylb, font_clb, font_inf = __font_unity__(fig_dpi=DPI_DEF)
- i_lat_lon = 1
- if len(VX) == 1 or len(VY) == 1: i_lat_lon = 0 ; # no long. and lat. provided !
- if corca[:5] == 'eORCA':
- # don't know how to lat-lon 2d plot eORCA
- # so just plot without projections
- i_lat_lon = 0
- # First drowning the field:
- if not lpix:
- # Don't want to modify XF array, working with XFtmp:
- [ny, nx] = nmp.shape(XF)
- XFtmp = nmp.zeros((ny,nx))
- XFtmp[:,:] = XF[:,:]
- bt.drown(XFtmp, XMSK, k_ew=2, nb_max_inc=20, nb_smooth=10)
- else:
- XFtmp = XF
- ilon_ext = 32
- if lforce_lim: __force_min_and_max__(rmin, rmax, XFtmp)
- XMSK0 = bo.lon_reorg_orca(XMSK, VX, ilon_ext=ilon_ext)
- XF0 = bo.lon_reorg_orca(XFtmp, VX, ilon_ext=ilon_ext)
- if i_lat_lon == 1:
- [ny, nx] = nmp.shape(XF0)
- dlong = abs(VX[11] - VX[10])
- VX0 = nmp.arange(0.,nx)
- VX0 = VX0*dlong + dlong/2.
- if i_lat_lon == 1:
- vert_rat = (lat_max - lat_min)/(75. + 75.)
- fig_size = (WDTH_DEF , RAT_XY*4.76*vert_rat) ; #lolo 4.76 => 1080x520 when on 77S->75N
- else:
- fig_size = (WDTH_DEF , RAT_XY*float(nx)/float(ny)*5.)
- # FIGURE
- # ~~~~~~
- fig = plt.figure(num = 1, figsize=fig_size, dpi=None, facecolor='w', edgecolor='k')
- ax = plt.axes([0.05, 0.06, 1., 0.86], facecolor = '0.5')
- vc = __vcontour__(rmin, rmax, dc)
- # Colmap:
- colmap = bcm.chose_colmap(cpal)
- pal_norm = colors.Normalize(vmin = rmin, vmax = rmax, clip = False)
- if lpix:
- # Pixelized plot:
- XF0 = nmp.ma.masked_where(XMSK0 == 0, XF0)
- if i_lat_lon == 1:
- cf = plt.pcolormesh(VX0, VY, XF0, cmap = colmap, norm = pal_norm)
- else:
- cf = plt.imshow( XF0, cmap = colmap, norm = pal_norm)
- else:
- # Contour fill plot:
- if i_lat_lon == 1:
- cf = plt.contourf(VX0, VY, XF0, vc, cmap = colmap, norm = pal_norm)
- else:
- cf = plt.contourf( XF0, vc, cmap = colmap, norm = pal_norm)
- for c in cf.collections: c.set_zorder(0.15)
- if lkcont:
- if i_lat_lon == 1:
- cfk = plt.contour(VX0, VY, XF0, vc, colors='k', linewidths = 0.2)
- else:
- cfk = plt.contour( XF0, vc, colors='k', linewidths = 0.2)
- for c in cfk.collections: c.set_zorder(0.25)
- # contour for specific values on the ploted field:
- if len(vcont_spec) >= 1:
- if i_lat_lon == 1:
- cfs = plt.contour(VX0, VY, XF0, vcont_spec, colors='black', linewidths = 1.5)
- else:
- cfs = plt.contour( XF0, vcont_spec, colors='black', linewidths = 1.5)
- plt.clabel(cfs, inline=1, fmt='%4.1f', fontsize=10)
- for c in cfs.collections: c.set_zorder(0.35)
- if not lpix:
- # Putting land-sea mask on top of current plot, cleaner than initial masking...
- # because won't influence contours since they are done
- # field needs to be DROWNED prior to this though!!!
- idx_land = nmp.where(XMSK0[:,:] < 0.5)
- XF0 = nmp.ma.masked_where(XMSK0[:,:] > 0.5, XF0)
- XF0[idx_land] = 1000.
- if i_lat_lon == 1:
- cf0 = plt.pcolormesh(VX0, VY, XF0, cmap=bcm.chose_colmap("mask"))
- else:
- cf0 = plt.imshow( XF0, cmap=bcm.chose_colmap("mask"))
- # Colorbar:
- ifsize = 14.*100./float(DPI_DEF)
- if i_lat_lon == 1: ifsize = int(ifsize*vert_rat); ifsize=max(ifsize,6)
- __nice_colorbar__(cf, plt, vc, i_sbsmp=i_cb_subsamp, lkc=lkcont,
- cb_or=cb_orient, cunit=cbunit, cfont=font_clb, fontsize=ifsize)
- # X and Y nice ticks:
- if i_lat_lon == 1:
- [vvx, vvy, clon, clat] = __name_coor_ticks__(lon_ext=ilon_ext);
- plt.yticks(vvy,clat) ; plt.xticks(vvx,clon)
- plt.axis([ 0., 360.+ilon_ext-2., lat_min, lat_max])
- else:
- #ax.set_xlim(0., 360.+ilon_ext-2.)
- plt.axis([ 0., float(nx)+ilon_ext-2., 0, float(ny)])
- plt.title(ctitle, **font_ttl)
- plt.savefig(cfignm+'.'+cfig_type, dpi=DPI_DEF, orientation='portrait', transparent=False) ; #2d
- print ' => '+cfignm+'.'+cfig_type+' created!'
- plt.close(1)
- del XFtmp, XF0
- return
- def __2d_reg(self,VX, VY, XF, XMSK, rmin, rmax, dc, lkcont=False, cpal='jet',
- cfignm='fig', cfig_type='pdf', cbunit=' ', ctitle='',
- cb_orient='vertical', lat_min=-77., lat_max=77., i_cb_subsamp=1,
- lpix=False, l_continent_pixel=True, colorbar_fs=14,
- col_min='k', col_max='k', vcont_spec = []):
- import barakuda_tool as bt
- import barakuda_colmap as bcm
- font_ttl, font_xylb, font_clb, font_inf = __font_unity__()
- # Don't want to modify XF array, working with XFtmp:
- [ny, nx] = nmp.shape(XF)
- XFtmp = nmp.zeros(ny*nx) ; XFtmp.shape = [ny, nx]
- XFtmp[:,:] = XF[:,:]
- # First drowning the field:
- bt.drown(XFtmp, XMSK, k_ew=0, nb_max_inc=20, nb_smooth=10)
- iskp = 28 ; iext = 32
- # Extending / longitude:
- VXe = bt.extend_domain(VX, iext, skp_west_deg=iskp) ; nxe = len(VXe)
- XFe = bt.extend_domain(XFtmp, iext, skp_west_deg=iskp)
- XMSKe = bt.extend_domain(XMSK, iext, skp_west_deg=iskp)
- # FIGURE
- rat_vert = 1. / ( ( 77. + 77. ) / ( lat_max - lat_min ) )
- if cb_orient == 'horizontal':
- # Horizontal colorbar!
- if ctitle == '':
- fig = plt.figure(num = 1, figsize=(12.4,7.*rat_vert), dpi=None, facecolor='w', edgecolor='k')
- ax = plt.axes([0.05, -0.01, 0.93, 1.], facecolor = 'white')
- else:
- fig = plt.figure(num = 1, figsize=(12.4,7.4*rat_vert), dpi=None, facecolor='w', edgecolor='k')
- ax = plt.axes([0.05, -0.01, 0.93, 0.96], facecolor = 'white')
- else:
- # Vertical colorbar!
- fig = plt.figure(num = 1, figsize=(12.4,6.*rat_vert), dpi=None, facecolor='w', edgecolor='k')
- ax = plt.axes([0.046, 0.06, 1.02, 0.88], facecolor = 'white')
- vc = __vcontour__(rmin, rmax, dc)
- # Colmap:
- pal_norm = colors.Normalize(vmin = rmin, vmax = rmax, clip = False)
- mpl.rcParams['contour.negative_linestyle'] = 'solid'
- plt.contour.negative_linestyle='solid'
- if lpix:
- cf = plt.pcolormesh(VXe, VY, XFe, cmap = cpal, norm = pal_norm)
- else:
- cf = plt.contourf(VXe, VY, XFe, vc, cmap = cpal, norm = pal_norm, extend="both")
- for c in cf.collections: c.set_zorder(0.15)
- cf.cmap.set_under(col_min)
- cf.cmap.set_over(col_max)
- # contour for specific values on the ploted field:
- if len(vcont_spec) >= 1:
- cfs = plt.contour(VXe, VY, XFe, vcont_spec, colors='w', linewidths = 1.)
- #plt.clabel(cfs, inline=1, fmt='%4.1f', fontsize=12)
- if lkcont:
- cfk = plt.contour(VXe, VY, XFe, vc, colors='k', linewidths = 0.2)
- for c in cfk.collections: c.set_zorder(0.25)
- # Putting land-sea mask on top of current plot, cleaner than initial masking...
- # because won't influence contours since they are done
- # field needs to be DROWNED prior to this though!!!
- if l_continent_pixel:
- idx_land = nmp.where(XMSKe[:,:] < 0.5)
- XFe = nmp.ma.masked_where(XMSKe[:,:] > 0.5, XFe)
- XFe[idx_land] = 1000.
- cf0 = plt.pcolor(VXe, VY, XFe, cmap = bcm.chose_colmap("mask"))
- else:
- # Masking with contour rather than pixel:
- cf0 = plt.contourf(VXe, VY, XMSKe, [ 0., 0.1 ], cmap = bcm.chose_colmap("mask"))
- for c in cf0.collections: c.set_zorder(5)
- plt.contour(VXe, VY, XMSKe, [ 0.25 ], colors='k', linewidths = 1.)
- # COLOR BAR:
- __nice_colorbar__(cf, plt, vc, i_sbsmp=i_cb_subsamp, lkc=lkcont, cb_or=cb_orient, cunit=cbunit, cfont=font_clb, fontsize=colorbar_fs)
- # X and Y nice ticks:
- print "VXe[0], VXe[nxe-1] =>", VXe[0], VXe[nxe-1]
- rlon_min = round(VXe[0],0) ; rlon_max = round(VXe[nxe-1],0)
- print "rlon_min, rlon_max =>", rlon_min, rlon_max
- [vvx, vvy, clon, clat] = __name_coor_ticks__(lon_min=rlon_min, lon_max=rlon_max, dlon=30., lon_ext=iext-iskp)
- plt.yticks(vvy,clat) ; plt.xticks(vvx,clon)
- plt.axis([ rlon_min, rlon_max, lat_min, lat_max])
- if ctitle != ' ': plt.title(ctitle, **font_ttl)
- plt.savefig(cfignm+'.'+cfig_type, dpi=110, orientation='portrait', transparent=False)
- print ' => '+cfignm+'.'+cfig_type+' created!'
- plt.close(1)
- return
- def __2d_box(self,XF, XMSK, rmin, rmax, dc, lkcont=True,
- cpal='jet', cfignm='fig', cbunit='', ctitle=' ', lforce_lim=False,
- i_cb_subsamp=1, cfig_type='pdf', lcontours=True,
- x_offset=0., y_offset=0., vcont_spec = [], lcont_mask=False):
- import barakuda_colmap as bcm
- if lforce_lim: __force_min_and_max__(rmin, rmax, XF)
- [ ny , nx ] = XF.shape
- vert_rat = float(ny)/float(nx)
- print "Vert. ratio, nx, ny =", vert_rat, nx, ny
- # Masking field:
- if lcontours:
- idxm = nmp.where(XMSK[:,:] == 0); XF[idxm] = -9999.9 # c'est NaN qui merde!!!
- else:
- XF = nmp.ma.masked_where(XMSK == 0, XF)
- font_ttl, font_xylb, font_clb, font_inf = __font_unity__()
- # FIGURE
- # ~~~~~~
- fig = plt.figure(num = 1, figsize=(7.,6.*vert_rat), dpi=None, facecolor='w', edgecolor='k')
- ax = plt.axes([0.07, 0.05, 0.9, 0.9], facecolor = 'gray')
- vc = __vcontour__(rmin, rmax, dc); #print vc, '\n'
- # Colmap:
- colmap = bcm.chose_colmap(cpal)
- pal_norm = colors.Normalize(vmin = rmin, vmax = rmax, clip = False)
- if lcontours:
- cf = plt.contourf(XF, vc, cmap = colmap, norm = pal_norm)
- for c in cf.collections: c.set_zorder(0.5)
- else:
- cf = plt.pcolor(XF, cmap = colmap, norm = pal_norm)
- # contour for specific values on the ploted field:
- if len(vcont_spec) >= 1:
- cfs = plt.contour(XF, vcont_spec, colors='white', linewidths = 1.)
- plt.clabel(cfs, inline=1, fmt='%4.1f', fontsize=10)
- if lkcont:
- cfk = plt.contour(XF, vc, colors='k', linewidths = 0.1)
- for c in cfk.collections: c.set_zorder(0.75)
- # contour for continents:
- if lcontours and lcont_mask:
- cfm = plt.contour(XMSK, [ 0.7 ], colors='k', linewidths = 1.)
- for c in cfm.collections: c.set_zorder(1.)
- # Colorbar:
- __nice_colorbar__(cf, plt, vc, i_sbsmp=i_cb_subsamp, lkc=lkcont, cunit=cbunit, cfont=font_clb)
- if x_offset > 0 or y_offset > 0 : __add_xy_offset__(plt, x_offset, y_offset)
- plt.axis([ 0., nx-1, 0, ny-1])
- plt.title(ctitle, **font_ttl)
- # Prevents from using scientific notations in axess ticks numbering:
- ax.get_xaxis().get_major_formatter().set_useOffset(False)
- plt.savefig(cfignm+'.'+cfig_type, dpi=100, orientation='portrait', transparent=True)
- print ' => '+cfignm+'.'+cfig_type+' created!'
- plt.close(1)
- return
- def __zonal(self,VYn, VZn, VY1=[0.],VZ1=[0.], VY2=[0.],VZ2=[0.], VY3=[0.],VZ3=[0.],
- cfignm='fig_zonal', zmin=-100., zmax=100., dz=25., i_z_jump=1,
- xmin=-90., xmax=90., dx=15., cfig_type='png', cxunit=r'Latitude ($^{\circ}$N)',
- czunit='', ctitle='', lab='', lab1='', lab2='', lab3='', box_legend=(0.6, 0.75),
- loc_legend='lower center', fig_size=FIG_SIZE_DEF):
- font_ttl, font_xylb, font_clb, font_inf = __font_unity__(fig_dpi=DPI_DEF)
- ny = len(VYn)
- if len(VZn) != ny: print 'ERROR: plot_zonal.barakuda_plot => VYn and VZn do not agree in size'; sys.exit(0)
- lp1=False ; lp2=False ; lp3=False
- if len(VZ1) > 1 and len(VZ1)==len(VY1): lp1=True
- if len(VZ2) > 1 and len(VZ2)==len(VY2): lp2=True
- if len(VZ3) > 1 and len(VZ3)==len(VY3): lp3=True
- if fig_size==FIG_SIZE_DEF: fig_size = (fig_size[0], 1.5*fig_size[1]) # extend height if == to default
- # Do we put the legend outside of the plot?
- l_legend_out = False ; y_leg = 0.
- if loc_legend == 'out':
- l_legend_out = True
- y_leg = 0.1 ; # Figure needs to be vertically extended in that case
- fig_size = (fig_size[0],(1.+y_leg)*fig_size[1])
- fig = plt.figure(num = 1, figsize=fig_size, facecolor='w', edgecolor='k')
- ax = plt.axes([0.08, 0.075, 0.9, 0.85])
- plt.plot(VYn, VZn*0.0, 'k', linewidth=1)
- plt.plot(VYn, VZn, 'k', linewidth=3., label=lab)
- if lp1: plt.plot(VY1, VZ1, color=b_red, linewidth=2., label=lab1)
- if lp2: plt.plot(VY2, VZ2, color=b_blu, linewidth=2., label=lab2)
- if lp3: plt.plot(VY3, VZ3, color=b_gre, linewidth=2., label=lab3)
- # X-axis
- __nice_latitude_axis__(ax, plt, xmin, xmax, dx, axt='x')
- # Y-axis:
- __nice_y_axis__(ax, plt, zmin, zmax, dz, i_sbsmp=i_z_jump, cunit=czunit, cfont=font_xylb, dy_minor=0)
- # Legend:
- __fancy_legend__(ax, plt, loc_leg=loc_legend, ylg=y_leg, leg_out=l_legend_out, ncol=1)
- plt.title(ctitle, **font_ttl)
- plt.savefig(cfignm+'.'+cfig_type, dpi=DPI_DEF, orientation='portrait', transparent=False)
- plt.close(1)
- return
- def __nproj(self,czone, rmin, rmax, dc, xlon, xlat, XF,
- cfignm='fig', lkcont=False, cpal='jet', cbunit=' ',
- cfig_type='pdf', ctitle=' ', lforce_lim=False,
- cb_orient='vertical', i_cb_subsamp=1, dpi_fig=DPI_DEF, lpcont=True):
- # Plot projection with basemap...
- #===================================================================================
- # INPUT:
- # xlon and xlat can be 1D or 2D !!!
- #
- # lpcont=True => do contourf
- # lpcont=False => do pcolor
- #
- #===================================================================================
- from mpl_toolkits.basemap import Basemap
- from mpl_toolkits.basemap import shiftgrid
- import barakuda_colmap as bcm
- font_ttl, font_xylb, font_clb, font_inf = __font_unity__(fig_dpi=dpi_fig)
- # For projections :
- vp = __give_proj__(czone) ; # projection information
- # must work with XFtmp rather than XF, because sometimes XF is overwrited...
- [ny, nx] = nmp.shape(XF)
- XFtmp = nmp.zeros(ny*nx) ; XFtmp.shape = [ny, nx]
- XFtmp[:,:] = XF[:,:]
- if len(nmp.shape(xlat)) == 1 and len(nmp.shape(xlon)) == 1:
- if czone == 'kav7' and xlon[0] >= 0.:
- # Shifting data and longitude to be consistent with map projection
- XFtmp, xlon = shiftgrid(180.+xlon[0], XFtmp, xlon, start=False, cyclic=360.0)
- LON_2D, LAT_2D = nmp.meshgrid(xlon,xlat)
- else:
- LAT_2D = nmp.zeros(ny*nx) ; LAT_2D.shape = [ny, nx] ; LAT_2D[:,:] = xlat[:,:]
- LON_2D = nmp.zeros(ny*nx) ; LON_2D.shape = [ny, nx] ; LON_2D[:,:] = xlon[:,:]
- if lforce_lim: __force_min_and_max__(rmin, rmax, XFtmp)
- vc = __vcontour__(rmin, rmax, dc)
- # Colorbar position/size if horizontal
- vcbar = [0.1, 0.08, 0.86, 0.03]
- # Figure/canvas size:
- if cb_orient == 'horizontal':
- if czone == 'natarct':
- vfig_size = [ 5.8, 5.6 ]; vsporg = [0.08, 0.1, 0.9, 0.92]
- vcbar = [0.05, 0.08, 0.9, 0.03]
- if czone == 'npol2':
- vfig_size = [ 4.4, 5.6 ]; vsporg = [0.01, 0.15, 1., 0.8]
- vcbar = [0.05, 0.065, 0.92, 0.03]
- if czone == 'kav7':
- vfig_size = [ 8.1, 5.6 ]; vsporg = [0.001, 0.15, 1., 0.8]
- vcbar = [0.04, 0.08, 0.92, 0.03]
- else:
- # Vertical color bar on the rhs
- rw = 5.
- vfig_size = [ rw, rw ]; vsporg = [0.1, 0.1, 0.85, 0.85]
- if czone == 'nseas': vfig_size = [ rw , 0.7*rw ]; vsporg = [0.08, 0.07, 0.85, 0.85]
- if czone == 'natarct': vfig_size = [ rw , rw ]; vsporg = [0.065, 0.04, 0.95, 0.92]
- if czone == 'spstere': vfig_size = [ rw , 0.76*rw ]; vsporg = [0.11, 0.05, 0.82, 0.89]
- if czone == 'npol2': vfig_size = [ rw , 0.96*rw ] ; vsporg = [0.1, 0.05, 0.86, 0.9]
- fig = plt.figure(num = 1, figsize=(vfig_size), dpi=None, facecolor='w', edgecolor='k')
- ax = plt.axes(vsporg, facecolor = 'w')
- ## Colmap:
- colmap = bcm.chose_colmap(cpal)
- pal_norm = colors.Normalize(vmin = rmin, vmax = rmax, clip = False)
- mpl.rcParams['contour.negative_linestyle'] = 'solid'; plt.contour.negative_linestyle='solid'
- if vp[1] == 'lcc' or vp[1] == 'cyl' :
- carte = Basemap(llcrnrlon=vp[2],llcrnrlat=vp[3],urcrnrlon=vp[4],urcrnrlat=vp[5],\
- resolution=vp[9],area_thresh=1000.,projection=vp[1],\
- lat_1=vp[6],lon_0=vp[7])
- elif vp[1] == 'stere' :
- if vp[0] == 'spstere' or vp[0] == 'npstere':
- carte = Basemap(projection=vp[0], boundinglat=vp[6], lon_0=vp[7], resolution=vp[9])
- else:
- carte = Basemap(llcrnrlon=vp[2],llcrnrlat=vp[3],urcrnrlon=vp[4],urcrnrlat=vp[5],\
- resolution=vp[9],area_thresh=1000.,projection='stere',\
- lat_0=vp[6],lon_0=vp[7])
- elif vp[1] == 'kav' :
- print ' *** plot_nproj.barakuda_plot => Projection '+vp[0]+' / '+str(vp[7])+' / '+vp[9]
- carte = Basemap(projection=vp[0],lon_0=vp[7],resolution=vp[9])
- else:
- print 'ERROR: barakuda_plot.py => proj type '+vp[1]+' unknown!!!'; sys.exit(0)
- x0,y0 = carte(LON_2D,LAT_2D)
- if lpcont:
- cf = carte.contourf(x0, y0, XFtmp, vc, cmap = colmap, norm = pal_norm)
- # Black contours if needed :
- if lkcont:
- ckf = carte.contour(x0, y0, XFtmp, vc, colors='k', linewidths=0.5)
- if cpal != 'ice':
- for c in cf.collections: c.set_zorder(0.5) # Changing zorder so black cont. on top
- for c in ckf.collections: c.set_zorder(1.) # of filled cont. and under continents (zorder 1)
- else:
- cf = carte.pcolor(x0, y0, XFtmp, cmap = colmap, norm = pal_norm)
- carte.drawcoastlines() ; carte.fillcontinents(color='grey') ; carte.drawmapboundary()
- if vp[1] == 'lcc' or vp[1] == 'cyl':
- carte.drawmeridians(nmp.arange(-360,360,vp[8]), labels=[0,0,0,1])
- carte.drawparallels(nmp.arange( -90, 90,vp[8]), labels=[1,0,0,0])
- if vp[1] == 'stere':
- carte.drawmeridians(nmp.arange(-180,180,20), labels=[0,0,0,1])
- carte.drawparallels(nmp.arange( -90, 90,10), labels=[1,0,0,0])
- plt.title(ctitle, **font_ttl)
- # Colorbar:
- if cb_orient == 'horizontal':
- clbax = fig.add_axes(vcbar) # new axes for colorbar!
- __nice_colorbar__(cf, plt, vc, cax_other=clbax, i_sbsmp=i_cb_subsamp, lkc=(lkcont and lpcont), cb_or='horizontal', cunit=cbunit, cfont=font_clb, fontsize=10)
- else:
- __nice_colorbar__(cf, plt, vc, i_sbsmp=i_cb_subsamp, lkc=(lkcont and lpcont), cunit=cbunit, cfont=font_clb, fontsize=12)
- plt.savefig(cfignm+'.'+cfig_type, dpi=dpi_fig, orientation='portrait', transparent=False) ; #, transparent=True, acecolor='w', edgecolor='w',trans
- plt.close(1)
- print ' *** created figure '+cfignm+'.'+cfig_type+'\n'
- del LON_2D, LAT_2D, XFtmp
- return
- def __2d_box_2f(self,XF1, XF2, XMSK, rmin, rmax, dc, vcont_spec2, corca='ORCA1', lkcont=True,
- cpal='jet', cfignm='fig', cbunit='', ctitle=' ', lforce_lim=False,
- i_cb_subsamp=1, cfig_type='pdf', lcontours=True,
- x_offset=0., y_offset=0., vcont_spec1 = []):
- # Take 2 fields as imput and shows contours of second field (vcont_spec2) on top of field 1
- import matplotlib.colors as colors # colmap and co.
- import barakuda_colmap as bcm
- if nmp.shape(XF1) != nmp.shape(XF2):
- print 'ERROR barakuda_plot.plot_2d_box_2f: fields F1 and F2 dont have the same shape!'
- sys.exit(0)
- font_ttl, font_xylb, font_clb, font_inf = __font_unity__()
- if lforce_lim: __force_min_and_max__(rmin, rmax, XF1)
- [ ny , nx ] = XF1.shape
- vert_rat = float(ny)/float(nx)
- print "Vert. ratio, nx, ny =", vert_rat, nx, ny
- # Masking field:
- if lcontours:
- idxm = nmp.where(XMSK[:,:] == 0); XF1[idxm] = -9999.9 # c'est NaN qui merde!!!
- else:
- XF1 = nmp.ma.masked_where(XMSK == 0, XF1)
- # FIGURE
- # ~~~~~~
- fig = plt.figure(num = 1, figsize=(7.,6.*vert_rat), dpi=None, facecolor='w', edgecolor='k')
- ax = plt.axes([0.07, 0.05, 0.9, 0.9], facecolor = 'gray')
- vc = __vcontour__(rmin, rmax, dc); #print vc, '\n'
- # Colmap:
- colmap = bcm.chose_colmap(cpal)
- pal_norm = colors.Normalize(vmin = rmin, vmax = rmax, clip = False)
- if lcontours:
- cf = plt.contourf(XF1, vc, cmap = colmap, norm = pal_norm)
- for c in cf.collections: c.set_zorder(0.5)
- else:
- cf = plt.pcolor(XF1, cmap = colmap, norm = pal_norm)
- # contour for specific values on the ploted field:
- if len(vcont_spec1) >= 1:
- cfs1 = plt.contour(XF1, vcont_spec1, colors='white', linewidths = 1.)
- plt.clabel(cfs1, inline=1, fmt='%4.1f', fontsize=10)
- # Contours of field F2:
- cfs2 = plt.contour(XF2, vcont_spec2, colors=b_red, linewidths = 1.3)
- #plt.clabel(cfs1, inline=1, fmt='%4.1f', fontsize=10)
- if lkcont:
- cfk = plt.contour(XF1, vc, colors='k', linewidths = 0.1)
- for c in cfk.collections: c.set_zorder(0.75)
- # contour for continents:
- if lcontours:
- cfm = plt.contour(XMSK, [ 0.7 ], colors='k', linewidths = 0.4)
- for c in cfm.collections: c.set_zorder(1.)
- # Colorbar:
- __nice_colorbar__(cf, plt, vc, i_sbsmp=i_cb_subsamp, lkc=lkcont, cunit=cbunit, cfont=font_clb)
- if x_offset > 0 or y_offset > 0 : __add_xy_offset__(plt, x_offset, y_offset)
- plt.axis([ 0., nx-1, 0, ny-1])
- plt.title(ctitle, **font_ttl)
- plt.savefig(cfignm+'.'+cfig_type, dpi=100, orientation='portrait', transparent=True)
- print ' => '+cfignm+'.'+cfig_type+' created!'
- plt.close(1)
- del Xtmp
- return
- def __trsp_sig_class(self,VT, vsigma_bounds, XF, rmin, rmax, dc,
- lkcont=True, cpal='sigtr', dt=5., cfignm='fig',
- cfig_type='pdf', ctitle='', vcont_spec1 = [],
- i_cb_subsamp=2):
- # Plot transport by sigma class...
- if nmp.sum(XF) == 0.:
- print '\n WARNING: plot_trsp_sig_class => doing nothing, arrays contains only 0!\n'
- else:
-
- import matplotlib.colors as colors # colmap and co.
- import barakuda_colmap as bcm
-
- font_ttl, font_xylb, font_clb, font_inf = __font_unity__(fig_dpi=DPI_DEF)
-
- fig = plt.figure(num = 1, figsize=(WDTH_DEF , RAT_XY*6.), dpi=None, facecolor='w', edgecolor='k') ; #trsp_sig_class
- ax = plt.axes([0.075, -0.025, 0.9, 0.98], facecolor = 'w')
-
- vc = __vcontour__(rmin, rmax, dc)
-
- nbins = len(vsigma_bounds) - 1
-
- # Colmap:
- colmap = bcm.chose_colmap(cpal)
- pal_norm = colors.Normalize(vmin = rmin, vmax = rmax, clip = False)
- mpl.rcParams['contour.negative_linestyle'] = 'solid'
- plt.contour.negative_linestyle='solid'
-
- #cf = plt.contourf(VT, vsigma_bounds[:-1], XF, vc, cmap = colmap, norm = pal_norm)
- cf = plt.pcolormesh(VT, vsigma_bounds[:-1], XF, cmap = colmap, norm = pal_norm)
- if lkcont:
- cfc = plt.contour(VT, vsigma_bounds[:-1], XF, nmp.arange(-3.,3.,0.5), colors='k', linewidths=0.4)
-
- # contour for specific values on the ploted field:
- if len(vcont_spec1) >= 1:
- cfs1 = plt.contour(VT, vsigma_bounds[:-1], XF, vcont_spec1, colors='white', linewidths = 1.)
- plt.clabel(cfs1, inline=1, fmt='%4.1f', fontsize=11, manual=[(2080,2.)] )
-
- __nice_colorbar__(cf, plt, vc, i_sbsmp=i_cb_subsamp, cb_or='horizontal', cunit='Sv', cfont=font_clb, fontsize=10)
-
- # AXES:
- x1 = int(min(VT)) ; x2 = int(max(VT))+1
- plt.axis([x1, x2, vsigma_bounds[nbins], vsigma_bounds[0]])
-
- __nice_x_axis__(ax, plt, x1, x2, dt, cfont=font_xylb, dx_minor=__time_axis_minor_ticks__(dt))
-
- plt.yticks( nmp.flipud(vsigma_bounds) )
-
- label_big = { 'fontname':'Trebuchet MS', 'fontweight':'normal', 'fontsize':18 }
- plt.ylabel(r'$\sigma_0$', **label_big)
-
- plt.title(ctitle, **font_ttl)
- plt.savefig(cfignm+'.'+cfig_type, dpi=DPI_DEF, orientation='portrait', transparent=False) ; #trsp_sig_class
- print ' => '+cfignm+'.'+cfig_type+' created!'
- plt.close(1)
- return
- def __vert_section_extra(self,VX, VZ, XF, XMSK, Vcurve, rmin, rmax, dc, lkcont=True, cpal='jet', xmin=-80., xmax=85.,
- cfignm='fig', cbunit='', cxunit=' ', zmin = 0., zmax = 5000., l_zlog=False,
- cfig_type='pdf', czunit=' ', ctitle=' ', lforce_lim=False, fig_size=(8.,8.) ):
- import matplotlib.colors as colors # colmap and co.
- import barakuda_colmap as bcm
- zVZ = __prepare_z_log_axis__(l_zlog, VZ)
- XF = nmp.ma.masked_where(XMSK == 0, XF)
- if lforce_lim: __force_min_and_max__(rmin, rmax, XF)
- #
- font_ttl, font_xylb, font_clb, font_inf = __font_unity__()
- fig = plt.figure(num = 1, figsize=fig_size, dpi=None, facecolor='w', edgecolor='k')
- ax = plt.axes([0.1, 0.065, 0.92, 0.89], facecolor = 'gray')
- vc = __vcontour__(rmin, rmax, dc)
- # Colmap:
- colmap = bcm.chose_colmap(cpal)
- pal_norm = colors.Normalize(vmin = rmin, vmax = rmax, clip = False)
- cf = plt.contourf(VX, zVZ, XF, vc, cmap = colmap, norm = pal_norm)
- if lkcont: plt.contour(VX, zVZ, XF, vc, colors='k', linewidths=0.2)
- # Colorbar:
- __nice_colorbar__(cf, plt, vc, i_sbsmp=i_cb_subsamp, cunit=cbunit, cfont=font_clb, fontsize=10)
- # X-axis:
- __nice_x_axis__(ax, plt, xmin, xmax, dx, cunit=cxunit, cfont=font_xylb)
- plt.plot(VX,Vcurve, 'w', linewidth=2)
- for zz in zVZ[:]: plt.plot(VX,VX*0.+zz, 'k', linewidth=0.3)
- # Depth axis:
- __nice_depth_axis__(ax, plt, zmin, zmax, l_log=l_zlog, l_z_inc=False, cunit=czunit, cfont=font_xylb)
- plt.title(ctitle, **font_ttl)
- plt.savefig(cfignm+'.'+cfig_type, dpi=100, orientation='portrait', transparent=True)
- print ' => '+cfignm+'.'+cfig_type+' created!'
- plt.close(1)
- #
- return
- def __hovmoeller(self, VT, VY, XF, XMSK, rmin, rmax, dc, c_y_is='depth',
- lkcont=False, cpal='jet', tmin=0., tmax=50., dt=5,
- ymin=0., ymax=5000., dy=100., l_ylog=False,
- cfignm='fig', cbunit='', ctunit=' ', cfig_type='png',
- cyunit=' ', ctitle=' ', i_cb_subsamp=1,
- l_y_increase=False ):
- #
- # c_y_is : 'depth', 'latitude'
- # lkcont : use contours rather than "pcolormesh"
- #
- import barakuda_colmap as bcm
- font_ttl, font_xylb, font_clb, font_inf = __font_unity__(fig_dpi=DPI_DEF)
- if c_y_is == 'depth':
- zVY = __prepare_z_log_axis__(l_ylog, VY)
- vax = [0.095, 0.06, 0.92, 0.88]
- else:
- zVY = VY
- vax = [0.05, 0.06, 0.98, 0.88]
- # Masking where mask is zero!
- XF = nmp.ma.masked_where(XMSK == 0, XF)
- fig = plt.figure(num = 1, figsize=(WDTH_DEF , RAT_XY*5.), dpi=None, facecolor='w', edgecolor='k')
- ax = plt.axes(vax, facecolor='gray')
- vc = __vcontour__(rmin, rmax, dc)
- # Colormap:
- colmap = bcm.chose_colmap(cpal)
- pal_norm = colors.Normalize(vmin = rmin, vmax = rmax, clip = False)
- if lkcont:
- cf = plt.contourf(VT, zVY, XF, vc, cmap = colmap, norm = pal_norm)
- #plt.contour( VT, zVY, XF, vc, colors='k', linewidths=0.2)
- else:
- cf = plt.pcolormesh(VT, zVY, XF, cmap = colmap, norm = pal_norm)
- __nice_colorbar__(cf, plt, vc, i_sbsmp=i_cb_subsamp, cunit=cbunit, cfont=font_clb, fontsize=10)
- # Time-axis:
- __nice_x_axis__(ax, plt, tmin, tmax, dt, cunit=ctunit, cfont=font_xylb, dx_minor=__time_axis_minor_ticks__(dt))
- # Y-axis:
- if c_y_is == 'depth':
- __nice_depth_axis__(ax, plt, ymin, ymax, l_log=l_ylog, l_z_inc=l_y_increase, cunit=cyunit, cfont=font_xylb)
- elif c_y_is == 'latitude':
- __nice_latitude_axis__(ax, plt, ymin, ymax, dy, axt='y')
- else:
- print 'ERROR: plot_hoevmoller.barakuda_plot => axis "'+c_y_is+'" not supported!'; sys.exit(0)
- plt.title(ctitle, **font_ttl)
- plt.savefig(cfignm+'.'+cfig_type, dpi=DPI_DEF, orientation='portrait', transparent=False) ; #vert_section
- print ' => '+cfignm+'.'+cfig_type+' created!'
- plt.close(1)
- return
- def __oscillation_index(self, VT, VF, ymax=2.5, dy=0.5, yplusminus=0.,
- tmin=0., tmax=0., dt=5,
- cfignm='fig', cfig_type='png', cyunit='', ctitle=''):
- #--------------------------------------------------------------------------------------
- # Plot a ENSO / AMO / PDO -like graph from a time series VF that
- # has already been smoothed and detrended
- #--------------------------------------------------------------------------------------
- font_ttl, font_xylb, font_clb, font_inf = __font_unity__(fig_dpi=DPI_DEF)
- Nt = len(VT)
- if len(VF) != Nt: print 'ERROR: oscillation_index.barakuda_plot => VT and VF do not agree in size'; sys.exit(0)
- vf_plus = nmp.zeros(Nt) ; vf_mins = nmp.zeros(Nt)
- vf_plus[:] = VF[:] ; vf_mins[:] = VF[:]
- vf_plus[nmp.where(VF[:] < 0. )] = 0.
- vf_mins[nmp.where(VF[:] > 0. )] = 0.
- vf_plus[0] = 0. ; vf_mins[0] = 0.
- vf_plus[-1] = 0. ; vf_mins[-1] = 0.
- t1 = tmin ; t2 = tmax
- if tmin == 0. and tmax == 0.:
- t1 = float(int(min(VT)))
- t2 = float(int(round(max(VT),0)))
- fig = plt.figure(num = 2, figsize=FIG_SIZE_DEF, facecolor='w', edgecolor='k')
- ax = plt.axes(AXES_DEF)
- if yplusminus > 0.:
- plt.plot(VT, 0.*VT+yplusminus, 'r--', linewidth=1.5)
- plt.plot(VT, 0.*VT-yplusminus, 'b--', linewidth=1.5)
- plt.fill(VT, vf_plus, b_red, VT, vf_mins, b_blu, linewidth=0)
- plt.plot(VT, VF[:], 'k', linewidth=0.7)
- plt.plot(VT, 0.*VT, 'k', linewidth=0.7)
- __nice_x_axis__(ax, plt, t1, t2, dt, cfont=font_xylb)
- __nice_y_axis__(ax, plt, -ymax, ymax, dy, cunit=cyunit, cfont=font_xylb)
- plt.title(ctitle, **font_ttl)
- plt.savefig(cfignm+'.'+cfig_type, dpi=DPI_DEF, orientation='portrait', transparent=True)
- plt.close(2)
- return
- def __1d_mon_ann(self,VTm, VTy, VDm, VDy, cfignm='fig', dt=5, cyunit='', ctitle='',
- ymin=0, ymax=0, dy=0, i_y_jump=1, mnth_col='b', plt_m03=False, plt_m09=False,
- cfig_type='png', l_tranparent_bg=True, fig_size=FIG_SIZE_DEF, y_cst_to_add=-9999.):
- # if you specify ymin and ymax you can also specify y increment (for y grid) as dy
- #
- # plt_m03 => plot march values on top in green
- # plt_m09 => plot september values on top in green
- font_ttl, font_xylb, font_clb, font_inf = __font_unity__(fig_dpi=DPI_DEF)
- Nt1 = len(VTm) ; Nt2 = len(VTy)
- if len(VTm) != len(VDm): print 'ERROR: plot_1d_mon_ann.barakuda_plot => VTm and VDm do not agree in size'; sys.exit(0)
- if len(VTy) != len(VDy): print 'ERROR: plot_1d_mon_ann.barakuda_plot => VTy and VDy do not agree in size'; sys.exit(0)
- l_add_monthly = True
- if Nt1 == Nt2: l_add_monthly = False
-
- y_leg = 0.
- if plt_m03 or plt_m09:
- # We put the legend outside of the plot...
- y_leg = 0.075*2. ; # Figure needs to be vertically extended in that case
- fig_size = (fig_size[0],(1.+y_leg)*fig_size[1])
- fig = plt.figure(num = 1, figsize=fig_size, facecolor='w', edgecolor='k')
- ax = plt.axes(AXES_DEF) ; #1d_mon_ann
- if mnth_col == 'g': mnth_col = b_gre
- if mnth_col == 'b': mnth_col = b_blu
- if y_cst_to_add > -9000.:
- plt.plot(VTm, VTm*0.+y_cst_to_add, 'k', label=None, linewidth=1.8)
- if l_add_monthly:
- plt.plot(VTm, VDm, mnth_col, label=r'monthly', linewidth=1)
- plt.plot(VTy, VDy, b_red, label=r'annual', linewidth=2)
- ax.get_yaxis().get_major_formatter().set_useOffset(False); # Prevents from using scientific notations in axess ticks numbering
- if l_add_monthly:
- if plt_m03: plt.plot(VTm[2:Nt1:12], VDm[2:Nt1:12], 'orange', label=r'March', linewidth=2)
- if plt_m09: plt.plot(VTm[8:Nt1:12], VDm[8:Nt1:12], 'orange', label=r'September', linewidth=2)
- if plt_m03 or plt_m09:
- box = ax.get_position()
- ax.set_position([box.x0, box.y0 + box.height*y_leg, box.width, box.height*(1.-y_leg)])
- plt.legend(bbox_to_anchor=(0.95, -0.075), ncol=2, shadow=True, fancybox=True)
- # Time bounds for t-axis:
- dcorr = 0.
- x1 = float(int(min(VTy)))
- #x2 = float(int(max(VTy)))
- x2 = round(max(VTy),0)
- #if min(VTy)-x1==0.5:
- #x1 = int(min(VTy)-dcorr)
- #x2 = int(max(VTy)+dcorr)
- mean_val = nmp.mean(VDy)
- df = max( abs(min(VDm)-mean_val), abs(max(VDm)-mean_val) )
-
- if ymin==0 and ymax==0:
- y1, y2, dy = __suitable_axis_dx__(min(VDm)-0.2*df, max(VDm)+0.2*df, nb_val=10.)
- elif dy == 0:
- y1, y2, dy = __suitable_axis_dx__(ymin, ymax, nb_val=10.)
- else:
- y1=ymin ; y2=ymax
- __nice_y_axis__(ax, plt, y1, y2, dy, i_sbsmp=i_y_jump, cunit=cyunit, cfont=font_xylb, dy_minor=0)
- __nice_x_axis__(ax, plt, x1, x2, dt, cfont=font_xylb, dx_minor=__time_axis_minor_ticks__(dt))
- plt.title(ctitle, **font_ttl)
- cf_fig = cfignm+'.'+cfig_type
- plt.savefig(cf_fig, dpi=DPI_DEF, orientation='portrait', transparent=l_tranparent_bg)
- print ' => '+cfignm+'.'+cfig_type+' created!'
- plt.close(1)
- def __1d_multi(self,vt, XD, vlabels, cfignm='fig', dt=5, i_t_jump=1, cyunit=None, ctitle='',
- cfig_type='png', ymin=0, ymax=0, lzonal=False, xmin=0, xmax=0,
- loc_legend='lower center', line_styles=[], fig_size=FIG_SIZE_DEF,
- l_tranparent_bg=True, cxunit=None, lmask=True, cinfo='', y_cst_to_add=-9999.):
- # lzonal => zonally averaged curves...
- if lzonal:
- font_ttl, font_big_fixed, font_xylb, font_clb, font_inf = __font_unity__(fig_dpi=DPI_DEF, size='big')
- else:
- font_ttl, font_xylb, font_clb, font_inf = __font_unity__(fig_dpi=DPI_DEF)
- # Number of lines to plot:
- [ nb_plt, nbt ] = XD.shape
- if len(vt) != nbt: print 'ERROR: plot_1d_multi.barakuda_plot.py => vt and XD do not agree in shape! =>', len(vt), nbt,'\n'; sys.exit(0)
- if len(vlabels) != nb_plt: print 'ERROR: plot_1d_multi.barakuda_plot.py => wrong number of labels...'; sys.exit(0)
- n0 = len(line_styles)
- if n0 > 0 and n0 != nb_plt: print 'ERROR: plot_1d_multi.barakuda_plot.py => wrong number line styles!!!'; sys.exit(0)
- nb_col, nb_row = __nb_col_row_legend__(nb_plt) ; # nb of columns and rows for legend
- # Do we put the legend outside of the plot?
- l_legend_out = False ; y_leg = 0.
- if loc_legend == 'out':
- l_legend_out = True
- y_leg = 0.075*nb_row ; # Figure needs to be vertically extended in that case
- fig_size = (fig_size[0],(1.+y_leg)*fig_size[1])
- # Masking the time-series shorter than others (masked with -999.)
- if lmask: XD = nmp.ma.masked_where(XD < -900., XD)
- if lzonal:
- fig = plt.figure(num = 1, figsize=fig_size, facecolor='w', edgecolor='k')
- ax = plt.axes([0.08, 0.11, 0.88, 0.83])
- else:
- fig = plt.figure(num = 1, figsize=fig_size, facecolor='w', edgecolor='k')
- ax = plt.axes(AXES_DEF) ; #1d_multi
- if y_cst_to_add > -9000.:
- plt.plot(vt, vt*0.+y_cst_to_add, 'k', label=None, linewidth=1.8)
- if lzonal: plt.plot(vt, XD[0,:]*0., 'k', linewidth=1)
-
- if n0 <= 0 and nb_plt > nmax_colors:
- print 'ERROR: plot_1d_multi.barakuda_plot => not enough colors defined in "v_dflt_colors", extend it!!!'
- sys.exit(0)
- for jp in range(nb_plt):
- if n0 > 0:
- plt.plot(vt, XD[jp,:], line_styles[jp], label=vlabels[jp], linewidth=2)
- else:
- plt.plot(vt, XD[jp,:], v_dflt_colors[jp], label=vlabels[jp], linewidth=2)
- #ax.get_yaxis().get_major_formatter().set_useOffset(False) ; # Prevents from using scientific notations in axess ticks numbering
- if lzonal:
- dt = 15. ; # x-axis increment (latitude!)
- if xmin == 0 and xmax == 0:
- x1 = -90. ; x2 = 90.
- else:
- x1 = xmin ; x2 = xmax
- else:
- if xmin == 0 and xmax == 0:
- x1 = int(vt[0])
- x2 = int(round(vt[len(vt)-1]+0.4))
- else:
- x1 = xmin ; x2 = xmax
- if ymin==0 and ymax==0:
- ymin = nmp.min(XD[:,:])
- ymax = nmp.max(XD[:,:])
- ymin, ymax, dy = __suitable_axis_dx__(ymin, ymax, nb_val=10.)
- if lzonal:
- __nice_x_axis__(ax, plt, x1, x2, 10., cunit=r'Latitude ($^{\circ}$N)', cfont=font_xylb, dx_minor=5.)
- else:
- __nice_x_axis__(ax, plt, x1, x2, dt, i_sbsmp=i_t_jump, cunit=cxunit, cfont=font_xylb, dx_minor=__time_axis_minor_ticks__(dt))
- __nice_y_axis__(ax, plt, ymin, ymax, dy, i_sbsmp=1, cunit=cyunit, cfont=font_xylb, dy_minor=0)
- plt.title(ctitle, **font_ttl)
-
- if cinfo != '':
- # Ading info:
- yp = 0.95
- if loc_legend != '0' and l_legend_out: yp = -0.1
- props = dict(boxstyle='round', facecolor='w') ;#, alpha=0.5)
- ax.text(0.05, yp, cinfo, transform=ax.transAxes,
- verticalalignment='top', bbox=props, fontsize=10)
-
- __fancy_legend__(ax, plt, loc_leg=loc_legend, ylg=y_leg, leg_out=l_legend_out, ncol=nb_col)
- cf_fig = cfignm+'.'+cfig_type
- plt.savefig(cf_fig, dpi=DPI_DEF, orientation='portrait', transparent=l_tranparent_bg) ; #1d_multi
- plt.close(1)
- print ' => Multi figure "'+cf_fig+'" created!'
- def __1d(self,vt, VF, cfignm='fig', dt=5, i_t_jump=1, cyunit='', ctitle='',
- cfig_type='png', ymin=0, ymax=0, xmin=0, xmax=0,
- loc_legend='lower center', line_styles='-', fig_size=FIG_SIZE_DEF,
- l_tranparent_bg=False, cxunit='', lmask=True):
- font_ttl, font_xylb, font_clb, font_inf = __font_unity__(fig_dpi=DPI_DEF)
- # Number of lines to plot:
- nbt = len(VF)
- if len(vt) != nbt: print 'ERROR: plot_1d.barakuda_plot.py => vt and VF do not agree in shape!'; sys.exit(0)
- # Masking the time-series shorter than others (masked with -999.)
- if lmask: VF = nmp.ma.masked_where(VF < -900., VF)
- fig = plt.figure(num = 1, figsize=fig_size, facecolor='w', edgecolor='k')
- ax = plt.axes(AXES_DEF) ; #1d
- plt.plot(vt, VF[:], line_styles, linewidth=2)
- ax.get_yaxis().get_major_formatter().set_useOffset(False) ; # Prevents from using scientific notations in axess ticks numbering
- if xmin == 0 and xmax == 0:
- x1 = int(vt[0])
- x2 = int(round(vt[len(vt)-1]+0.4))
- else:
- x1 = xmin ; x2 = xmax
- if ymin==0 and ymax==0:
- mean_val = nmp.mean(VF[:])
- dA = max( abs(nmp.min(VF[:])-mean_val), abs(nmp.max(VF[:])-mean_val) )
- plt.axis( [x1, x2, nmp.min(VF[:])-0.2*dA, nmp.max(VF[:])+0.2*dA] )
- else:
- plt.axis([x1, x2, ymin, ymax])
- print nmp.arange(x1, x2+dt, dt)
- __nice_x_axis__(ax, plt, x1, x2, dt, i_sbsmp=i_t_jump, cfont=font_xylb)
- if cyunit != '': plt.ylabel('('+cyunit+')', **font_xylb)
- if cxunit != '': plt.xlabel('('+cxunit+')', **font_xylb)
- plt.title(ctitle, **font_ttl)
- cf_fig = cfignm+'.'+cfig_type
- plt.savefig(cf_fig, dpi=DPI_DEF, orientation='portrait', transparent=l_tranparent_bg) ; #1d
- plt.close(1)
- print ' => Multi figure "'+cf_fig+'" created!'
- def __spectrum(self,vfrq, Vspec, cfignm='fig', cyunit='', log_x=True, log_y=False,
- year_min=3., year_max = 50., rmax_amp = 10., rmin_amp = 0.,
- cfig_type='png', vnoise=[ 0 ], vrci95=[ 0 ], lab95_xpos=0.5, lplot_1onF=False,
- cnoise='White noise', lplot_freq_ax=True):
- l_do_ci95 = False ; l_do_ci95m = False
- nnoise = len(vnoise); nl95 = len(vrci95)
- if nnoise != 1 and nl95 != 1:
- if nl95 != len(Vspec) or nl95 != nnoise:
- print "ERROR: plot_spectrum.barakuda_plot.py => length of 95 CI array and/or noise array doesnt match spectrum length!"
- sys.exit(0)
- l_do_ci95 = True
- l_do_ci95m = True
- font_ttl, font_xylb, font_clb, font_inf = __font_unity__()
- print "avant:", rmin_amp, rmax_amp
- if log_y:
- if rmin_amp <= 0.: rmin_amp = 0.01
- rmin_amp = 20.*nmp.log10(rmin_amp); rmax_amp = 20.*nmp.log10(rmax_amp)
- print "apres:", rmin_amp, rmax_amp
- # Spectral axis:
- x_min = 1./year_max ; x_max = 1./year_min ; # min and max in frequency!
- clbnd = str(int(round(year_min)))
- if log_x:
- cvee = [ '50','45','40','35','30','25','22','20','17','15','13','12','11','10','9','8','7','6','5','4','3' ]
- if year_max == 40.: cvee = cvee[2:]
- if year_max == 35.: cvee = cvee[3:]
- if year_min == 5.: cvee = cvee[:-2]
- else:
- cvee = [ '50','30','20','15','12','10','9','8','7','6','5','4', '3' ]
- lvee = []
- civee = []
- for ce in cvee:
- lvee.append(float(ce))
- civee.append(str(round(1./float(ce),3)))
- vee = nmp.asarray(lvee)
- print civee[:]
- rnoise = nmp.mean(vnoise[5:20])
- rrci95 = nmp.mean(vrci95[5:20])
- fig = plt.figure(num = 1, figsize=(8.,4.), facecolor='w', edgecolor='k')
- if lplot_freq_ax:
- ax = plt.axes([0.069, 0.13, 0.9, 0.8])
- else:
- ax = plt.axes([0.08, 0.13, 0.9, 0.83])
- if log_x:
- ifr1 = 1
- vfl = nmp.log10(vfrq[ifr1:])
- if not log_y:
- if l_do_ci95:
- plt.plot(vfl, vnoise[ifr1:], '--k' , linewidth=1.8, label=cnoise)
- plt.plot(vfl, vnoise[ifr1:]+vrci95[ifr1:], '0.4', linewidth=1.8, label='95% CI')
- plt.plot(vfl, vnoise[ifr1:]-vrci95[ifr1:], '0.4', linewidth=1.8)
- plt.plot(vfl, Vspec[ifr1:], '*-k', linewidth=2.)
- #if lplot_1onF: plt.plot(vfl, 1./vfl, b_red, linewidth=2)
- else:
- if l_do_ci95:
- plt.plot(vfl, 20.*nmp.log10(vnoise[ifr1:]), '--k' , linewidth=1.8, label=cnoise)
- plt.plot(vfl, 20.*nmp.log10(vnoise[ifr1:]+vrci95[ifr1:]), '0.4', linewidth=1.8, label='95% CI')
- plt.plot(vfl, 20.*nmp.log10(vnoise[ifr1:]-vrci95[ifr1:]), '0.4', linewidth=1.8)
- plt.plot(vfl, 20.*nmp.log10(Vspec[ifr1:]), '*-k', linewidth=2.)
- else:
- if not log_y:
- if l_do_ci95:
- plt.plot(vfrq, vnoise, '--k' , linewidth=1.8)
- plt.plot(vfrq, vnoise+vrci95, '0.4', linewidth=1.8)
- plt.plot(vfrq, vnoise-vrci95, '0.4', linewidth=1.8)
- plt.plot(vfrq, Vspec, '*-k', linewidth=2)
- if lplot_1onF: plt.plot(vfrq[1:], 0.03*1./vfrq[1:], b_red, linewidth=2)
- else:
- if l_do_ci95:
- plt.plot(vfrq, 20.*nmp.log10(vnoise), '--k' , linewidth=1.8)
- plt.plot(vfrq, 20.*nmp.log10(vnoise+vrci95), '0.4', linewidth=1.8)
- plt.plot(vfrq, 20.*nmp.log10(vnoise-vrci95), '0.4', linewidth=1.8)
- plt.plot(vfrq, 20.*nmp.log10(Vspec), '*-k', linewidth=2)
- plt.ylabel('Amplitude Spectrum ('+cyunit+')', color='k', **font_xylb)
- plt.xlabel('Period (years)', color='k', **font_xylb)
- if log_x:
- x1=nmp.log10(x_max) ; x2=nmp.log10(x_min)
- plt.axis([x1, x2, rmin_amp, rmax_amp])
- if lplot_freq_ax:
- plt.xticks(nmp.log10(1./vee[:]),cvee[:])
- else:
- print ''
- vee_n = nmp.arange(vee[0], vee[len(vee)-1]-1, -1.)
- print vee_n[:]
- cvee_n = []
- for rr in vee_n:
- cr = str(int(rr))
- if cr in cvee:
- cvee_n.append(cr)
- else:
- cvee_n.append('')
- print 'cvee =>', cvee[:]
- print 'cvee_n =>', cvee_n[:]
- plt.xticks(nmp.log10(1./vee_n[:]),cvee_n[:])
- else:
- x1=x_max; x2=x_min
- plt.axis([x1, x2, rmin_amp, rmax_amp])
- plt.xticks(1./vee[:],cvee[:], color='k')
- ax.grid(color='0.4', linestyle='-', linewidth=0.3)
- plt.legend(loc='upper left', shadow=False, fancybox=True)
- if lplot_freq_ax:
- ax2 = ax.twiny()
- ax2.set_xlabel('Frequency (cpy)', color='k', **font_xylb)
- if log_x:
- plt.axis([x1, x2, rmin_amp, rmax_amp])
- for jp in range(1,18,2): civee[jp] = ''
- plt.xticks(nmp.log10(1./vee[:]),civee)
- #ax2.xaxis.set_ticks(nmp.log10(1./vee[:]))
- else:
- plt.axis([x1, x2, rmin_amp, rmax_amp])
- plt.xticks(1./vee[:],civee)
- for t in ax2.get_xticklabels(): t.set_fontsize(14)
- ax2.xaxis.labelpad = 12 ; # move label upwards a bit...
- plt.savefig(cfignm+'.'+cfig_type, dpi=100, facecolor='w', edgecolor='w', orientation='portrait', transparent=False)
- plt.close(1)
- def __del__(self) :
- plot.__counter -= 1
- #
- def __pow_spectrum_ssh(self, vk1, vps1, clab1=None, clr1=b_gre, lw1=6, \
- cfig_name='fig_spectrum_SSH.png', cinfo='', logo_on=True, \
- L_min=7., L_max=5000., P_min_y=-6, P_max_y=6, \
- l_show_k11o3=False, l_show_k5=False, l_show_k4=False, l_show_k2=False, \
- vk2=[], vps2=[], clab2=None, clr2=b_org, lw2=3, \
- vk3=[], vps3=[], clab3=None, clr3=b_blu, lw3=4, \
- vk4=[], vps4=[], clab4=None, clr4='0.5', lw4=3 ):
- #------------------------------------------------------------------
- ## L_min=7. ; L_max : min and max wave-length for x-axis (km)
- #------------------------------------------------------------------
- #
- # r2Pi = 2.*nmp.pi # k is in rad/[space unit]
- r2Pi = 1. # k is in cycle/[space unit]
- #
- font_ttl, font_xylb, font_clb, font_inf = __font_unity__(fig_dpi=80)
- #
- # x-axis (lambda):
- k_min = r2Pi/L_max ; k_max = r2Pi/L_min
- xdef_l = nmp.asarray([ 4000., 2500., 1500., 1000., 700., 500., 300., 200., 150., 100., 70., 50., 40., 25., 15., 10., 7., 5., 4., 3., 2. ])
- (idx1,) = nmp.where(xdef_l>L_max) ; (idx2,) = nmp.where(xdef_l<L_min)
- xtcks_l = nmp.delete(xdef_l,nmp.concatenate((idx1,idx2)))
- cxtcks_l = []
- for rr in xtcks_l: cxtcks_l.append(str(int(rr)))
- xtcks_k = r2Pi/xtcks_l
- fig = plt.figure(num = 1, figsize=(9.,9.), facecolor='w', edgecolor='k')
- ax = plt.axes([0.1, 0.07, 0.875, 0.86])
- if len(vk3) > 1 and len(vps3) > 1:
- plt.plot(nmp.log10(vk3), nmp.log10(vps3), '-', color=clr3, linewidth=lw3, label=clab3, zorder=10)
- if len(vk2) > 1 and len(vps2) > 1:
- plt.plot(nmp.log10(vk2), nmp.log10(vps2), '-', color=clr2, linewidth=lw2, label=clab2, zorder=15)
- if len(vk4) > 1 and len(vps4) > 1:
- plt.plot(nmp.log10(vk4), nmp.log10(vps4), '-', color=clr4, linewidth=lw4, label=clab4, zorder=4)
- plt.plot( nmp.log10(vk1), nmp.log10(vps1), '-', color=clr1, linewidth=lw1, label=clab1, zorder=5)
- nl = len(vk1)
- #i1=4 ; i2=nl-0.4*nl ; rfct = 1.
- i1=int(0.53*float(nl)) ; i2=nl ; rfct = 3.
- if l_show_k2:
- plt.plot(nmp.log10(vk1[i1:i2]), nmp.log10((vk1[i1:i2]**-2.)/(rfct*1.E7)), '--', color='k', linewidth=2, label=r'k$^\mathregular{-2}$', zorder=2)
- if l_show_k4:
- plt.plot(nmp.log10(vk1[i1:i2]), nmp.log10((vk1[i1:i2]**-4.)/(rfct*3.E8)), '-', color='0.6', linewidth=2, label=r'k$^\mathregular{-4}$', zorder=1)
- if l_show_k5:
- plt.plot(nmp.log10(vk1[i1:i2]), nmp.log10((vk1[i1:i2]**-5.)/(rfct*2.E10)), '--', color='0.6', linewidth=2, label=r'k$^\mathregular{-5}$', zorder=2)
- if l_show_k11o3:
- plt.plot(nmp.log10(vk1[i1:i2]), nmp.log10((vk1[i1:i2]**(-11./3.))/(rfct*1.E9)), '-.', color='0.6', linewidth=2, label=r'k$^\mathregular{-11/3}$', zorder=2)
-
- # Bottom X-axis:
- plt.xticks( nmp.log10(xtcks_k), cxtcks_l)
- ax.set_xlim(nmp.log10(k_min), nmp.log10(k_max))
- ax.grid(color='k', linestyle='-', linewidth=0.2)
- plt.xlabel('Wave-length [km]')
- #
- # Y-axis:
- ax.set_ylim(P_min_y,P_max_y)
- cytcks = []
- for ii in range(P_min_y,P_max_y+1): cytcks.append(r'$\mathregular{10^{'+str(ii)+'}}$')
- plt.yticks( nmp.arange(P_min_y,P_max_y+1,1) , nmp.asarray(cytcks))
- plt.ylabel(r'SSH PSD [$\mathregular{m^2}$/(cy/km)]', color='k')
- #
- if clab1 != None: plt.legend(loc='best', shadow=True, fancybox=True) ; #lulu
- #
- # Top X-axis:
- ax2 = ax.twiny()
- P_max_x = 1 ; P_min_x = -4
- cxtcks_k = []
- for ii in range(P_min_x,P_max_x+1): cxtcks_k.append(r'$\mathregular{10^{'+str(ii)+'}}$')
- plt.xticks( nmp.arange(P_min_x,P_max_x+1,1) , nmp.asarray(cxtcks_k))
- ax2.set_xlim(nmp.log10(k_min), nmp.log10(k_max))
- #ax2.grid(color='0.3', linestyle='--', linewidth=0.2)
- [t.set_color('0.3') for t in ax2.xaxis.get_ticklabels()]
- plt.xlabel('Wave-number [cy/km]', color='0.3')
- #
- if cinfo != '': ax2.annotate(cinfo, xy=(0.08, 0.24), xycoords='axes fraction', bbox={'facecolor':clr_inf_box, 'alpha':1., 'pad':10}, zorder=100, **font_inf)
- #
- if logo_on:
- fon = { 'fontname':'Arial', 'fontweight':'normal', 'fontsize':10 }
- ax2.annotate('© Ocean Next, 2018', xy=(0.84, -0.06), xycoords='axes fraction', color='0.5', zorder=100, **fon)
- #
- plt.savefig(cfig_name, dpi=120, facecolor='w', edgecolor='w', orientation='portrait')
- plt.close(1)
- return 0
-
-
-
-
- # LOCAL functions
- # ===============
- def __get_mat__(cf):
- f1 = open(cf, 'r')
- lines1=f1.readlines()
- f1.close()
- zm = [] ; jy = 0
- for l in lines1:
- if l[0] != '#':
- jy = jy + 1
- ls = l.split()
- zm.append([])
- for c in ls:
- zm[jy-1].append(float(c))
- zxm = array(zm)
- print 'Shape zxm = ',nmp.shape(zxm), '\n'
- return zxm
- def __vcontour__(zmin, zmax, zdc):
- if (zmin,zmax) == (0.,0.) or (zmin,zmax) == (0,0):
- vcont = [0.]
- else:
- lngt = zmax - zmin
- ncont = lngt/zdc
- vcont = nmp.arange(zmin, zmax + zdc, zdc)
- return vcont
- def __name_longitude_ticks__(lon_min=0., lon_max=360., dlon=30., lon_ext=0):
- #
- # Builds nice ticks for X (lon) axis!
- #
- # Arrange longitude axis !
- VX = nmp.arange(lon_min, lon_max+lon_ext+dlon, dlon); VX0 = nmp.arange(lon_min, lon_max+lon_ext+dlon, dlon);
- ivf = nmp.where(VX>180); VX0[ivf] = VX[ivf] - 360
- cn_lon = []
- for rlon in VX0:
- jlon = int(rlon)
- if jlon < 0:
- cn_lon.append(str(-jlon)+r'$^{\circ}$W')
- else:
- if jlon == 0:
- cn_lon.append(str(jlon)+r'$^{\circ}$')
- else:
- cn_lon.append(str(jlon)+r'$^{\circ}$E')
- return VX, cn_lon
- def __name_latitude_ticks__(lat_min=-90., lat_max=90., dlat=15.):
- #
- # Builds nice ticks for Y (lat) axis!
- #
- # Arrange latitude axis !
- VY = nmp.arange(lat_min, lat_max+dlat, dlat)
- cn_lat = []
- for rlat in VY:
- jlat = int(rlat)
- if jlat < 0:
- cn_lat.append(str(-jlat)+r'$^{\circ}$S')
- else:
- if jlat == 0:
- cn_lat.append(str(jlat)+r'$^{\circ}$')
- else:
- cn_lat.append(str(jlat)+r'$^{\circ}$N')
- return VY, cn_lat
- def __name_coor_ticks__(lon_min=0., lon_max=360., dlon=30., lat_min=-90., lat_max=90., dlat=15., lon_ext=0):
- # Builds nice ticks for X and Y (lon, lat) axes!
- VX, cn_lon = __name_longitude_ticks__(lon_min=lon_min, lon_max=lon_max, dlon=dlon, lon_ext=lon_ext)
- VY, cn_lat = __name_latitude_ticks__(lat_min=lat_min, lat_max=lat_max, dlat=dlat)
- return VX, VY, cn_lon, cn_lat
- def __give_proj__(cname):
- nb =nmp.shape(projection_def)[0]
- vproj = [ 'NC', 'NC', 0., 0., 0., 0., 0., 0., 'NC' ]
- jb = 0
- while jb < nb :
- if projection_def[jb][0] == cname:
- break
- else :
- jb = jb + 1
- if jb == nb :
- print 'Zone "'+cname+'" does not exist!\n'
- print 'so far choice is :'
- for jb in range(nb): print projection_def[jb][0]
- sys.exit(0)
- vproj = projection_def[jb][:]
- return vproj
- def __font_unity__(fig_dpi=100., size='normal'):
- rat = 100./float(fig_dpi)
- if size == 'big': rat = 1.25*rat
- params = { 'font.family':'Trebuchet MS',
- 'font.size': int(13.*rat),
- 'legend.fontsize': int(13.*rat),
- 'xtick.labelsize': int(13.*rat),
- 'ytick.labelsize': int(13.*rat),
- 'axes.labelsize': int(13.*rat),
- 'legend.facecolor': 'white',
- 'figure.facecolor': 'white' }
- mpl.rcParams.update(params)
- title_fonts = { 'fontname':'Trebuchet MS' , 'fontweight':'normal', 'fontsize':int(15.*rat) }
- label_fonts = { 'fontname':'Trebuchet MS' , 'fontweight':'normal', 'fontsize':int(14.*rat) }
- colorbar_fonts = { 'fontname':'Trebuchet MS' , 'fontweight':'normal', 'fontsize':int(13.*rat) }
- info_fonts = { 'fontname':'Ubuntu Mono' , 'fontweight':'normal', 'fontsize':int(13.*rat) }
- return title_fonts, label_fonts, colorbar_fonts, info_fonts
- def __force_min_and_max__(rm, rp, Xin):
- idx_bad = nmp.where(nmp.logical_not(nmp.isfinite(Xin)))
- Xin[idx_bad] = 0.
- idx1 = nmp.where(Xin <= rm); Xin[idx1] = rm + abs(rp-rm)*1.E-4
- idx2 = nmp.where(Xin >= rp); Xin[idx2] = rp - abs(rp-rm)*1.E-4
- Xin[idx_bad] = nmp.nan
- def __subsample_colorbar__(i_sbsmp, vcc, clb_hndl, cb_or='vertical'):
- cb_labs = []
- # First checking if vcc countains integers or not...
- lcint = False
- vc = vcc.astype(nmp.int64) ; # integer version of vcc
- if nmp.max(nmp.abs(vcc))>5 and nmp.sum(vcc-vc) == 0. : lcint=True
- cpt = 0
- nn = int(round(abs(vcc[-1]-vcc[0])/abs(vcc[0]-vcc[1]),0))
- if nn % 2 != 0: cpt = 1
- for rr in vcc:
- if cpt % i_sbsmp == 0:
- if lcint:
- cr = str(int(rr))
- else:
- cr = str(round(float(rr),6))
- cb_labs.append(cr)
- else:
- cb_labs.append(' ')
- cpt = cpt + 1
- if cb_or == 'horizontal':
- clb_hndl.ax.set_xticklabels(cb_labs)
- else:
- clb_hndl.ax.set_yticklabels(cb_labs)
- del cb_labs, vc
- def __nice_colorbar__(fig_hndl, plt_hndl, vcc,
- cax_other=None, i_sbsmp=1, lkc=False, cb_or='vertical', cunit=None, cfont=None, fontsize=0):
- if cb_or not in {'horizontal','vertical'}:
- print "ERROR: only 'vertical' or 'horizontal' can be specified for the colorbar orientation!"
- cb_or = 'vertical'
- if cb_or == 'horizontal':
- if cax_other is not None:
- clb = plt_hndl.colorbar(fig_hndl, cax=cax_other, ticks=vcc, drawedges=lkc, orientation='horizontal',
- pad=0.07, shrink=1., aspect=40, extend='both')
- else:
- clb = plt_hndl.colorbar(fig_hndl, ticks=vcc, drawedges=lkc, orientation='horizontal',
- pad=0.07, shrink=1., aspect=40, extend='both')
- else:
- if cax_other is not None:
- clb = plt_hndl.colorbar(fig_hndl, cax=cax_other, ticks=vcc, drawedges=lkc,
- pad=0.03, extend='both')
- else:
- clb = plt_hndl.colorbar(fig_hndl, ticks=vcc, drawedges=lkc,
- pad=0.03, extend='both')
- if i_sbsmp > 1: __subsample_colorbar__(i_sbsmp, vcc, clb, cb_or=cb_or)
- if not cunit is None:
- if cfont is None:
- clb.set_label(cunit)
- else:
- clb.set_label(cunit, **cfont)
- if fontsize > 0:
- if cb_or == 'horizontal':
- for t in clb.ax.get_xticklabels(): t.set_fontsize(fontsize) # Font size for colorbar ticks!
- else:
- for t in clb.ax.get_yticklabels(): t.set_fontsize(fontsize) # Font size for colorbar ticks!
- def _add_xy_offset__(plt_hndl, ixo, iyo):
- if ( ixo != 0. ):
- locs, labels = plt_hndl.xticks() ; jl=0
- vlabs = []
- for ll in locs:
- clab = str(int(locs[jl])+int(ixo))
- vlabs.append(clab); jl=jl+1
- plt_hndl.xticks(locs,vlabs)
- if ( y_offset != 0. ):
- locs, labels = plt_hndl.yticks() ; jl=0; vlabs = []
- for ll in locs:
- clab = str(int(locs[jl])+int(iyo))
- vlabs.append(clab); jl=jl+1
- plt_hndl.yticks(locs,vlabs)
- del vlabs
- def __subsample_axis__(plt_hndl, cax, i_sbsmp, icpt=1):
- ax_lab = []
- if cax == 'x':
- locs, labels = plt_hndl.xticks()
- elif cax == 'y':
- locs, labels = plt_hndl.yticks()
- else:
- print ' Error: __subsample_axis__.barakuda_plot => only "x" or "y" please'; sys.exit(0)
- cpt = icpt # with ipct = 1: tick priting will start at y1+dt on x axis rather than y1
- for rr in locs:
- if cpt % i_sbsmp == 0:
- if rr%1.0 == 0.:
- cr = str(int(rr)) # it's something like 22.0, we want 22 !!!
- else:
- cr = str(rr)
- ax_lab.append(cr)
- else:
- ax_lab.append(' ')
- cpt = cpt + 1
- if cax == 'x': plt_hndl.xticks(locs,ax_lab)
- if cax == 'y': plt_hndl.yticks(locs,ax_lab)
- del ax_lab
- def __nice_x_axis__(ax_hndl, plt_hndl, x_0, x_H, dx, i_sbsmp=1, cunit=None, cfont=None, dx_minor=0):
- x_l = x_0
- if x_0%dx != 0.: x_l = float(int(x_0/dx))*dx
- if x_H%dx != 0.: x_H = float(int(x_H/dx)+1)*dx
- plt_hndl.xticks( nmp.arange(x_l, x_H+dx, dx) )
- locs, labels = plt_hndl.xticks()
- ax_hndl.get_xaxis().get_major_formatter().set_useOffset(False) ; # Prevents from using scientific notations in axess ticks numbering...
- if i_sbsmp > 1: __subsample_axis__( plt, 'x', i_sbsmp)
- if not cunit is None:
- if cfont is None:
- plt_hndl.xlabel(cunit)
- else:
- plt_hndl.xlabel(cunit, **cfont)
- # Add minor x-ticks and corresponding grid:
- if dx_minor > 0:
- locs, labels = plt_hndl.xticks()
- ax_hndl.set_xticks( nmp.arange(locs[0], locs[len(locs)-1] , dx_minor) , minor=True)
- ax_hndl.grid(which='both')
- ax_hndl.grid(which='minor', color='k', linestyle='-', linewidth=0.1)
- ax_hndl.grid(which='major', color='k', linestyle='-', linewidth=0.2)
- ax_hndl.set_xlim(x_l,x_H+dx/1000.)
- def __nice_y_axis__(ax_hndl, plt_hndl, y_0, y_H, dy, i_sbsmp=1, cunit=None, cfont=None, dy_minor=0):
- y_l = y_0
- if y_0%dy != 0.: y_l = float(int(y_0/dy))*dy
- plt_hndl.yticks( nmp.arange(y_l, y_H+dy, dy) )
- locs, labels = plt_hndl.yticks()
- ax_hndl.get_yaxis().get_major_formatter().set_useOffset(False) ; # Prevents from using scientific notations in axess ticks numbering...
- if i_sbsmp > 1: __subsample_axis__( plt, 'y', i_sbsmp)
- if not cunit is None:
- if cfont is None:
- plt_hndl.ylabel(cunit)
- else:
- plt_hndl.ylabel(cunit, **cfont)
- # Add minor y-ticks and corresponding grid:
- if dy_minor > 0:
- locs, labels = plt_hndl.yticks()
- ax_hndl.set_yticks( nmp.arange(locs[0], locs[len(locs)-1] , dy_minor) , minor=True)
- ax_hndl.grid(which='both')
- ax_hndl.grid(which='minor', color='k', linestyle='-', linewidth=0.1)
- ax_hndl.grid(which='major', color='k', linestyle='-', linewidth=0.2)
- ax_hndl.set_ylim(y_0,y_H+dy/1000.)
- def __nice_depth_axis__(ax_hndl, plt_hndl, z0, zK, l_log=False, l_z_inc=True, cunit=None, cfont=None):
- ax_hndl.get_yaxis().get_major_formatter().set_useOffset(False)
- if l_log:
- y_log_ofs = 10.
- vyview_list = [ 3. , 10. , 25., 50. , 100. , 250. , 500. , 1000. , 2500., 5000. ]
- nd = len(vyview_list)
- vyview = nmp.zeros(nd)
- for jn in range(nd): vyview[jn] = vyview_list[jn]
- vyview_log = nmp.log10(vyview + y_log_ofs)
- ylab = []
- for rr in vyview_list: ylab.append(str(int(rr)))
- z0 = nmp.log10(z0+y_log_ofs)
- zK = nmp.log10(zK+y_log_ofs)
- ax_hndl.set_yticks(vyview_log)
- ax_hndl.get_yaxis().set_major_formatter(mpl.ticker.ScalarFormatter())
- ax_hndl.set_yticklabels(ylab)
- if l_z_inc:
- ax_hndl.set_ylim(z0,zK)
- else:
- ax_hndl.set_ylim(zK+(zK-z0)/50. , z0)
- ax_hndl.grid(color='k', linestyle='-', linewidth=0.5)
- if not cunit is None:
- if cfont is None:
- plt_hndl.ylabel(cunit)
- else:
- plt_hndl.ylabel(cunit, **cfont)
- def __nice_latitude_axis__(ax_hndl, plt_hndl, lmin, lmax, dl, axt='x'):
- if axt == 'x':
- ax_hndl.get_xaxis().get_major_formatter().set_useOffset(False)
- elif axt == 'y':
- ax_hndl.get_yaxis().get_major_formatter().set_useOffset(False)
- else:
- print 'ERROR barakuda_plot.__nice_latitude_axis__: only accept "x" or "y" for axt!'
- sys.exit(0)
- [vvl, ctck] = __name_latitude_ticks__(lat_min=lmin, lat_max=lmax, dlat=dl)
- if axt == 'x':
- plt_hndl.xticks(vvl,ctck)
- ax_hndl.set_xlim(lmin,lmax)
- else:
- plt_hndl.yticks(vvl,ctck)
- ax_hndl.set_ylim(lmin,lmax)
- def __nice_longitude_axis__(ax_hndl, plt_hndl, lmin, lmax, dl, axt='x'):
- if axt == 'x':
- ax_hndl.get_xaxis().get_major_formatter().set_useOffset(False)
- elif axt == 'y':
- ax_hndl.get_yaxis().get_major_formatter().set_useOffset(False)
- else:
- print 'ERROR barakuda_plot.__nice_longitude_axis__: only accept "x" or "y" for axt!'
- sys.exit(0)
- [vvl, ctck] = __name_longitude_ticks__(lon_min=lmin, lon_max=lmax, dlon=dl)
- if axt == 'x':
- plt_hndl.xticks(vvl,ctck)
- ax_hndl.set_xlim(lmin,lmax)
- else:
- plt_hndl.yticks(vvl,ctck)
- ax_hndl.set_ylim(lmin,lmax)
- def __prepare_z_log_axis__(l_log, vz):
- import math
- nk = len(vz)
- zvz = nmp.zeros(nk)
- if l_log:
- for jk in range(nk):
- zvz[jk] = math.log10(vz[jk])
- else:
- zvz= vz
- return zvz
- def __nb_col_row_legend__(nn):
- if nn <= 3:
- nbc = 1 ; nbr = nn
- elif nn == 4:
- nbc = 2 ; nbr = 2
- elif nn > 4 and nn <= 6:
- nbc = 2 ; nbrfull = 2; nfull = nbc*nbrfull; nbr = nbrfull + nn/nfull
- elif nn > 6 and nn <= 9:
- nbc = 3 ; nbrfull = 2; nfull = nbc*nbrfull; nbr = nbrfull + nn/nfull
- elif nn > 9 and nn <= 16:
- nbc = 4 ; nbrfull = 3; nfull = nbc*nbrfull; nbr = nbrfull + nn/nfull
- else:
- nbc = 4 ; nbr = nn/nbc + 1
- return nbc, nbr
- def __time_axis_minor_ticks__(dt):
- dt_mnr=0
- if ((dt>=2) and (dt<10) and (dt%2 == 0)) or (dt==5) : dt_mnr=1
- if (dt>=10) and (dt<50) and (dt%5 == 0) : dt_mnr=5
- if (dt>=50) and (dt%50 == 0) : dt_mnr=10
- return dt_mnr
- def __suitable_axis_dx__(hmin, hmax, nb_val=20, lsym0=False):
- if (hmin,hmax) == (0.,0.) or (hmin,hmax) == (0,0):
- dh = 0.
- else:
- dh = abs(hmax - hmin)/float(nb_val)
- lfound = False
- iexp = 20
- while not lfound :
- if dh%(10.**(iexp-1)) != dh: lfound = True
- iexp = iexp - 1
- if iexp < 1:
- dh = round(dh, -iexp)
- else:
- dh = round(dh,0)
- dh = round(dh/(10.**iexp),0)*10.**iexp
-
- dhi = dh*10.**(-iexp)
- if dhi == 3.: dh = 2.5*10.**(iexp)
- if dhi in [4.,6.,7.]: dh = 5.*10.**(iexp)
- if dhi in [8.,9.]: dh = 10.*10.**(iexp) ; iexp=iexp+1
-
- hmin = float(int(hmin*10.**(-iexp)))*10.**iexp
- hmax = float(int((hmax+dh)*10.**(-iexp)))*10.**iexp
-
- if lsym0:
- # Force symetry about 0 !
- hmax = max(abs(hmax),abs(hmin))
- if hmax%dh != 0.: hmax = float(int(hmax/dh))*dh
- hmin = -hmax
- return hmin, hmax, dh
- def __fancy_legend__(ax_hndl, plt_hndl, loc_leg='0', ylg=0, leg_out=False, ncol=1):
- if loc_leg != '0':
- if leg_out:
- # Shrink Y axis's height by % on the bottom
- box = ax_hndl.get_position()
- ax_hndl.set_position([box.x0, box.y0 + box.height*ylg, box.width, box.height*(1.-ylg)])
- plt_hndl.legend(bbox_to_anchor=(0.95, -0.075), ncol=ncol, shadow=True, fancybox=True)
- else:
- plt_hndl.legend(loc=loc_leg, ncol=ncol, shadow=True, fancybox=True)
|