def gmt_north_america(**kwargs): ''' Give rf_data as ([values],[time]) ''' from gmtpy import GMT #get kwargs fname = kwargs.get('fname','USA_map.pdf') station_data = kwargs.get('station_data','none') quake_locs = kwargs.get('quake_locs','none') rf_data = kwargs.get('rf_data','none') header = kwargs.get('header','none') #topo data etopo='/geo/home/romaguir/utils/ETOPO5.grd' topo_grad='/geo/home/romaguir/utils/topo_grad.grd' #colormap colombia='/geo/home/romaguir/utils/colors/colombia' region = '-128/-66/24/52' scale = 'l-100/35/33/45/1:30000000' #initialize gmt gmt = GMT(config={'BASEMAP_TYPE':'fancy', 'HEADER_FONT_SIZE':'14'}) #'COLOR_BACKGROUND':'-', :setting this to '-' plots z are transparent #'COLOR_FOREGROUND':'-'}) #make colormap cptfile = gmt.tempfilename() gmt.makecpt(C=colombia,T='-4000/4950/100',Z=True,out_filename=cptfile,D='i') #make gradient #topo_grad = gmt.tempfilename() #gmt.grdgradient(etopo,V=True,A='100',N='e0.8',M=True,G=topo_grad,K=False) #plot topography gmt.grdimage( etopo, R = region, J = scale, C = cptfile, E = '200') #I = '0.5')#topo_grad) #plot coastlines gmt.pscoast( R=region, J=scale, B='a10', D='l', A='500', W='thinnest,black,-', N='all') #plot stations if station_data != 'none': gmt.psxy( R=region, J=scale, B='a10', S='t0.1', G='red', in_rows = station_data ) if quake_locs != 'none': eq_region = 'g' eq_scale = 'E-100/40/2.25i' gmt.pscoast( R = eq_region, J = eq_scale, B = 'p', A = '10000', G = 'lightgrey', W = 'thinnest', Y = '3.5i', X = '-0.5i' ) gmt.psxy( R = eq_region, J = eq_scale, S = 'a0.05', G = 'blue', in_rows = quake_locs ) #plot receiver function stack if rf_data != 'none': rf_region = '-0.20/0.20/0/100' rf_scale = 'X1i/-5i' gmt.psxy( R = rf_region, J = rf_scale, #G = 'grey', #fill B = '0.25::/10:time (s):NE', W = 'thin', X = '9i', Y = '-3.5i', in_columns = rf_data ) #plot shaded area for positive values vals = rf_data[0] time = rf_data[1] poly_vals_pos = [] poly_time_pos = [] for i in range(0,len(vals)): val_here = max(0,np.float(vals[i])) poly_time_pos.append(time[i]) poly_vals_pos.append(val_here) poly_vals_pos.append(0.0) poly_time_pos.append(time[::-1][0]) poly_vals_pos.append(0.0) poly_time_pos.append(time[0]) gmt.psxy( R = rf_region, J = rf_scale, G = 'red', B = '0.25::/10:time (s):NE', W = 'thin', in_columns = (poly_vals_pos,poly_time_pos) ) #plot shaded area for negative values ''' vals = rf_data[0] time = rf_data[1] poly_vals_neg = [] poly_time_neg = [] for i in range(0,len(vals)): val_here = min(0,np.float(vals[i])) poly_time_neg.append(time[i]) poly_vals_neg.append(val_here) poly_vals_neg.append(0.0) poly_time_neg.append(time[::-1][0]) poly_vals_neg.append(0.0) poly_time_neg.append(time[0]) gmt.psxy( R = rf_region, J = rf_scale, G = 'blue', B = '0.25::/10:time (s):NE', W = 'thin', in_columns = (poly_vals_neg,poly_time_neg) ) ''' #header_file = open('header_file','w') #header_file.write('<< EOF') #header_file.close() #write header information if header != 'none': stations_text = header['N_traces'] + ' traces in stack' events_text = header['N_events'] + ' events' freq_text = header['frequency'] decon_text = 'deconvolution method : ' + header['decon'] gmt.pstext( in_rows = [(-96,60,12,0,1,'MC',stations_text)], R = region, J = scale, N = True, X = '-8.5i' ) gmt.pstext( in_rows = [(-96,59,12,0,1,'MC',events_text)], R = region, J = scale, N = True ) gmt.pstext( in_rows = [(-96,58,12,0,1,'MC',freq_text)], R = region, J = scale, N = True ) gmt.pstext( in_rows = [(-96,57,12,0,1,'MC',decon_text)], R = region, J = scale, N = True ) #save figure gmt.save(fname)
def plot_rep(repfile, paramfile, wtype, pixfile, show=True, misfit=0.1, minmax=True): """ Plot 1D velocity profile. """ # ## read in models from dinver-output os.system('gpdcreport ' + repfile + ' >tmp.mdl') models, data, nd, ne, nrow, nlayer = get_models('tmp.mdl') os.remove('tmp.mdl') if misfit == 'all': misfit = data.max() elif misfit <= data.min(): misfit = median(data) # ## calculate density sreso = 0.05 # horizontal resolution dreso = .5 # vertical resolution grid1, grid2, x, y, smean, dmean = dplot(models, data, nd, ne, dreso=dreso, sreso=sreso, mf=misfit, nlayer=nlayer, dmax=120) # ## write output into temporary files that can be plotted by gmt xyz = tempfile.mktemp() xyz2 = tempfile.mktemp() grd = tempfile.mktemp() grdcpt = tempfile.mktemp() fout = pixfile f = open(xyz, 'w') for ii in range(len(y)): for jj in range(len(x)): if grid1[ii, jj] > 0.0: print >> f, x[jj], -y[ii], grid1[ii, jj] f.close() f = open(xyz2, 'w') for ii in range(len(y)): for jj in range(len(x)): if grid2[ii, jj] > 0: print >> f, x[jj], -y[ii], '0.5' f.close() lat, lon = dissect_fname(repfile) if wtype == 'love': wt = 'L' if wtype == 'rayleigh': wt = 'R' # print repfile, lat, lon # ## gmt plot rng = '1/5/-120/0' step = '%f/%f' % (sreso, dreso) anot = int(grid1.max() / 1000.) * 1000 / 2. tick = anot / 2 gmt = GMT(config={'ANOT_FONT_SIZE':8, 'LABEL_FONT_SIZE':10, 'ANNOT_OFFSET_SECONDARY':'0.1c', 'ANNOT_OFFSET_PRIMARY':'0.1c', 'LABEL_OFFSET':'0.1c', 'FRAME_PEN':'.5p'}) widgets, layout = make_widget() if 1: widget = widgets[2] gmt.xyz2grd(xyz, G=grd, R=rng, I='%f/%f' % (sreso, dreso), out_discard=True) gmt.grd2cpt(grd, L='0/%d' % 3000, C="wysiwyg", D=True, Z=True, out_filename=grdcpt) gmt.psbasemap(R=True, B='a1f.5:S-velocity [km/s]:/a10f5:Depth [km]:WnSe', *widget.XYJ()) # gmt.psmask(xyz2, R=True, T=True, I='%f/%f' % (sreso, dreso), G='lightgray', *widget.XYJ()) gmt.grdimage(grd, R=True, Q=True, C=grdcpt, *widget.XYJ()) gmt.psxy(R=True, B=True, W='3,black', in_columns=[smean, -dmean], *widget.XYJ()) bmdl = get_best_model(repfile, dreso, dmax=120., dmin=0.) gmt.psxy(R=True, B=True, W='3,black,-', in_rows=bmdl, *widget.XYJ()) gmt.psscale(widget.XYJ()[0], widget.XYJ()[1], C=grdcpt, D='1.7c/1.5c/2.5c/.4ch', B='a%df%d10:No. of models:/::' % (1000, 500)) txtstr = "1.2 -7. 8 0 1 LT lat = %3.2f" % lat gmt.pstext(R=rng, G='0/0/0', N=True, in_string=txtstr, *widget.XYJ()) txtstr = "1.2 -12. 8 0 1 LT lon = %3.2f" % lon gmt.pstext(R=True, G='0/0/0', N=True, in_string=txtstr, *widget.XYJ()) # plot the minimum and maximum model that is allowed # by the parameterisation if minmax: mdl_min, mdl_max = minmax_mdl(paramfile) gmt.psxy(R=True, B=True, W='3,red,-', in_rows=mdl_min, *widget.XYJ()) gmt.psxy(R=True, B=True, W='3,red,-', in_rows=mdl_max, *widget.XYJ()) if 1: p, v, e = get_disp(repfile, wtype='phase') plot_disp(gmt, repfile, widgets[1], p, v, e, 'phase', ptype='p', wtype=wt, mode=0, misfit=misfit) p, v, e = get_disp(repfile, wtype='group') plot_disp(gmt, repfile, widgets[0], p, v, e, 'group', ptype='g', wtype=wt, mode=0, misfit=misfit) if 0: p, v, e = get_disp(repfile, wtype='grouponly') plot_disp(gmt, repfile, widgets[0], p, v, e, 'group', ptype='g', wtype=wt, mode=0, misfit=misfit) if 0: plot_hist(gmt, widgets, models, nd, ne) gmt.save(fout) meanfout = fout.replace('.eps', '_mean.txt') savetxt(meanfout, vstack((-dmean, smean)).T) if show: os.system('gv %(fout)s&' % vars())
ndist, nd, values = plot_2d(field,_slat,_slon,_elat,_elon,pdepth,new=True) lbl1,lbl2 = anot[cnt-1] fstr = cStringIO.StringIO() for dist,depth,vs in zip(ndist,nd,values): fstr.write("%f %f %f\n"%(dist,depth,vs)) sclx = 18.*ndist.max()/xscale scly = yscale scl = 'X%fc/%fc'%(sclx,scly) print scl rng = '%f/%f/%f/%f'%(ndist.min(),ndist.max(),nd.min(),nd.max()) grdws = gmt.tempfilename('ws.grd') grdgd = gmt.tempfilename('grdgd.cpt') gmt.xyz2grd(G=grdws,R=rng,I='50./1.',out_discard=True,in_string=fstr.getvalue()) gmt.grdgradient(grdws,G=grdgd,out_discard=True,A='180',N='e0.8') if cnt == 1: gmt.grdimage(grdws,I=grdgd,R=True,J=scl,C=cptws, B='a500f100:Distance [km]:/a20f10:Depth [km]:WSne',X='1c',Y='3c') else: gmt.grdimage(grdws,I=grdgd,R=True,J=scl,C=cptws, B='a500f100:Distance [km]:/a20f10:Depth [km]:WSne',Y='%fc'%(scly+2.5)) txtstr1 = """%f %f 12 0 1 LB %s"""%(0.0,8.,lbl1) txtstr2 = """%f %f 12 0 1 RB %s"""%(ndist.max(),8.,lbl2) gmt.pstext(R=True,J=True,G='0/0/0',N=True,in_string=txtstr1) gmt.pstext(R=True,J=True,G='0/0/0',N=True,in_string=txtstr2) cnt += 1 gmt.save(foutprofiles) #test(field)
"ANOT_FONT_SIZE": 14, "LABEL_FONT_SIZE": 14, "ANNOT_OFFSET_SECONDARY": "0.1c", "ANNOT_OFFSET_PRIMARY": "0.1c", "LABEL_OFFSET": "0.1c", "FRAME_PEN": ".5p", "PLOT_DEGREE_FORMAT": "-D", } ) rng = "-145/-50/41/85" scl = "L-97.5/63/41/85/15c" markers = "markers.xyp" gmt.psbasemap(R=rng, J=scl, B="a15f5WSne", Y="2c", X="2c") gmt.pscoast("-N1", R=True, J=True, D="i", W="0.5p,black", N="2") cnt = 0 for _slon, _slat, _elon, _elat in zip(slon, slat, elon, elat): gmt.project(C="%f/%f" % (_slon, _slat), E="%f/%f" % (_elon, _elat), G=100, Q=True, out_filename=markers) gmt.psxy(R=True, J=True, W="2p,red,", in_rows=[[_slon, _slat], [_elon, _elat]]) # gmt.psxy(markers,R=True,J=True,S='y0.1c',W='1p,blue') gmt.psxy(markers, R=True, J=True, S="s0.1c", W="1p,blue") lbl1, lbl2 = anot[cnt] txtstr1 = """%f %f 10 0 1 RB %s""" % (_slon, _slat, lbl1) txtstr2 = """%f %f 10 0 1 LB %s""" % (_elon, _elat, lbl2) gmt.pstext(R=True, J=True, W="white", G="blue", N=True, in_string=txtstr1) gmt.pstext(R=True, J=True, W="white", G="blue", N=True, in_string=txtstr2) cnt += 1 for lon, lat in invres: gmt.psxy(R=True, J=True, S="t0.5c", G="red", in_rows=[[lon, lat]]) gmt.save(foutmap)