[568] | 1 | #!/usr/bin/env python |
---|
| 2 | |
---|
| 3 | ### T.Navarro |
---|
| 4 | |
---|
| 5 | ## |
---|
| 6 | # This routine reads sparse data, i.e. not binned in a lat/lon/vert/time grid and does plots |
---|
| 7 | # |
---|
| 8 | # There is nothing gnuplot could not be able to do for now, except command line and ease and all python plots possibilities, |
---|
| 9 | # but the goal is to provide a framework to compare with data from simulations on a constant grid. |
---|
| 10 | ### |
---|
| 11 | |
---|
| 12 | ########################################################################################### |
---|
| 13 | ########################################################################################### |
---|
| 14 | ### What is below relate to running the file as a command line executable (very convenient) |
---|
| 15 | if __name__ == "__main__": |
---|
| 16 | import sys |
---|
| 17 | from optparse import OptionParser ### to be replaced by argparse |
---|
| 18 | from os import system,path |
---|
| 19 | import numpy as np |
---|
[584] | 20 | from sparse import sparse |
---|
| 21 | |
---|
| 22 | parser = OptionParser() |
---|
| 23 | |
---|
[568] | 24 | ############################# |
---|
| 25 | ### Options |
---|
| 26 | parser.add_option('-f', '--file', action='store',dest='file', type="string", default=None, help='[NEEDED] filename, comma separated') |
---|
| 27 | parser.add_option('--ftype', action='store',dest='ftype', default=None, help=' Force data file type [\'sav\',\'txt\']') |
---|
| 28 | parser.add_option('-X', '--xvar', action='store',dest='xvar', type="string", default=None, help='[NEEDED] x variable: a name, a number, etc ...') |
---|
| 29 | parser.add_option('-Y', '--yvar', action='store',dest='yvar', type="string", default=None, help='y variable') |
---|
| 30 | parser.add_option('-Z', '--zvar', action='store',dest='zvar', type="string", default=None, help='z variable') |
---|
| 31 | parser.add_option('-C', '--cvar', action='store',dest='cvar', type="string", default=None, help='c variable for color') |
---|
| 32 | parser.add_option('--xmin', action='store',dest='xmin', type="float", default=None, help='min values for x var, comma separated') |
---|
| 33 | parser.add_option('--xmax', action='store',dest='xmax', type="float", default=None, help='max values for x var, comma separated') |
---|
| 34 | parser.add_option('--ymin', action='store',dest='ymin', type="float", default=None, help='min values for y var, comma separated') |
---|
| 35 | parser.add_option('--ymax', action='store',dest='ymax', type="float", default=None, help='max values for y var, comma separated') |
---|
| 36 | parser.add_option('--zmin', action='store',dest='zmin', type="float", default=None, help='min values for z var, comma separated') |
---|
| 37 | parser.add_option('--zmax', action='store',dest='zmax', type="float", default=None, help='max values for z var, comma separated') |
---|
| 38 | parser.add_option('--cmin', action='store',dest='cmin', type="string", default=None, help='min values for c var, comma separated') |
---|
| 39 | parser.add_option('--cmax', action='store',dest='cmax', type="string", default=None, help='max values for c var, comma separated') |
---|
| 40 | parser.add_option('-w','--with', action='append',dest='cond', type="string", default=None, help='conditions..') |
---|
| 41 | parser.add_option('--merge', action='store_true', dest='merge', default=False, help='merge datafiles in a single plot [False]') |
---|
| 42 | parser.add_option('-c','--color', action='store',dest='clb', type="string", default="def", help='change colormap (also: nobar,onebar)') |
---|
| 43 | parser.add_option('--trans', action='store',dest='trans', type="float", default=1., help='shaded plot transparency, 0 to 1 (=opaque) [1]') |
---|
| 44 | parser.add_option('-p', '--proj', action='store',dest='proj', type="string", default=None, help='projection') |
---|
| 45 | parser.add_option('--blat', action='store',dest='blat', type="int", default=None, help='reference lat (or bounding lat for stere) [computed]') |
---|
| 46 | parser.add_option('--blon', action='store',dest='blon', type="int", default=None, help='reference lon [computed]') |
---|
| 47 | parser.add_option('-b', '--back', action='store',dest='back', type="string", default=None, help='background image [None]') |
---|
[584] | 48 | parser.add_option('-m', '--min', action='store',dest='vmin', type="float", default=None, help='bounding minimum value [min]') |
---|
| 49 | parser.add_option('-M', '--max', action='store',dest='vmax', type="float", default=None, help='bounding maximum value [max]') |
---|
[568] | 50 | parser.add_option('--div', action='store',dest='ndiv', type="int", default=10, help='number of divisions in histogram [10]') |
---|
| 51 | parser.add_option('-S', '--save', action='store',dest='save', type="string", default="gui", help='save mode (gui,png,eps,svg,pdf,txt,html,avi) [gui]') |
---|
| 52 | |
---|
| 53 | |
---|
| 54 | ############################# |
---|
| 55 | ### Get options and variables |
---|
| 56 | (opt,args) = parser.parse_args() |
---|
| 57 | |
---|
[584] | 58 | sparse(oplot=None,file=opt.file,ftype=opt.ftype,xvar=opt.xvar,yvar=opt.yvar,zvar=opt.zvar,cvar=opt.cvar,xmin=opt.xmin,xmax=opt.xmax,ymin=opt.ymin,ymax=opt.ymax,zmin=opt.zmin,zmax=opt.zmax,cmin=opt.cmin,cmax=opt.cmax,cond=opt.cond,merge=opt.merge,clb=opt.clb,trans=opt.trans,proj=opt.proj,blat=opt.blat,blon=opt.blon,back=opt.back,vmin=opt.vmin,vmax=opt.vmax,ndiv=opt.ndiv,save=opt.save) |
---|
| 59 | |
---|
| 60 | def sparse(oplot=None,file=None,ftype=None,xvar=None,yvar=None,zvar=None,cvar=None,xmin=None,xmax=None,ymin=None,ymax=None,zmin=None,zmax=None,cmin=None,cmax=None,cond=None,merge=False,clb="def",trans=1.,proj=None,blat=None,blon=None,back=None,vmin=None,vmax=None,ndiv=10,save="gui"): |
---|
| 61 | |
---|
| 62 | import sys |
---|
| 63 | from os import system,path |
---|
| 64 | from scipy.io.idl import readsav |
---|
| 65 | import numpy as np |
---|
| 66 | from myplot import separatenames, definesubplot, errormess, defcolorb, fmtvar, polarinterv, simplinterv, define_proj, readdata, makeplotres |
---|
| 67 | from mymath import min, max, writeascii |
---|
| 68 | import matplotlib as mpl |
---|
| 69 | from matplotlib.pyplot import subplot, figure, plot, scatter, colorbar, show, title, close, legend, xlabel, ylabel, axis, hist |
---|
| 70 | from matplotlib.cm import get_cmap |
---|
| 71 | from mpl_toolkits.mplot3d import Axes3D |
---|
| 72 | |
---|
| 73 | |
---|
[568] | 74 | ############################# |
---|
| 75 | ### Load and check data |
---|
| 76 | |
---|
| 77 | ############################# |
---|
| 78 | ### Load and check data |
---|
| 79 | |
---|
[584] | 80 | if file is None: |
---|
[568] | 81 | print "You must specify at least a file to process with -f." |
---|
| 82 | exit() |
---|
[584] | 83 | if xvar is None: |
---|
[568] | 84 | print "You must specify at least a 1st field with -X." |
---|
| 85 | exit() |
---|
[584] | 86 | if proj is not None and yvar is None: |
---|
[568] | 87 | print "Why did you ask a projection with only one variable?" |
---|
| 88 | exit() |
---|
| 89 | |
---|
[584] | 90 | filename=separatenames(file) |
---|
[568] | 91 | |
---|
[584] | 92 | #print 'conditions', cond |
---|
[568] | 93 | |
---|
[584] | 94 | print vmax |
---|
| 95 | print vmin |
---|
[568] | 96 | |
---|
[584] | 97 | if cond is None: nslices = 1 |
---|
| 98 | else: nslices = len(cond) |
---|
[568] | 99 | numplot = nslices |
---|
[584] | 100 | if merge is False: numplot = numplot*len(filename) |
---|
[568] | 101 | |
---|
| 102 | print ' ' |
---|
[584] | 103 | if merge is False: |
---|
[568] | 104 | print nslices, 'condition(s) and', len(filename), 'file(s) without merging ---->', numplot, 'plot(s)' |
---|
| 105 | else: |
---|
| 106 | print nslices, 'condition(s) and', len(filename), 'file(s) with merging ---->', numplot, 'plot(s)' |
---|
| 107 | print ' ' |
---|
| 108 | |
---|
| 109 | all_type = [[]]*len(filename) |
---|
| 110 | all_x = [[]]*len(filename) |
---|
| 111 | all_y = [[]]*len(filename) |
---|
| 112 | all_z = [[]]*len(filename) |
---|
| 113 | all_c = [[]]*len(filename) |
---|
| 114 | all_data = [[]]*len(filename) |
---|
| 115 | #index = [[]]*len(filename) |
---|
| 116 | |
---|
| 117 | |
---|
| 118 | ############################## |
---|
| 119 | ################## READ DATA |
---|
| 120 | |
---|
| 121 | for k in range(len(filename)): |
---|
| 122 | |
---|
| 123 | ##### Find file type |
---|
[584] | 124 | if ftype is None: |
---|
[572] | 125 | if filename[k].find('.sav') is not -1: |
---|
| 126 | all_type[k] ='sav' |
---|
| 127 | print '.sav file detected for', filename[k],'!!' |
---|
| 128 | elif filename[k].find('.txt') is not -1: |
---|
| 129 | all_type[k] ='txt' |
---|
| 130 | #print '.txt file detected for', filename[k],'!!' |
---|
| 131 | else: |
---|
| 132 | all_type[k] ='txt' |
---|
| 133 | print 'no file type detected for', filename[k],'!!, default type is', all_type[k] |
---|
| 134 | |
---|
| 135 | if all_type[k] != all_type[0]: |
---|
| 136 | print 'Two different types were used: ', all_type[k], all_type[0] |
---|
| 137 | errormess('Not suported') |
---|
[568] | 138 | else: |
---|
[584] | 139 | all_type[k] = ftype |
---|
[568] | 140 | |
---|
| 141 | ##### Read file |
---|
[572] | 142 | if all_type[k] == 'sav': |
---|
[568] | 143 | print 'reading .sav file', filename[k], '...' |
---|
| 144 | data = {} |
---|
| 145 | data = readsav(filename[k], idict=data, python_dict=False) #, verbose=True) |
---|
| 146 | all_data[k] = data |
---|
[572] | 147 | elif all_type[k] == 'txt': |
---|
[568] | 148 | print 'reading .text file', filename[k], '...' |
---|
| 149 | all_data[k] = np.loadtxt(filename[k]) |
---|
| 150 | |
---|
[584] | 151 | all_x[k] = readdata(all_data,all_type[k],k,xvar) |
---|
| 152 | if yvar is not None: all_y[k] = readdata(all_data,all_type[k],k,yvar) |
---|
[568] | 153 | else: all_y[k] = None |
---|
[584] | 154 | if zvar is not None: all_z[k] = readdata(all_data,all_type[k],k,zvar) |
---|
[568] | 155 | else: all_z[k] = None |
---|
[584] | 156 | if cvar is not None: all_c[k] = readdata(all_data,all_type[k],k,cvar) |
---|
[568] | 157 | else: all_c[k] = None |
---|
| 158 | |
---|
[584] | 159 | if merge is True and k >=1 : |
---|
[568] | 160 | all_x[0] = np.concatenate((all_x[0],all_x[k])) |
---|
[584] | 161 | if yvar is not None: all_y[0] = np.concatenate((all_y[0],all_y[k])) |
---|
| 162 | if zvar is not None: all_z[0] = np.concatenate((all_z[0],all_z[k])) |
---|
| 163 | if cvar is not None: all_c[0] = np.concatenate((all_c[0],all_c[k])) |
---|
[568] | 164 | |
---|
| 165 | |
---|
| 166 | |
---|
| 167 | ############################## |
---|
| 168 | ################## PLOT DATA |
---|
| 169 | |
---|
| 170 | ## Open a figure and set subplots |
---|
[585] | 171 | if oplot is not None: fig=oplot |
---|
[584] | 172 | else: fig = figure() |
---|
[568] | 173 | subv,subh = definesubplot(numplot,fig) |
---|
[584] | 174 | palette = get_cmap(name=clb) |
---|
[568] | 175 | |
---|
| 176 | |
---|
| 177 | for nplot in range(numplot): |
---|
| 178 | |
---|
| 179 | print ' ' |
---|
| 180 | |
---|
| 181 | ###### Find which data and which file for plot nplot |
---|
[584] | 182 | if merge is False: |
---|
[568] | 183 | index_s = ((nplot)//len(filename))%nslices |
---|
| 184 | index_f = ((nplot-1)//nslices)%len(filename) |
---|
| 185 | else: |
---|
| 186 | index_s = ((nplot)//1)%nslices |
---|
| 187 | index_f = ((nplot-1)//nslices)%1 |
---|
| 188 | #print 'nplot,numplot,index_f,index_s', nplot,numplot,index_f,index_s |
---|
| 189 | |
---|
| 190 | |
---|
| 191 | ###### Select point under conditions defined in -w option |
---|
| 192 | index = np.isfinite(all_x[index_f]) |
---|
[584] | 193 | if cond is not None: |
---|
| 194 | zecond = separatenames(cond[index_s]) |
---|
| 195 | #print 'hello', cond[index_s], zecond |
---|
[568] | 196 | for i in range(len(zecond)): |
---|
| 197 | zecondi = zecond[i] |
---|
| 198 | if zecondi.find('>') != -1: |
---|
| 199 | variable = zecondi[0:zecondi.find('>')] |
---|
| 200 | value = float(zecondi[zecondi.find('>')+1:len(zecondi)]) |
---|
[584] | 201 | if merge is True: # ultra moche de reconcatener a chaque fois, mais bon on s'en fout c'est du python |
---|
[568] | 202 | zedata = [] |
---|
| 203 | for k in range(len(filename)): |
---|
| 204 | zedata = np.concatenate((zedata,readdata(all_data,all_type[k],k,variable))) |
---|
| 205 | else : zedata = readdata(all_data,all_type[k],index_f,variable) |
---|
| 206 | #print index.shape,zedata.shape, value |
---|
| 207 | index = index*(zedata>value) |
---|
| 208 | print 'All points such as', variable, '>', value, 'have been selected' |
---|
| 209 | elif zecondi.find('<') != -1: |
---|
| 210 | variable = zecondi[0:zecondi.find('<')] |
---|
| 211 | value = float(zecondi[zecondi.find('<')+1:len(zecondi)]) |
---|
[584] | 212 | if merge is True: |
---|
[568] | 213 | zedata = [] |
---|
| 214 | for k in range(len(filename)): |
---|
| 215 | zedata = np.concatenate((zedata,readdata(all_data,all_type[k],k,variable))) |
---|
| 216 | else : zedata = readdata(all_data,all_type[k],index_f,variable) |
---|
| 217 | #print index.shape,zedata.shape, value |
---|
| 218 | index = index*(zedata<value) |
---|
| 219 | print 'All points such as', variable, '<', value, 'have been selected' |
---|
| 220 | else: |
---|
| 221 | print '' |
---|
| 222 | print 'I do not understand that condition :', zecondi |
---|
| 223 | errormess('') |
---|
| 224 | |
---|
| 225 | |
---|
| 226 | if np.sum(index) == 0: |
---|
| 227 | print '*********** WARNING ***********' |
---|
| 228 | print '*********** NO DATA ***********' |
---|
| 229 | errormess('') |
---|
| 230 | else: |
---|
| 231 | print np.sum(index),'points have been selected among', len(all_x[index_f]), \ |
---|
| 232 | 'that is to say %2.2f' %(float(100*np.sum(index))/float(len(all_x[index_f]))), '%.' |
---|
| 233 | |
---|
| 234 | |
---|
| 235 | #print 'numplot', numplot |
---|
| 236 | changesubplot = (numplot > 1) #and (len(what_I_plot.shape) != 1) |
---|
| 237 | if changesubplot: subplot(subv,subh,nplot+1) |
---|
| 238 | #print 'subv,subh,nplot', subv,subh,nplot |
---|
| 239 | |
---|
| 240 | ###### Projection |
---|
[584] | 241 | if proj is not None: # Nota : NEVER TRY TO DO A MESHGRID ON SPARSE DATA. WAY TOO MUCH POINTS. |
---|
[568] | 242 | wlon = [min(all_x[index_f][index]),max(all_x[index_f][index])] |
---|
| 243 | wlat = [min(all_y[index_f][index]),max(all_y[index_f][index])] |
---|
[584] | 244 | m = define_proj(proj,wlon,wlat,back=back,blat=blat,blon=blon) |
---|
[568] | 245 | x, y = m(all_x[index_f][index],all_y[index_f][index]) |
---|
| 246 | else: |
---|
| 247 | x = all_x[index_f][index] |
---|
[584] | 248 | if yvar is not None: y = all_y[index_f][index] |
---|
[568] | 249 | |
---|
| 250 | ###### Plot: 1D histogram |
---|
[584] | 251 | if yvar is None: |
---|
| 252 | hist(x,bins=ndiv,histtype='step',linewidth=2) |
---|
| 253 | if save == 'txt': |
---|
[568] | 254 | print 'saving file profile'+str(nplot+1)+'.txt' |
---|
| 255 | writeascii(np.transpose(x),'profile'+str(nplot+1)+'.txt') |
---|
| 256 | ###### Plot: 2D cloud |
---|
[584] | 257 | elif zvar is None and cvar is None : |
---|
[568] | 258 | plot(x,y,'.b') |
---|
[584] | 259 | if save == 'txt': |
---|
[568] | 260 | print 'saving file profile'+str(nplot+1)+'.txt' |
---|
| 261 | writeascii(np.transpose(np.array([x,y])),'profile'+str(nplot+1)+'.txt') |
---|
| 262 | ###### Plot: 2D cloud with color |
---|
[584] | 263 | elif zvar is None and cvar is not None : |
---|
| 264 | if save == 'txt': |
---|
[568] | 265 | print 'saving file profile'+str(nplot+1)+'.txt' |
---|
| 266 | writeascii(np.transpose(np.array([x,y,all_c[index_f][index]])),'profile'+str(nplot+1)+'.txt') |
---|
| 267 | scatter(x,y,c=all_c[index_f][index],\ |
---|
[584] | 268 | marker='o', edgecolor='None',cmap = palette, alpha=trans, vmin = vmin,vmax = vmax) |
---|
[568] | 269 | ###### Plot: 3D cloud |
---|
[584] | 270 | elif zvar is not None and cvar is None : |
---|
[568] | 271 | ax = fig.add_subplot(subv,subh,nplot+1, projection='3d') |
---|
| 272 | ax.plot(x,y,all_z[index_f][index],'.b') |
---|
| 273 | ###### Plot: 3D cloud with color |
---|
| 274 | else : |
---|
| 275 | ax = fig.add_subplot(subv,subh,nplot+1, projection='3d') |
---|
| 276 | ax.scatter(x,y,all_z[index_f][index],c=all_c[index_f][index],\ |
---|
[584] | 277 | marker='o', edgecolor='None', cmap = palette, alpha=trans,vmin = vmin,vmax = vmax) |
---|
[568] | 278 | |
---|
| 279 | ###### Colorbar: http://www.scipy.org/Cookbook/Matplotlib/Show_colormaps?action=AttachFile&do=get&target=colormaps3.png |
---|
[584] | 280 | if clb != 'nobar' and all_c[index_f] is not None and all_z[index_f] is None: # pourquoi la colorbar marche pas en 3d? |
---|
[568] | 281 | colorbar( fraction=0.05,pad=0.03,format='%0.2f',\ |
---|
| 282 | extend='neither',spacing='proportional' ) |
---|
| 283 | |
---|
| 284 | ###### Plot limits (options --xmin, --xmax, etc ..) |
---|
[584] | 285 | if proj is None: |
---|
| 286 | xlabel(xvar) |
---|
| 287 | ylabel(yvar) |
---|
| 288 | if zvar is None : |
---|
| 289 | if xmin is not None: mpl.pyplot.xlim(xmin=xmin) |
---|
[568] | 290 | else: mpl.pyplot.xlim(xmin=min(all_x[index_f][index])) |
---|
[584] | 291 | if xmax is not None: mpl.pyplot.xlim(xmax=xmax) |
---|
[568] | 292 | else: mpl.pyplot.xlim(xmax=max(all_x[index_f][index])) |
---|
[584] | 293 | if yvar is not None: |
---|
| 294 | if ymin is not None: mpl.pyplot.ylim(ymin=ymin) |
---|
[568] | 295 | else: mpl.pyplot.ylim(ymin=min(all_y[index_f][index])) |
---|
[584] | 296 | if ymax is not None: mpl.pyplot.ylim(ymax=ymax) |
---|
[568] | 297 | else: mpl.pyplot.ylim(ymax=max(all_y[index_f][index])) |
---|
| 298 | |
---|
| 299 | |
---|
[584] | 300 | if cond is not None: |
---|
| 301 | title(cond[index_s]) |
---|
[568] | 302 | else: |
---|
| 303 | title('all point selected') |
---|
| 304 | |
---|
[573] | 305 | zeplot = "output" |
---|
[584] | 306 | if save in ['png','eps','svg','pdf']: makeplotres(zeplot,ext=save)#,res=resolution,pad_inches_value=pad_inches_value,disp=False,ext=save) |
---|
| 307 | elif save == 'gui': show() |
---|
| 308 | elif save == 'return': return mpl.pyplot |
---|
[573] | 309 | else: print "INFO: save mode not supported. using gui instead." ; show() |
---|
| 310 | print '' |
---|
[568] | 311 | |
---|
[573] | 312 | command = "" |
---|
| 313 | for arg in sys.argv: command = command + arg + ' ' |
---|
| 314 | name = zeplot |
---|
| 315 | f = open(name+'.sh', 'w') |
---|
| 316 | f.write(command) |
---|
[568] | 317 | |
---|
| 318 | |
---|
| 319 | |
---|
| 320 | |
---|
| 321 | |
---|