def _slider_update(t): time_idx = np.argmin(abs(t - time_list[0])) vertical_image[0].remove() vert_mask = mask[0][time_idx,:] vert_disp = displacement_list[0][time_idx,~vert_mask,2] vertical_image[0] = basemap.drawscalar(1000*vert_disp,lonlat[~vert_mask], cmap=matplotlib.cm.RdBu_r, zorder=0,vmin=vmin,vmax=vmax,ax=main_ax) #plt.colorbar(vertical_image[0]) for idx in range(N): time_idx = np.argmin(abs(t - time_list[idx])) if idx >= 1: main_ax.scatter(position[:,0],position[:,1],c=1000*displacement_list[idx][time_idx,:,2],s=50,linewidths=1, cmap=matplotlib.cm.RdBu_r,vmin=vmin,vmax=vmax,edgecolor=mygreen,zorder=2) if np.any(covariance_list[idx] > 1e-8): args = quiver_args(position, displacement_list[idx][time_idx,:,:], covariance_list[idx][time_idx,:,:,:], mask[idx][time_idx,:]) Q_lst[idx].set_UVC(args[2],args[3],sigma=args[4]) else: args = quiver_args(position, displacement_list[idx][time_idx]) Q_lst[idx].set_UVC(args[2],args[3]) try: # if there is a %s in the title string then try to fill it with a timestamp main_ax.set_title(title % modest.decyear_inv(t,format='%Y-%m-%d'),fontsize=10) except TypeError: main_ax.set_title(title,fontsize=10) main_fig.canvas.draw() return
def _view(displacement_list, covariance_list, time_list, station_names, lon, lat, mask, init_time=None, units='meters', title='displacement at %s', disp_type=None, basemap=None, colors=None, draw_map=False, scale_length=1.0, quiver_scale=0.0001, map_resolution=200, mapscale_lonlat = None, quiverscale_lonlat = None, minimap_pos = None, vmin=-20,vmax=20, mapscale_length=100, ax=None, artists=None): lonlat = np.array([lon,lat]).T #times -= 2010.0 N = len(displacement_list) Nx = len(lon) if disp_type is None: disp_type = ['']*N disp_type = [i.replace('_',' ') for i in disp_type] if colors is None: colors = ['k',mygreen,'r','b','m'] if artists is None: artists = [] sub_fig,sub_ax = plt.subplots(3,1,figsize=(8,6),sharex=True) # do not use scientific notation sub_ax[0].ticklabel_format(useOffset=False, style='plain') slider_fig = plt.figure('time slider',figsize=(8,1)) slider_ax = slider_fig.add_axes([0.1,0.1,0.8,0.8]) time_slider = Slider(slider_ax,'time', min(time_list[0]),max(time_list[0]), valinit=min(time_list[0]), color='black') if ax is None: main_fig = plt.figure('Map View',figsize=(6,3)) main_ax = main_fig.add_axes([0.1,0.1,0.8,0.8]) else: main_ax = ax main_fig = ax.figure if init_time is not None: time = init_time else: time = min(time_list[0]) try: # if there is a %s in the title string then try to fill it with a timestamp main_ax.set_title(title % modest.decyear_inv(time,format='%Y-%m-%d'),fontsize=10) except TypeError: main_ax.set_title(title,fontsize=10) #time_idx = np.argmin(abs(time - time)) if draw_map is True: # figure z ordering # 0 topography # 1 geographic lines # 2 vertical displacement # 3 displacement vectors # 4 legends if basemap is None: basemap = create_default_basemap(lat,lon) position = basemap(lon,lat) position = np.array(position).transpose() main_ax.patch.set_facecolor([1.0,1.0,1.0,0.0]) # zorder 0 #basemap.drawtopography(ax=main_ax,vmin=-6000,vmax=4000, # alpha=0.4,resolution=map_resolution,zorder=0) # zorder 1 basemap.drawcoastlines(ax=main_ax,linewidth=1.0,zorder=1,color=(0.3,0.3,0.3,1.0)) basemap.drawcountries(ax=main_ax,linewidth=1.0,zorder=1,color=(0.3,0.3,0.3,1.0)) basemap.drawstates(ax=main_ax,linewidth=1.0,zorder=1,color=(0.3,0.3,0.3,1.0)) basemap.drawmeridians(np.arange(np.floor(basemap.llcrnrlon), np.ceil(basemap.urcrnrlon),0.5), labels=[0,0,0,1],dashes=[2,2], ax=main_ax,zorder=1,color=(0.3,0.3,0.3,1.0),fontsize=8,linewidth=0.5) basemap.drawparallels(np.arange(np.floor(basemap.llcrnrlat), np.ceil(basemap.urcrnrlat),0.5), labels=[1,0,0,0],dashes=[2,2], ax=main_ax,zorder=1,color=(0.3,0.3,0.3,1.0),fontsize=8,linewidth=0.5) # zorder 0 time_idx = np.argmin(abs(time - time_list[0])) vert_mask = mask[0][time_idx,:] vert_disp = displacement_list[0][time_idx,~vert_mask,2] vertical_image = [basemap.drawscalar(1000*vert_disp,lonlat[~vert_mask], cmap=matplotlib.cm.RdBu_r, zorder=0,vmin=vmin,vmax=vmax,ax=main_ax)] # zorder 4 if mapscale_lonlat is None: basemap.drawmapscale(units='km', lat=basemap.latmin+(basemap.latmax-basemap.latmin)/3.25, lon=basemap.lonmax-(basemap.lonmax-basemap.lonmin)/7.75, fontsize=8, lon0=(basemap.lonmin+basemap.lonmax)/2.0, lat0=(basemap.latmin+basemap.latmax)/2.0, barstyle='fancy',ax=main_ax, length=mapscale_length,zorder=4) else: basemap.drawmapscale(units='km', lat=mapscale_lonlat[1], lon=mapscale_lonlat[0], fontsize=8, lon0=(basemap.lonmin+basemap.lonmax)/2.0, lat0=(basemap.latmin+basemap.latmax)/2.0, barstyle='fancy',ax=main_ax, length=mapscale_length,zorder=4) #cbar = transparent_colorbar(vertical_image[0]) #cbar.set_alpha(1) #cbar.draw_all() cbar = plt.colorbar(vertical_image[0]) cbar.ax.tick_params(labelsize=8) cbar.solids.set_rasterized(True) cbar.ax.set_ylabel('vertical (mm)',fontsize=8) if minimap_pos is None: basemap.drawminimap([0.587,0.7,0.15,0.15],ax=main_ax) else: basemap.drawminimap(minimap_pos,ax=main_ax) #basemap.drawminimap([0.095,0.72,0.15,0.15],ax=main_ax) else: position = np.array([lon,lat]).transpose() main_ax.set_aspect('equal') station_point_lst = [] station_point_label_lst = [] for sid in range(Nx): loni = lon[sid] lati = lat[sid] x,y = position[sid,:] #x,y = basemap(loni,lati) station_point = main_ax.plot(x,y,'ko',markersize=0.01,picker=8,zorder=3) station_point_label_lst += [station_point[0].get_label()] station_point_lst += station_point station_point_label_lst = np.array(station_point_label_lst,dtype=str) Q_lst = [] for idx in range(N): time_idx = np.argmin(abs(time - time_list[idx])) if idx >= 1: main_ax.scatter(position[:,0],position[:,1],c=1000*displacement_list[idx][time_idx,:,2],s=50,linewidths=1, cmap=matplotlib.cm.RdBu_r,vmin=vmin,vmax=vmax,edgecolor=mygreen,zorder=2) if np.any(covariance_list[idx] > 1e-8): args = quiver_args(position, displacement_list[idx][time_idx,:,:], covariance_list[idx][time_idx,:,:,:], mask[idx][time_idx,:]) Q_lst += [main_ax.quiver(args[0],args[1],args[2],args[3],sigma=args[4], scale_units='xy', angles='xy', width=0.004, scale=quiver_scale, color=colors[idx], ellipse_edgecolors=colors[idx], ellipse_linewidths=1.0, zorder=4+idx)] else: args = quiver_args(position, displacement_list[idx][time_idx,:,:]) Q_lst += [main_ax.quiver(args[0],args[1],args[2],args[3], scale_units='xy', angles='xy', width=0.004, scale=quiver_scale, color=colors[idx], ellipse_edgecolors=colors[idx], zorder=4+idx)] #v_scale = np.array([0.0]) #z_scale = np.array([0.0]) xlim = main_ax.get_xlim() ylim = main_ax.get_ylim() xo = xlim[1] yo = ylim[1] xwidth = xlim[1] - xlim[0] ywidth = ylim[1] - ylim[0] if quiverscale_lonlat is None: x_scale = xo - 2.25*xwidth/10.0 y_scale = yo - 4.4*ywidth/10.0 else: x_scale,y_scale = basemap(*quiverscale_lonlat) main_ax.quiverkey(Q_lst[0],x_scale,y_scale,scale_length,coordinates='data',labelsep=0.05, fontproperties={'size':8},label='%s mm' % int(1000*scale_length)) #x_text = x_scale #y_text = y_scale - 0.5*ywidth/10.0 #dy_text = -ywidth/10.0 #for i in range(N): # main_ax.text(x_text,y_text+i*dy_text,disp_type[i]) # main_ax.quiver(x_scale,y_scale+i*dy_text,u_scale,v_scale, # scale_units='xy', # angles='xy', # width=0.004, # scale=quiver_scale, # color=colors[i],zorder=4) #main_ax.text(x_text,y_text-0.8*dy_text, # '%s mm' % (int(1000*scale_length)),zorder=4) def _slider_update(t): time_idx = np.argmin(abs(t - time_list[0])) vertical_image[0].remove() vert_mask = mask[0][time_idx,:] vert_disp = displacement_list[0][time_idx,~vert_mask,2] vertical_image[0] = basemap.drawscalar(1000*vert_disp,lonlat[~vert_mask], cmap=matplotlib.cm.RdBu_r, zorder=0,vmin=vmin,vmax=vmax,ax=main_ax) #plt.colorbar(vertical_image[0]) for idx in range(N): time_idx = np.argmin(abs(t - time_list[idx])) if idx >= 1: main_ax.scatter(position[:,0],position[:,1],c=1000*displacement_list[idx][time_idx,:,2],s=50,linewidths=1, cmap=matplotlib.cm.RdBu_r,vmin=vmin,vmax=vmax,edgecolor=mygreen,zorder=2) if np.any(covariance_list[idx] > 1e-8): args = quiver_args(position, displacement_list[idx][time_idx,:,:], covariance_list[idx][time_idx,:,:,:], mask[idx][time_idx,:]) Q_lst[idx].set_UVC(args[2],args[3],sigma=args[4]) else: args = quiver_args(position, displacement_list[idx][time_idx]) Q_lst[idx].set_UVC(args[2],args[3]) try: # if there is a %s in the title string then try to fill it with a timestamp main_ax.set_title(title % modest.decyear_inv(t,format='%Y-%m-%d'),fontsize=10) except TypeError: main_ax.set_title(title,fontsize=10) main_fig.canvas.draw() return def _onpick(event): idx = np.nonzero(str(event.artist.get_label()) == station_point_label_lst) idx = idx[0][0] station_lon = lon[idx] station_lat = lat[idx] station_label = station_names[idx] sub_ax[0].cla() sub_ax[1].cla() sub_ax[2].cla() for i in range(N): midx = mask[i][:,idx] disp = displacement_list[i][:,idx,:] cov = covariance_list[i][:,idx,:,:] if np.any(covariance_list[i] > 1e-8): sub_ax[0].fill_between(time_list[i][~midx], 1000*(disp[~midx,0]+np.sqrt(cov[~midx,0,0])), 1000*(disp[~midx,0]-np.sqrt(cov[~midx,0,0])), color=colors[i],alpha=0.4,edgecolor='none') sub_ax[1].fill_between(time_list[i][~midx], 1000*(disp[~midx,1]+np.sqrt(cov[~midx,1,1])), 1000*(disp[~midx,1]-np.sqrt(cov[~midx,1,1])), color=colors[i],alpha=0.4,edgecolor='none') sub_ax[2].fill_between(time_list[i][~midx], 1000*(disp[~midx,2]+np.sqrt(cov[~midx,2,2])), 1000*(disp[~midx,2]-np.sqrt(cov[~midx,2,2])), color=colors[i],alpha=0.4,edgecolor='none') sub_ax[0].plot(time_list[i][~midx], 1000*disp[~midx,0], color=colors[i],linestyle='-',marker='.') sub_ax[1].plot(time_list[i][~midx], 1000*disp[~midx,1], color=colors[i],linestyle='-',marker='.') sub_ax[2].plot(time_list[i][~midx], 1000*disp[~midx,2], color=colors[i],linestyle='-',marker='.') #sub_ax[0].errorbar(times[~midx], # 1000*disp[~midx,0], # 1000*np.sqrt(cov[~midx,0,0]), # color=colors[i],capsize=1,fmt='.') #sub_ax[1].errorbar(times[~midx], # 1000*disp[~midx,1], # 1000*np.sqrt(cov[~midx,1,1]), # color=colors[i],capsize=1,fmt='.') #sub_ax[2].errorbar(times[~midx], # 1000*disp[~midx,2], # 1000*np.sqrt(cov[~midx,2,2]), # color=colors[i],capsize=1,fmt='.') else: sub_ax[0].plot(time_list[i][~midx], 1000*disp[~midx,0], color=colors[i],linestyle='-',marker='.') sub_ax[1].plot(time_list[i][~midx], 1000*disp[~midx,1], color=colors[i],linestyle='-',marker='.') sub_ax[2].plot(time_list[i][~midx], 1000*disp[~midx,2], color=colors[i],linestyle='-',marker='.') sub_ax[0].set_title('station %s (%s$^\circ$N, %s$^\circ$E)' % (station_label,round(station_lat,2),round(station_lon,2))) sub_ax[0].legend(disp_type,loc=1,frameon=False,numpoints=4) sub_ax[0].ticklabel_format(useOffset=False, style='plain') sub_ax[0].set_ylabel('easting (mm)') sub_ax[1].set_ylabel('northing (mm)') sub_ax[2].set_ylabel('vertical (mm)') sub_ax[2].set_xlabel('year') sub_fig.canvas.draw() event.artist.set_markersize(10) main_fig.canvas.draw() event.artist.set_markersize(0.01) return time_slider.on_changed(_slider_update) main_fig.canvas.mpl_connect('pick_event',_onpick) for a in artists: main_ax.add_artist(a) plt.show()