Update to establish running version with plotting of lat-lon-fields

This commit is contained in:
Gabriel Wolf 2018-09-17 15:23:48 +01:00
parent 339af5e826
commit abf569ec36
3 changed files with 145 additions and 36 deletions

View File

@ -8,9 +8,11 @@
# Load necessary modules #####################################################################
import numpy as np #
import time # to measure elapsed time
# read data
from get_data import get_data_woa2009 as read_data
# plotting modules / functions
from myplot import myplot_2dmap # plot of lat-lon fields
from myplot_inputs import mycalc_create_pn # create plotname
from myplot_inputs import myplot_create_pn # create plotname
# ############################################################################################
# Input 0 ####################################################################################
@ -24,7 +26,7 @@ from myplot_inputs import mycalc_create_pn # create plotname
print 'MANUAL DEFINED OUTPUTS MISSING'
dim = ('lon','lat','z','time',)
dir_plot = '/glusterfs/inspect/users/xg911182/Code/Python/plots_test/'
variables = {'s':{},'theta':{},'grd':[],'valid':[]}
variables = {'s':{},'temp':{},'grd':[],'valid':[]}
lonlat_reg = [25.0, 25.0+360.0, -90.0, 90.0] # plotting range for 2dmap
# Input 1 ####################################################################################
# Physical constants
@ -162,16 +164,17 @@ i_t = 0
date_str = '2009'
for i_key in range(0,len(list_allkeys)):
print 'put this plotname stuff into a function'
pname_str = mycalc_create_pn({'lonlat':lonlat_reg})
plotname_dum = dir_plot + 'Map2d_' + list_allkeys[i_key] + pname_str['lonlat'] + \
'_z' + str(grd.z[i_dep]) + grd.Uz + '_' + date_str + '.png'
# create plotname
plotname = myplot_create_pn({'dir_plot':dir_plot,'beg_str':'Map2d',\
'varname':list_allkeys[i_key],'zlev':[grd.z[i_dep],grd.Uz],\
'lonlat':lonlat_reg,'date':date_str,'end_str':'.png'})
# define plot input
title_in = 'Depth='+'{:.1f}'.format(grd.z[i_dep])+grd.Uz
data_in = data[list_allkeys[i_key]]['val'][:,:,i_dep,i_t]
data_in[data_in==data[list_allkeys[i_key]]['fill_value']] = np.nan
myplot_2dmap(data_in,grd,lonlat_range=lonlat_reg,saveplot=1,\
title_c=title_in,plotname=plotname_dum)
del data_in, title_in, pname_str,plotname_dum
title_c=title_in,plotname=plotname,unit_data=data[list_allkeys[i_key]]['units'])
del data_in, title_in, plotname
print ' ----------------------------------------------'
end_time = time.time()
print 'Elapsed time to plot 2d fields (lat-lon): '+ '{:.2f}'.format(end_time-beg_time)+'s'

View File

@ -130,7 +130,7 @@ def myplot_1d(xxx,yyy,FS=22,trend=0,rm_yyy=0,yyy_per=0,col_c=('b','r','k'),label
#def myplot_2dmap(xxx,yyy,FS=22,trend=0,rm_yyy=0,yyy_per=0,col_c=('b','r','k'),label_c=('None'),xlabel_c='no xlabel info',ylabel_c='no ylabel info',saveplot=0,plotname='dummy.png',window='step',title_c=[]):
def myplot_2dmap(data_in,grd,FS=22,plotname='dummy.png',saveplot=0,lonlat_range=[0.0,360.0,-90.0,90.0],\
xlabel_c=[],ylabel_c=[],title_c=[]):
xlabel_c=[],ylabel_c=[],title_c=[],cbar_in=[],unit_data=[],):
# from myplot import myplot_2dmap
# %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
# input choices for myplot_1d %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@ -150,6 +150,7 @@ def myplot_2dmap(data_in,grd,FS=22,plotname='dummy.png',saveplot=0,lonlat_range=
import math
from mycalc_matrix import mymatrix_smooth
from mpl_toolkits.basemap import Basemap, addcyclic, shiftgrid
from myplot_inputs import myplot_create_cbar
# => cartopy instead of basemap
# %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
# general plotting setup
@ -180,8 +181,27 @@ def myplot_2dmap(data_in,grd,FS=22,plotname='dummy.png',saveplot=0,lonlat_range=
# %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
# plotting of data_in
# %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
mymapf = plt.contourf(lonall, latall, data_in, 10, cmap=plt.cm.Reds)
mymap = plt.contour(lonall, latall, data_in, 10, colors='k')
# create colorbar rang and labelinge
if not cbar_in:
cbar_min = np.nanpercentile(data_in[:],2)
cbar_max = np.nanpercentile(data_in[:],98)
num = 11
else:
cbar_min = cbar_in[0]
cbar_max = cbar_in[1]
num = cbar_in[2]
cbar_range = myplot_create_cbar(cbar_min,cbar_max,num=num)
cbar_label = map(str, cbar_range[::1])
if len(cbar_in) > 3:
cbar_label[-1] = cbar_in[3]
elif unit_data:
cbar_label[-1] = '[' + unit_data + ']'
# actual plotting
mymapf = plt.contourf(lonall, latall, data_in, cbar_range, cmap=plt.cm.Reds)
#mymapf = plt.contourf(lonall, latall, data_in, 10, cmap=plt.cm.Reds, \
# vmin=cbar_min, vmax=cbar_max)
mymap = plt.contour(lonall, latall, data_in, cbar_range, colors='k')
plt.clim(cbar_range[0],cbar_range[1])
# %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
# include contour labels, colorbar, etc.
# %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@ -190,7 +210,10 @@ def myplot_2dmap(data_in,grd,FS=22,plotname='dummy.png',saveplot=0,lonlat_range=
del fmt_d
if title_c:
plt.title(title_c, fontsize=FS)
plt.colorbar(mymapf, orientation='horizontal', shrink=0.95)
# colorbar settings
cbar = plt.colorbar(mymapf, orientation='horizontal', shrink=0.9)
cbar.set_ticks(cbar_range[::1])
cbar.set_ticklabels(cbar_label)
#plt.colorbar(mymapf, orientation='horizontal', shrink=0.64)
# %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
# labeling, axis, etc

View File

@ -1,33 +1,116 @@
def mycalc_create_pn(dict_in):
def myplot_create_pn(dict_in):
# necessary modules
import numpy as np
import math # to use floor (nothing else)
# Allocation
pname_str = {}
# check if restriction to region exist
list_allkeys = dict_in.keys()
pname_str = []
# check if specific plotting directory given
if 'dir_plot' in list_allkeys:
pname_str = dict_in['dir_plot']
# check if beginning_string given
if 'beg_str' in list_allkeys:
pname_str = pname_str + dict_in['beg_str']
else:
pname_str = pname_str + 'plot'
# check if variable name given
if 'varname' in list_allkeys:
if dict_in['varname'][0] == '_':
pname_str = pname_str + dict_in['varname']
else:
pname_str = pname_str + '_' + dict_in['varname']
else:
pname_str = pname_str + '_unknown_var'
# check if specific height level given
if 'zlev' in list_allkeys:
if isinstance(dict_in['zlev'], basestring):
if dict_in['zlev'][0] == '_':
pname_str = pname_str + dict_in['zlev']
else:
pname_str = pname_str + '_' + dict_in['zlev']
else:
if dict_in['zlev'][0] == 0:
fac = 1
else:
fac = 10**(-min(math.floor(np.log10(abs(dict_in['zlev'][0]))),0))
if fac > 1:
pname_str = pname_str + '_z' + str(int(fac*dict_in['zlev'][0])) + \
'e-' + str(np.log10(fac)) + dict_in['zlev'][1]
else:
pname_str = pname_str + '_z' + str(int(dict_in['zlev'][0])) + dict_in['zlev'][1]
# check if restriction to region is given
if 'lonlat' in list_allkeys:
dummy = dict_in['lonlat']
if dummy[0] < 0:
pn1 = '{:03d}'.format(int(abs(round(dummy[0])))) + 'W'
elif dummy[0] > 360:
pn1 = '{:03d}'.format(int(round(dummy[0])-360)) + 'E'
if dummy is str:
if dummy[0] == '_':
pname_str = pname_str + dummy
else:
pname_str = pname_str + '_' + dummy
else:
pn1 = '{:03d}'.format(int(round(dummy[0]))) + 'E'
if dummy[1] < 0:
pn2 = '{:03d}'.format(int(abs(round(dummy[1])))) + 'W'
elif dummy[1] > 360:
pn2 = '{:03d}'.format(int(round(dummy[1])-360)) + 'E'
if dummy[0] < 0:
pn1 = '{:03d}'.format(int(abs(round(dummy[0])))) + 'W'
elif dummy[0] > 360:
pn1 = '{:03d}'.format(int(round(dummy[0])-360)) + 'E'
else:
pn1 = '{:03d}'.format(int(round(dummy[0]))) + 'E'
if dummy[1] < 0:
pn2 = '{:03d}'.format(int(abs(round(dummy[1])))) + 'W'
elif dummy[1] > 360:
pn2 = '{:03d}'.format(int(round(dummy[1])-360)) + 'E'
else:
pn2 = '{:03d}'.format(int(round(dummy[1]))) + 'E'
if dummy[2] < 0:
pn3 = '{:02d}'.format(int(abs(round(dummy[2])))) + 'S'
else:
pn3 = '{:02d}'.format(int(round(dummy[2]))) + 'N'
if dummy[3] < 0:
pn4 = '{:02d}'.format(int(abs(round(dummy[3])))) + 'S'
else:
pn4 = '{:02d}'.format(int(round(dummy[3]))) + 'N'
if 360-(dummy[1]-dummy[0])<1.5:
pname_str = pname_str + '_reg' + pn3 + 'to' + pn4
else:
pname_str = pname_str + '_reg' + pn1 + 'to' + pn2 + pn3 + 'to' + pn4
del dummy
# check if date information given
if 'date' in list_allkeys:
if isinstance(dict_in['date'], basestring):
if dict_in['date'][0] == '_':
pname_str = pname_str + dict_in['date']
else:
pname_str = pname_str + '_' + dict_in['date']
else:
pn2 = '{:03d}'.format(int(round(dummy[1]))) + 'E'
if dummy[2] < 0:
pn3 = '{:02d}'.format(int(abs(round(dummy[2])))) + 'S'
else:
pn3 = '{:02d}'.format(int(round(dummy[2]))) + 'N'
if dummy[3] < 0:
pn4 = '{:02d}'.format(int(abs(round(dummy[3])))) + 'S'
else:
pn4 = '{:02d}'.format(int(round(dummy[3]))) + 'N'
pname_str['lonlat'] = '_reg' + pn1 + 'to' + pn2 + pn3 + 'to' + pn4
del dummy
print '*** no date string yet included for numerical values in mycalc_create_pn ***'
del dict_in, list_allkeys
# check if end_str is given
if 'end_str' in list_allkeys:
pname_str = pname_str + dict_in['end_str']
else:
pname_str = pname_str + '.png'
return pname_str
def myplot_create_cbar(cbar_min, cbar_max, num=[]):
# import modules
import numpy as np
from math import floor
# round values
if abs(cbar_max) > abs(cbar_min):
fac = floor(np.log10(abs(cbar_max)))
else:
fac = floor(np.log10(abs(cbar_min)))
fac = fac-1
cbar_max = round(cbar_max,-int(fac))
cbar_min = round(cbar_min,-int(fac))
# make array symmetric around zero?
if cbar_min<0 and cbar_max>0:
if abs(cbar_max+cbar_min) < 0.1*cbar_max:
cbar_min = -max(cbar_max,abs(cbar_min))
cbar_max = max(cbar_max,abs(cbar_min))
# create cbar
if num:
cbar_range = np.linspace(cbar_min, cbar_max, num=num)
else:
cbar_range = np.linspace(cbar_min, cbar_max)
# output
return cbar_range