def __init__( self, fig: Figure, x_bounds: tuple, y_bounds: tuple, grid_size: float, legend_label: str, ): """ Creates a HeatmapPlotter for the given figure, with the given x-axis and y-axis bounds and grid cell size. This will show up in the Bokeh figure legend as legend_label. :param fig: a Bokeh figure :param x_bounds: the x-axis bounds of the heatmap :param y_bounds: the y-axis bounds of the heatmap :param grid_size: the size of a grid cell on the heatmap :param legend_label: the legend label of the heatmap """ self.image_data_source = ColumnDataSource(dict(image=[])) self.x_bounds = x_bounds self.y_bounds = y_bounds self.grid_size = grid_size fig.image( source=self.image_data_source, image="image", x=min(x_bounds), y=min(y_bounds), dh=max(y_bounds) - min(y_bounds), dw=max(x_bounds) - min(x_bounds), palette=palettes.viridis(100), level="image", legend_label=legend_label, )
def jwst_2d_det(result_dict, plot=True, output_file='det2d.html'): """Plot 2d detector image Parameters ---------- result_dict : dict Dictionary from pandexo output. If parameter space was run in run_pandexo make sure to restructure the input as a list of dictionaries without they key words that run_pandexo assigns. plot : bool (Optional) True renders plot, Flase does not. Default=True output_file : str (Optional) Default = 'det2d.html' Return ------ numpy array 2D array of out of transit detector simulation See Also -------- jwst_1d_spec, jwst_1d_bkg, jwst_1d_flux, jwst_1d_snr, jwst_noise, jwst_2d_sat """ TOOLS = "pan,wheel_zoom,box_zoom,resize,reset,save" out = result_dict['PandeiaOutTrans'] data = out['2d']['detector'] xr, yr = data.shape plot_detector_2d = Figure( tools="pan,wheel_zoom,box_zoom,resize,reset,hover,save", x_range=[0, yr], y_range=[0, xr], x_axis_label='Pixel', y_axis_label='Spatial', title="2D Detector Image", plot_width=800, plot_height=300) plot_detector_2d.image(image=[data], x=[0], y=[0], dh=[xr], dw=[yr], palette="Spectral11") if plot: outputfile(output_file) show(plot_detector_2d) return data
def create_fig(self, sources): """ Class implementation of :meth:`LivePlot.create_fig`. """ fig = Figure(logo=None, x_range=[-self._sample_rate/2.0, self._sample_rate/2.0], y_range=[0,self._height], **self._fig_args) fig.image('image', source= sources['wfall'], x=-self._sample_rate/2.0, y = 0, dw=self._sample_rate,dh=self._height,palette=Defaults.WFALL_COLORMAP ) fig.xgrid.grid_line_color = None fig.ygrid.grid_line_color = None fig.axis.visible = False return fig
def view_database_file(_id, file_type): ds = load_file(_id, file_type) d = {} for data_var in ds.data_vars: d[data_var] = [ds[data_var].values] d["to_plot"] = [ds[list(ds.data_vars)[0]].values] source = ColumnDataSource(d) callback = CustomJS( args=dict(source=source), code=""" var data = source.data; data['to_plot'] = data[cb_obj.value]; source.change.emit(); """, ) select = Select(title="Variable:", options=list(ds.data_vars)) select.js_on_change("value", callback) p = Figure( x_range=(-180, 180), y_range=(-90, 90), aspect_ratio=2.5, tools="pan,wheel_zoom,box_zoom,reset, hover", ) p.sizing_mode = "scale_width" p.image( image="to_plot", x=-180, y=-90, dw=360, dh=180, source=source, palette="Viridis11", ) script, div = components( column(column(select), p, sizing_mode="stretch_width")) return render_template( "app/bokeh_plot.html", script=script, div=div, data_file_id=_id, title=file_type.capitalize(), )
def jwst_2d_det(result_dict, plot=True, output_file='det2d.html'): """Plot 2d detector image Parameters ---------- result_dict : dict Dictionary from pandexo output. If parameter space was run in run_pandexo make sure to restructure the input as a list of dictionaries without they key words that run_pandexo assigns. plot : bool (Optional) True renders plot, Flase does not. Default=True output_file : str (Optional) Default = 'det2d.html' Return ------ numpy array 2D array of out of transit detector simulation See Also -------- jwst_1d_spec, jwst_1d_bkg, jwst_1d_flux, jwst_1d_snr, jwst_noise, jwst_2d_sat """ TOOLS = "pan,wheel_zoom,box_zoom,resize,reset,save" out = result_dict['PandeiaOutTrans'] data = out['2d']['detector'] xr, yr = data.shape plot_detector_2d = Figure(tools="pan,wheel_zoom,box_zoom,resize,reset,hover,save", x_range=[0, yr], y_range=[0, xr], x_axis_label='Pixel', y_axis_label='Spatial', title="2D Detector Image", plot_width=800, plot_height=300) plot_detector_2d.image(image=[data], x=[0], y=[0], dh=[xr], dw=[yr], palette="Spectral11") if plot: outputfile(output_file) show(plot_detector_2d) return data
def create_component_jwst(result_dict): """Generate front end plots JWST Function that is responsible for generating the front-end interactive plots for JWST. Parameters ---------- result_dict : dict the dictionary returned from a PandExo run Returns ------- tuple A tuple containing `(script, div)`, where the `script` is the front-end javascript required, and `div` is a dictionary of plot objects. """ timing = result_dict['timing'] noccultations = result_dict['timing']['Number of Transits'] out = result_dict['PandeiaOutTrans'] # select the tools we want TOOLS = "pan,wheel_zoom,box_zoom,resize,reset,save" #Define units for x and y axis punit = result_dict['input']['Primary/Secondary'] p=1.0 if punit == 'fp/f*': p = -1.0 else: punit = punit if result_dict['input']['Calculation Type'] =='phase_spec': x_axis_label='Time (secs)' frac = 1.0 else: x_axis_label='Wavelength [microns]' frac = result_dict['timing']['Num Integrations Out of Transit']/result_dict['timing']['Num Integrations In Transit'] electrons_out = result_dict['RawData']['electrons_out'] electrons_in = result_dict['RawData']['electrons_in'] var_in = result_dict['RawData']['var_in'] var_out = result_dict['RawData']['var_out'] x = result_dict['FinalSpectrum']['wave'] y = result_dict['FinalSpectrum']['spectrum_w_rand'] err = result_dict['FinalSpectrum']['error_w_floor'] y_err = [] x_err = [] for px, py, yerr in zip(x, y, err): np.array(x_err.append((px, px))) np.array(y_err.append((py - yerr, py + yerr))) source = ColumnDataSource(data=dict(x=x, y=y, y_err=y_err, x_err=x_err, err=err, electrons_out=electrons_out, electrons_in=electrons_in, var_in=var_in, var_out=var_out, p=var_in*0+p,nocc=var_in*0+noccultations, frac = var_in*0+frac)) original = ColumnDataSource(data=dict(x=x, y=y, y_err=y_err, x_err=x_err, err=err, electrons_out=electrons_out, electrons_in=electrons_in, var_in=var_in, var_out=var_out)) ylims = [min(result_dict['OriginalInput']['model_spec'])- 0.1*min(result_dict['OriginalInput']['model_spec']), 0.1*max(result_dict['OriginalInput']['model_spec'])+max(result_dict['OriginalInput']['model_spec'])] xlims = [min(result_dict['FinalSpectrum']['wave']), max(result_dict['FinalSpectrum']['wave'])] plot_spectrum = Figure(plot_width=800, plot_height=300, x_range=xlims, y_range=ylims, tools=TOOLS,#responsive=True, x_axis_label=x_axis_label, y_axis_label=punit, title="Original Model with Observation") plot_spectrum.line(result_dict['OriginalInput']['model_wave'],result_dict['OriginalInput']['model_spec'], color= "black", alpha = 0.5, line_width = 4) plot_spectrum.circle('x', 'y', source=source, line_width=3, line_alpha=0.6) plot_spectrum.multi_line('x_err', 'y_err', source=source) callback = CustomJS(args=dict(source=source, original=original), code=""" // Grab some references to the data var sdata = source.get('data'); var odata = original.get('data'); // Create copies of the original data, store them as the source data sdata['x'] = odata['x'].slice(0); sdata['y'] = odata['y'].slice(0); sdata['y_err'] = odata['y_err'].slice(0); sdata['x_err'] = odata['x_err'].slice(0); sdata['err'] = odata['err'].slice(0); sdata['electrons_out'] = odata['electrons_out'].slice(0); sdata['electrons_in'] = odata['electrons_in'].slice(0); sdata['var_in'] = odata['var_in'].slice(0); sdata['var_out'] = odata['var_out'].slice(0); // Create some variables referencing the source data var x = sdata['x']; var y = sdata['y']; var y_err = sdata['y_err']; var x_err = sdata['x_err']; var err = sdata['err']; var p = sdata['p']; var frac = sdata['frac']; var og_ntran = sdata['nocc']; var electrons_out = sdata['electrons_out']; var electrons_in = sdata['electrons_in']; var var_in = sdata['var_in']; var var_out = sdata['var_out']; var f = wbin.get('value'); var ntran = ntran.get('value'); var wlength = Math.pow(10.0,f); var ind = []; ind.push(0); var start = 0; for (i = 0; i < x.length-1; i++) { if (x[i+1] - x[start] >= wlength) { ind.push(i+1); start = i; } } if (ind[ind.length-1] != x.length) { ind.push(x.length); } var xout = []; var foutout = []; var finout = []; var varinout = []; var varoutout = []; var xslice = []; var foutslice = []; var finslice = []; var varoutslice = []; var varinslice = []; function add(a, b) { return a+b; } for (i = 0; i < ind.length-1; i++) { xslice = x.slice(ind[i],ind[i+1]); foutslice = electrons_out.slice(ind[i],ind[i+1]); finslice = electrons_in.slice(ind[i],ind[i+1]); varinslice = var_in.slice(ind[i],ind[i+1]); varoutslice = var_out.slice(ind[i],ind[i+1]); xout.push(xslice.reduce(add, 0)/xslice.length); foutout.push(foutslice.reduce(add, 0)); finout.push(finslice.reduce(add, 0)); varinout.push(varinslice.reduce(add, 0)); varoutout.push(varoutslice.reduce(add, 0)); xslice = []; foutslice = []; finslice = []; varinslice = []; varoutslice = []; } var new_err = 1.0; var rand = 1.0; for (i = 0; i < x.length; i++) { new_err = Math.pow((frac[i]/foutout[i]),2)*varinout[i] + Math.pow((finout[i]*frac[i]/Math.pow(foutout[i],2)),2)*varoutout[i]; new_err = Math.sqrt(new_err)*Math.sqrt(og_ntran[i]/ntran); rand = new_err*(Math.random()-Math.random()); y[i] = p[i]*((1.0 - frac[i]*finout[i]/foutout[i]) + rand); x[i] = xout[i]; x_err[i][0] = xout[i]; x_err[i][1] = xout[i]; y_err[i][0] = y[i] + new_err; y_err[i][1] = y[i] - new_err; } source.trigger('change'); """) #var_tot = (frac/electrons_out)**2.0 * var_in + (electrons_in*frac/electrons_out**2.0)**2.0 * var_out sliderWbin = Slider(title="binning", value=np.log10(x[1]-x[0]), start=np.log10(x[1]-x[0]), end=np.log10(max(x)/2.0), step= .05, callback=callback) callback.args["wbin"] = sliderWbin sliderTrans = Slider(title="Num Trans", value=noccultations, start=1, end=50, step= 1, callback=callback) callback.args["ntran"] = sliderTrans layout = column(row(sliderWbin,sliderTrans), plot_spectrum) #out of transit 2d output raw = result_dict['RawData'] # Flux 1d x, y = raw['wave'], raw['e_rate_out']*result_dict['timing']['Seconds per Frame']*(timing["APT: Num Groups per Integration"]-1) x = x[~np.isnan(y)] y = y[~np.isnan(y)] plot_flux_1d1 = Figure(tools=TOOLS, x_axis_label='Wavelength [microns]', y_axis_label='e-/integration', title="Flux Per Integration", plot_width=800, plot_height=300) plot_flux_1d1.line(x, y, line_width = 4, alpha = .7) tab1 = Panel(child=plot_flux_1d1, title="Flux per Int") # BG 1d #x, y = out['1d']['extracted_bg_only'] #y = y[~np.isnan(y)] #x = x[~np.isnan(y)] #plot_bg_1d1 = Figure(tools=TOOLS, # x_axis_label='Wavelength [microns]', # y_axis_label='Flux (e/s)', title="Background", # plot_width=800, plot_height=300) #plot_bg_1d1.line(x, y, line_width = 4, alpha = .7) #tab2 = Panel(child=plot_bg_1d1, title="Background Flux") # SNR y = np.sqrt(y) #this is computing the SNR (sqrt of photons in a single integration) plot_snr_1d1 = Figure(tools=TOOLS, x_axis_label=x_axis_label, y_axis_label='sqrt(e-)/integration', title="SNR per integration", plot_width=800, plot_height=300) plot_snr_1d1.line(x, y, line_width = 4, alpha = .7) tab3 = Panel(child=plot_snr_1d1, title="SNR per Int") # Error bars (ppm) x = result_dict['FinalSpectrum']['wave'] y = result_dict['FinalSpectrum']['error_w_floor']*1e6 x = x[~np.isnan(y)] y = y[~np.isnan(y)] ymed = np.median(y) plot_noise_1d1 = Figure(tools=TOOLS,#responsive=True, x_axis_label=x_axis_label, y_axis_label='Spectral Precision (ppm)', title="Spectral Precision", plot_width=800, plot_height=300, y_range = [0,2.0*ymed]) ymed = np.median(y) plot_noise_1d1.circle(x, y, line_width = 4, alpha = .7) tab4 = Panel(child=plot_noise_1d1, title="Precision") #Not happy? Need help picking a different mode? plot_spectrum2 = Figure(plot_width=800, plot_height=300, x_range=xlims,y_range=ylims, tools=TOOLS, x_axis_label=x_axis_label, y_axis_label=punit, title="Original Model",y_axis_type="log") plot_spectrum2.line(result_dict['OriginalInput']['model_wave'],result_dict['OriginalInput']['model_spec'], line_width = 4,alpha = .7) tab5 = Panel(child=plot_spectrum2, title="Original Model") #create set of five tabs tabs1d = Tabs(tabs=[ tab1,tab3, tab4, tab5]) # Detector 2d data = out['2d']['detector'] xr, yr = data.shape plot_detector_2d = Figure(tools="pan,wheel_zoom,box_zoom,resize,reset,hover,save", x_range=[0, yr], y_range=[0, xr], x_axis_label='Pixel', y_axis_label='Spatial', title="2D Detector Image", plot_width=800, plot_height=300) plot_detector_2d.image(image=[data], x=[0], y=[0], dh=[xr], dw=[yr], palette="Spectral11") #2d tabs #2d snr data = out['2d']['snr'] data[np.isinf(data)] = 0.0 xr, yr = data.shape plot_snr_2d = Figure(tools=TOOLS, x_range=[0, yr], y_range=[0, xr], x_axis_label='Pixel', y_axis_label='Spatial', title="Signal-to-Noise Ratio", plot_width=800, plot_height=300) plot_snr_2d.image(image=[data], x=[0], y=[0], dh=[xr], dw=[yr], palette="Spectral11") tab1b = Panel(child=plot_snr_2d, title="SNR") #saturation data = out['2d']['saturation'] xr, yr = data.shape plot_sat_2d = Figure(tools=TOOLS, x_range=[0, yr], y_range=[0, xr], x_axis_label='Pixel', y_axis_label='Spatial', title="Saturation", plot_width=800, plot_height=300) plot_sat_2d.image(image=[data], x=[0], y=[0], dh=[xr], dw=[yr], palette="Spectral11") tab2b = Panel(child=plot_sat_2d, title="Saturation") tabs2d = Tabs(tabs=[ tab1b, tab2b]) result_comp = components({'plot_spectrum':layout, 'tabs1d': tabs1d, 'det_2d': plot_detector_2d, 'tabs2d': tabs2d}) return result_comp
def create_component_jwst(result_dict): """Generate front end plots JWST Function that is responsible for generating the front-end interactive plots for JWST. Parameters ---------- result_dict : dict the dictionary returned from a PandExo run Returns ------- tuple A tuple containing `(script, div)`, where the `script` is the front-end javascript required, and `div` is a dictionary of plot objects. """ noccultations = result_dict['timing']['Number of Transits'] # select the tools we want TOOLS = "pan,wheel_zoom,box_zoom,resize,reset,save" #Define units for x and y axis punit = result_dict['input']['Primary/Secondary'] p=1.0 if punit == 'fp/f*': p = -1.0 else: punit = '('+punit+')^2' if result_dict['input']['Calculation Type'] =='phase_spec': x_axis_label='Time (secs)' frac = 1.0 else: x_axis_label='Wavelength [microns]' frac = result_dict['timing']['Num Integrations Out of Transit']/result_dict['timing']['Num Integrations In Transit'] electrons_out = result_dict['RawData']['electrons_out'] electrons_in = result_dict['RawData']['electrons_in'] var_in = result_dict['RawData']['var_in'] var_out = result_dict['RawData']['var_out'] x = result_dict['FinalSpectrum']['wave'] y = result_dict['FinalSpectrum']['spectrum_w_rand'] err = result_dict['FinalSpectrum']['error_w_floor'] y_err = [] x_err = [] for px, py, yerr in zip(x, y, err): np.array(x_err.append((px, px))) np.array(y_err.append((py - yerr, py + yerr))) source = ColumnDataSource(data=dict(x=x, y=y, y_err=y_err, x_err=x_err, err=err, electrons_out=electrons_out, electrons_in=electrons_in, var_in=var_in, var_out=var_out, p=var_in*0+p,nocc=var_in*0+noccultations, frac = var_in*0+frac)) original = ColumnDataSource(data=dict(x=x, y=y, y_err=y_err, x_err=x_err, err=err, electrons_out=electrons_out, electrons_in=electrons_in, var_in=var_in, var_out=var_out)) ylims = [min(result_dict['OriginalInput']['model_spec'])- 0.1*min(result_dict['OriginalInput']['model_spec']), 0.1*max(result_dict['OriginalInput']['model_spec'])+max(result_dict['OriginalInput']['model_spec'])] xlims = [min(result_dict['FinalSpectrum']['wave']), max(result_dict['FinalSpectrum']['wave'])] plot_spectrum = Figure(plot_width=800, plot_height=300, x_range=xlims, y_range=ylims, tools=TOOLS,#responsive=True, x_axis_label=x_axis_label, y_axis_label=punit, title="Original Model with Observation") plot_spectrum.line(result_dict['OriginalInput']['model_wave'],result_dict['OriginalInput']['model_spec'], color= "black", alpha = 0.5, line_width = 4) plot_spectrum.circle('x', 'y', source=source, line_width=3, line_alpha=0.6) plot_spectrum.multi_line('x_err', 'y_err', source=source) callback = CustomJS(args=dict(source=source, original=original), code=""" // Grab some references to the data var sdata = source.get('data'); var odata = original.get('data'); // Create copies of the original data, store them as the source data sdata['x'] = odata['x'].slice(0); sdata['y'] = odata['y'].slice(0); sdata['y_err'] = odata['y_err'].slice(0); sdata['x_err'] = odata['x_err'].slice(0); sdata['err'] = odata['err'].slice(0); sdata['electrons_out'] = odata['electrons_out'].slice(0); sdata['electrons_in'] = odata['electrons_in'].slice(0); sdata['var_in'] = odata['var_in'].slice(0); sdata['var_out'] = odata['var_out'].slice(0); // Create some variables referencing the source data var x = sdata['x']; var y = sdata['y']; var y_err = sdata['y_err']; var x_err = sdata['x_err']; var err = sdata['err']; var p = sdata['p']; var frac = sdata['frac']; var og_ntran = sdata['nocc']; var electrons_out = sdata['electrons_out']; var electrons_in = sdata['electrons_in']; var var_in = sdata['var_in']; var var_out = sdata['var_out']; var f = wbin.get('value'); var ntran = ntran.get('value'); var wlength = Math.pow(10.0,f); var ind = []; ind.push(0); var start = 0; for (i = 0; i < x.length-1; i++) { if (x[i+1] - x[start] >= wlength) { ind.push(i+1); start = i; } } if (ind[ind.length-1] != x.length) { ind.push(x.length); } var xout = []; var foutout = []; var finout = []; var varinout = []; var varoutout = []; var xslice = []; var foutslice = []; var finslice = []; var varoutslice = []; var varinslice = []; function add(a, b) { return a+b; } for (i = 0; i < ind.length-1; i++) { xslice = x.slice(ind[i],ind[i+1]); foutslice = electrons_out.slice(ind[i],ind[i+1]); finslice = electrons_in.slice(ind[i],ind[i+1]); varinslice = var_in.slice(ind[i],ind[i+1]); varoutslice = var_out.slice(ind[i],ind[i+1]); xout.push(xslice.reduce(add, 0)/xslice.length); foutout.push(foutslice.reduce(add, 0)); finout.push(finslice.reduce(add, 0)); varinout.push(varinslice.reduce(add, 0)); varoutout.push(varoutslice.reduce(add, 0)); xslice = []; foutslice = []; finslice = []; varinslice = []; varoutslice = []; } var new_err = 1.0; var rand = 1.0; for (i = 0; i < x.length; i++) { new_err = Math.pow((frac[i]/foutout[i]),2)*varinout[i] + Math.pow((finout[i]*frac[i]/Math.pow(foutout[i],2)),2)*varoutout[i]; new_err = Math.sqrt(new_err)*Math.sqrt(og_ntran[i]/ntran); rand = new_err*(Math.random()-Math.random()); y[i] = p[i]*((1.0 - frac[i]*finout[i]/foutout[i]) + rand); x[i] = xout[i]; x_err[i][0] = xout[i]; x_err[i][1] = xout[i]; y_err[i][0] = y[i] + new_err; y_err[i][1] = y[i] - new_err; } source.trigger('change'); """) #var_tot = (frac/electrons_out)**2.0 * var_in + (electrons_in*frac/electrons_out**2.0)**2.0 * var_out sliderWbin = Slider(title="binning", value=np.log10(x[1]-x[0]), start=np.log10(x[1]-x[0]), end=np.log10(max(x)/2.0), step= .05, callback=callback) callback.args["wbin"] = sliderWbin sliderTrans = Slider(title="Num Trans", value=noccultations, start=1, end=50, step= 1, callback=callback) callback.args["ntran"] = sliderTrans layout = column(row(sliderWbin,sliderTrans), plot_spectrum) #out of transit 2d output out = result_dict['PandeiaOutTrans'] # Flux 1d x, y = out['1d']['extracted_flux'] x = x[~np.isnan(y)] y = y[~np.isnan(y)] plot_flux_1d1 = Figure(tools=TOOLS, x_axis_label='Wavelength [microns]', y_axis_label='Flux (e/s)', title="Out of Transit Flux Rate", plot_width=800, plot_height=300) plot_flux_1d1.line(x, y, line_width = 4, alpha = .7) tab1 = Panel(child=plot_flux_1d1, title="Total Flux") # BG 1d x, y = out['1d']['extracted_bg_only'] y = y[~np.isnan(y)] x = x[~np.isnan(y)] plot_bg_1d1 = Figure(tools=TOOLS, x_axis_label='Wavelength [microns]', y_axis_label='Flux (e/s)', title="Background", plot_width=800, plot_height=300) plot_bg_1d1.line(x, y, line_width = 4, alpha = .7) tab2 = Panel(child=plot_bg_1d1, title="Background Flux") # SNR 1d accounting for number of occultations x= out['1d']['sn'][0] y = out['1d']['sn'][1] x = x[~np.isnan(y)] y = y[~np.isnan(y)] y = y*np.sqrt(noccultations) plot_snr_1d1 = Figure(tools=TOOLS, x_axis_label=x_axis_label, y_axis_label='SNR', title="Pandeia SNR", plot_width=800, plot_height=300) plot_snr_1d1.line(x, y, line_width = 4, alpha = .7) tab3 = Panel(child=plot_snr_1d1, title="SNR") # Error bars (ppm) x = result_dict['FinalSpectrum']['wave'] y = result_dict['FinalSpectrum']['error_w_floor']*1e6 x = x[~np.isnan(y)] y = y[~np.isnan(y)] ymed = np.median(y) plot_noise_1d1 = Figure(tools=TOOLS,#responsive=True, x_axis_label=x_axis_label, y_axis_label='Error on Spectrum (PPM)', title="Error Curve", plot_width=800, plot_height=300, y_range = [0,2.0*ymed]) ymed = np.median(y) plot_noise_1d1.circle(x, y, line_width = 4, alpha = .7) tab4 = Panel(child=plot_noise_1d1, title="Error") #Not happy? Need help picking a different mode? plot_spectrum2 = Figure(plot_width=800, plot_height=300, x_range=xlims,y_range=ylims, tools=TOOLS, x_axis_label=x_axis_label, y_axis_label=punit, title="Original Model",y_axis_type="log") plot_spectrum2.line(result_dict['OriginalInput']['model_wave'],result_dict['OriginalInput']['model_spec'], line_width = 4,alpha = .7) tab5 = Panel(child=plot_spectrum2, title="Original Model") #create set of five tabs tabs1d = Tabs(tabs=[ tab1, tab2,tab3, tab4, tab5]) # Detector 2d data = out['2d']['detector'] xr, yr = data.shape plot_detector_2d = Figure(tools="pan,wheel_zoom,box_zoom,resize,reset,hover,save", x_range=[0, yr], y_range=[0, xr], x_axis_label='Pixel', y_axis_label='Spatial', title="2D Detector Image", plot_width=800, plot_height=300) plot_detector_2d.image(image=[data], x=[0], y=[0], dh=[xr], dw=[yr], palette="Spectral11") #2d tabs #2d snr data = out['2d']['snr'] data[np.isinf(data)] = 0.0 xr, yr = data.shape plot_snr_2d = Figure(tools=TOOLS, x_range=[0, yr], y_range=[0, xr], x_axis_label='Pixel', y_axis_label='Spatial', title="Signal-to-Noise Ratio", plot_width=800, plot_height=300) plot_snr_2d.image(image=[data], x=[0], y=[0], dh=[xr], dw=[yr], palette="Spectral11") tab1b = Panel(child=plot_snr_2d, title="SNR") #saturation data = out['2d']['saturation'] xr, yr = data.shape plot_sat_2d = Figure(tools=TOOLS, x_range=[0, yr], y_range=[0, xr], x_axis_label='Pixel', y_axis_label='Spatial', title="Saturation", plot_width=800, plot_height=300) plot_sat_2d.image(image=[data], x=[0], y=[0], dh=[xr], dw=[yr], palette="Spectral11") tab2b = Panel(child=plot_sat_2d, title="Saturation") tabs2d = Tabs(tabs=[ tab1b, tab2b]) result_comp = components({'plot_spectrum':layout, 'tabs1d': tabs1d, 'det_2d': plot_detector_2d, 'tabs2d': tabs2d}) return result_comp
from bokeh.plotting import Figure, show from scipy import misc from bokeh.io import curdoc from bokeh.models import HBox, VBoxForm, VBox, ColumnDataSource, BoxSelectTool import numpy from bokeh.models.widgets import Slider imageRaw = numpy.random.rand(256,256) source = ColumnDataSource(data={'image': [imageRaw]}) p = Figure(x_range=[0, 10], y_range=[0, 10],plot_width=400,plot_height=400, tools="crosshair, box_select, pan, reset, resize, save, wheel_zoom") p.image(image="image", x=[0], y=[0], dw=[10], dh=[10],source=source) p.select(BoxSelectTool).select_every_mousemove=False imageFFT = numpy.fft.fft2(imageRaw) imageFFT=numpy.fft.fftshift(imageFFT) x,y=numpy.meshgrid(range(imageFFT.shape[1]),range(imageFFT.shape[0]),indexing='xy') x = x - imageFFT.shape[1]/2 y = y - imageFFT.shape[0]/2 r = numpy.sqrt(x*x+y*y) # units are pixels theta = numpy.arctan2(x,y) fband=[16,16] SF = numpy.exp(-((r-fband[0])**2/(2.0*fband[1]*fband[1]))) #SF=numpy.ones(r.shape) #ori=45*(numpy.pi/180.0) #oband=[ori*0.95, ori*1.05] oband=[numpy.pi/4.0, numpy.pi/8.0] t1 = numpy.angle(numpy.exp(complex(0,1)*(theta-oband[0]))) # center it
#colormapHSV=cm.get_cmap("hsv") #bokehpaletteHSV=[plt.colors.rgb2hex(m) for m in colormapHSV(numpy.arange(colormapHSV.N))] #myColorMapperHSV=LinearColorMapper(bokehpaletteHSV) #colormapAu=cm.get_cmap("jet") #bokehpaletteAu=[plt.colors.rgb2hex(m) for m in colormapAu(numpy.arange(colormapAu.N))] #myColorMapperAu=LinearColorMapper(bokehpaletteAu) #set up the plots #need 4x4 grid for input image, FFT of input, filter itself (with sliders), and filtered image #need size to be dynamic? need ranges to be right inputPlot=Figure(title="input image", tools="crosshair, pan, reset, resize, save, wheel_zoom", plot_width=400,plot_height=400, x_range=[0,10], y_range=[0,10]) #http://bokeh.pydata.org/en/0.10.0/docs/gallery/image.html inputPlot.image(image=[imageRaw],x=[0],y=[0],dw=[10],dh=[10])#,palette=myColorMapperGrey.palette) #would be awesome to have a custom palette that maps orientation to color like VV inputPlot.axis.visible=None #inputFFTPlot=Figure(title="FFT of input image", # x_range=[0,10], y_range=[0,10]) #inputFFTPlot.image(image=[imageFFT],x=[0],y=[0],dw=[10],dh=[10],palette="Greys9") # filterPlot=Figure(title="current filter", plot_width=400,plot_height=400, x_range=[0,10], y_range=[0,10]) filterPlot.image(image=[customFilter],x=[0],y=[0],dw=[10],dh=[10],palette="Spectral11")#,palette=myColorMapperAu.palette) filterPlot.axis.visible=None outputPlot=Figure(title="filtered image", plot_width=400,plot_height=400, x_range=[0,10], y_range=[0,10])
def plot_cross_section_bokeh(filename, map_data_all_slices, map_depth_all_slices, \ color_range_all_slices, cross_data, boundary_data, \ style_parameter): ''' Plot shear velocity maps and cross-sections using bokeh Input: filename is the filename of the resulting html file map_data_all_slices contains the velocity model parameters saved for map view plots map_depth_all_slices is a list of depths color_range_all_slices is a list of color ranges profile_data_all is a list of velocity profiles cross_lat_data_all is a list of cross-sections along latitude lat_value_all is a list of corresponding latitudes for these cross-sections cross_lon_data_all is a list of cross-sections along longitude lon_value_all is a list of corresponding longitudes for these cross-sections boundary_data is a list of boundaries style_parameter contains parameters to customize the plots Output: None ''' xlabel_fontsize = style_parameter['xlabel_fontsize'] # colorbar_data_all_left = [] colorbar_data_all_right = [] map_view_ndepth = style_parameter['map_view_ndepth'] palette_r = palette[::-1] ncolor = len(palette_r) colorbar_top = [0.1 for i in range(ncolor)] colorbar_bottom = [0 for i in range(ncolor)] map_data_all_slices_depth = [] for idepth in range(map_view_ndepth): color_min = color_range_all_slices[idepth][0] color_max = color_range_all_slices[idepth][1] color_step = (color_max - color_min)*1./ncolor colorbar_left = np.linspace(color_min,color_max-color_step,ncolor) colorbar_right = np.linspace(color_min+color_step,color_max,ncolor) colorbar_data_all_left.append(colorbar_left) colorbar_data_all_right.append(colorbar_right) map_depth = map_depth_all_slices[idepth] map_data_all_slices_depth.append('Depth: {0:8.0f} km'.format(map_depth)) # data for the colorbar colorbar_data_one_slice = {} colorbar_data_one_slice['colorbar_left'] = colorbar_data_all_left[style_parameter['map_view_default_index']] colorbar_data_one_slice['colorbar_right'] = colorbar_data_all_right[style_parameter['map_view_default_index']] colorbar_data_one_slice_bokeh = ColumnDataSource(data=dict(colorbar_top=colorbar_top,colorbar_bottom=colorbar_bottom,\ colorbar_left=colorbar_data_one_slice['colorbar_left'],\ colorbar_right=colorbar_data_one_slice['colorbar_right'],\ palette_r=palette_r)) colorbar_data_all_slices_bokeh = ColumnDataSource(data=dict(colorbar_data_all_left=colorbar_data_all_left,\ colorbar_data_all_right=colorbar_data_all_right)) # map_view_label_lon = style_parameter['map_view_depth_label_lon'] map_view_label_lat = style_parameter['map_view_depth_label_lat'] map_data_one_slice_depth = map_data_all_slices_depth[style_parameter['map_view_default_index']] map_data_one_slice_depth_bokeh = ColumnDataSource(data=dict(lat=[map_view_label_lat], lon=[map_view_label_lon], map_depth=[map_data_one_slice_depth])) # map_view_default_index = style_parameter['map_view_default_index'] map_data_one_slice = map_data_all_slices[map_view_default_index] map_data_one_slice_bokeh = ColumnDataSource(data=dict(x=[style_parameter['map_view_image_lon_min']],\ y=[style_parameter['map_view_image_lat_min']],dw=[style_parameter['nlon']],\ dh=[style_parameter['nlat']],map_data_one_slice=[map_data_one_slice])) map_data_all_slices_bokeh = ColumnDataSource(data=dict(map_data_all_slices=map_data_all_slices,\ map_data_all_slices_depth=map_data_all_slices_depth)) # plot_depth = np.shape(cross_data)[0] * style_parameter['cross_ddepth'] plot_lon = great_arc_distance(style_parameter['cross_default_lat0'], style_parameter['cross_default_lon0'],\ style_parameter['cross_default_lat1'], style_parameter['cross_default_lon1']) cross_data_bokeh = ColumnDataSource(data=dict(x=[0],\ y=[plot_depth],dw=[plot_lon],\ dh=[plot_depth],cross_data=[cross_data])) map_line_bokeh = ColumnDataSource(data=dict(lat=[style_parameter['cross_default_lat0'], style_parameter['cross_default_lat1']],\ lon=[style_parameter['cross_default_lon0'], style_parameter['cross_default_lon1']])) # ncolor_cross = len(my_palette) colorbar_top_cross = [0.1 for i in range(ncolor_cross)] colorbar_bottom_cross = [0 for i in range(ncolor_cross)] color_min_cross = style_parameter['cross_view_vs_min'] color_max_cross = style_parameter['cross_view_vs_max'] color_step_cross = (color_max_cross - color_min_cross)*1./ncolor_cross colorbar_left_cross = np.linspace(color_min_cross, color_max_cross-color_step_cross, ncolor_cross) colorbar_right_cross = np.linspace(color_min_cross+color_step_cross, color_max_cross, ncolor_cross) # ============================== map_view = Figure(plot_width=style_parameter['map_view_plot_width'], plot_height=style_parameter['map_view_plot_height'], \ tools=style_parameter['map_view_tools'], title=style_parameter['map_view_title'], \ y_range=[style_parameter['map_view_figure_lat_min'], style_parameter['map_view_figure_lat_max']],\ x_range=[style_parameter['map_view_figure_lon_min'], style_parameter['map_view_figure_lon_max']]) # map_view.image('map_data_one_slice',x='x',\ y='y',dw='dw',\ dh='dh',palette=palette_r,\ source=map_data_one_slice_bokeh, level='image') depth_slider_callback = CustomJS(args=dict(map_data_one_slice_bokeh=map_data_one_slice_bokeh,\ map_data_all_slices_bokeh=map_data_all_slices_bokeh,\ colorbar_data_all_slices_bokeh=colorbar_data_all_slices_bokeh,\ colorbar_data_one_slice_bokeh=colorbar_data_one_slice_bokeh,\ map_data_one_slice_depth_bokeh=map_data_one_slice_depth_bokeh), code=""" var d_index = Math.round(cb_obj.value) var map_data_all_slices = map_data_all_slices_bokeh.data map_data_one_slice_bokeh.data['map_data_one_slice'] = [map_data_all_slices['map_data_all_slices'][d_index]] map_data_one_slice_bokeh.change.emit() var color_data_all_slices = colorbar_data_all_slices_bokeh.data colorbar_data_one_slice_bokeh.data['colorbar_left'] = color_data_all_slices['colorbar_data_all_left'][d_index] colorbar_data_one_slice_bokeh.data['colorbar_right'] = color_data_all_slices['colorbar_data_all_right'][d_index] colorbar_data_one_slice_bokeh.change.emit() map_data_one_slice_depth_bokeh.data['map_depth'] = [map_data_all_slices['map_data_all_slices_depth'][d_index]] map_data_one_slice_depth_bokeh.change.emit() """) depth_slider = Slider(start=0, end=style_parameter['map_view_ndepth']-1, \ value=map_view_default_index, step=1, \ width=style_parameter['map_view_plot_width'],\ title=style_parameter['depth_slider_title'], height=50, \ callback=depth_slider_callback) # ------------------------------ # add boundaries to map view # country boundaries map_view.multi_line(boundary_data['country']['longitude'],\ boundary_data['country']['latitude'],color='black',\ line_width=2, level='underlay',nonselection_line_alpha=1.0,\ nonselection_line_color='black') # marine boundaries map_view.multi_line(boundary_data['marine']['longitude'],\ boundary_data['marine']['latitude'],color='black',\ level='underlay',nonselection_line_alpha=1.0,\ nonselection_line_color='black') # shoreline boundaries map_view.multi_line(boundary_data['shoreline']['longitude'],\ boundary_data['shoreline']['latitude'],color='black',\ line_width=2, level='underlay',nonselection_line_alpha=1.0,\ nonselection_line_color='black') # state boundaries map_view.multi_line(boundary_data['state']['longitude'],\ boundary_data['state']['latitude'],color='black',\ level='underlay',nonselection_line_alpha=1.0,\ nonselection_line_color='black') # ------------------------------ # add depth label map_view.rect(style_parameter['map_view_depth_box_lon'], style_parameter['map_view_depth_box_lat'], \ width=style_parameter['map_view_depth_box_width'], height=style_parameter['map_view_depth_box_height'], \ width_units='screen',height_units='screen', color='#FFFFFF', line_width=1., line_color='black', level='underlay') map_view.text('lon', 'lat', 'map_depth', source=map_data_one_slice_depth_bokeh,\ text_font_size=style_parameter['annotating_text_font_size'],text_align='left',level='underlay') # ------------------------------ map_view.line('lon', 'lat', source=map_line_bokeh, line_dash=[8,2,8,2], line_color='#00ff00',\ nonselection_line_alpha=1.0, line_width=5.,\ nonselection_line_color='black') map_view.text([style_parameter['cross_default_lon0']],[style_parameter['cross_default_lat0']], ['A'], \ text_font_size=style_parameter['title_font_size'],text_align='left') map_view.text([style_parameter['cross_default_lon1']],[style_parameter['cross_default_lat1']], ['B'], \ text_font_size=style_parameter['title_font_size'],text_align='left') # ------------------------------ # change style map_view.title.text_font_size = style_parameter['title_font_size'] map_view.title.align = 'center' map_view.title.text_font_style = 'normal' map_view.xaxis.axis_label = style_parameter['map_view_xlabel'] map_view.xaxis.axis_label_text_font_style = 'normal' map_view.xaxis.axis_label_text_font_size = xlabel_fontsize map_view.xaxis.major_label_text_font_size = xlabel_fontsize map_view.yaxis.axis_label = style_parameter['map_view_ylabel'] map_view.yaxis.axis_label_text_font_style = 'normal' map_view.yaxis.axis_label_text_font_size = xlabel_fontsize map_view.yaxis.major_label_text_font_size = xlabel_fontsize map_view.xgrid.grid_line_color = None map_view.ygrid.grid_line_color = None map_view.toolbar.logo = None map_view.toolbar_location = 'above' map_view.toolbar_sticky = False # ============================== # plot colorbar colorbar_fig = Figure(tools=[], y_range=(0,0.1),plot_width=style_parameter['map_view_plot_width'], \ plot_height=style_parameter['colorbar_plot_height'],title=style_parameter['colorbar_title']) colorbar_fig.toolbar_location=None colorbar_fig.quad(top='colorbar_top',bottom='colorbar_bottom',left='colorbar_left',right='colorbar_right',\ color='palette_r',source=colorbar_data_one_slice_bokeh) colorbar_fig.yaxis[0].ticker=FixedTicker(ticks=[]) colorbar_fig.xgrid.grid_line_color = None colorbar_fig.ygrid.grid_line_color = None colorbar_fig.xaxis.axis_label_text_font_size = xlabel_fontsize colorbar_fig.xaxis.major_label_text_font_size = xlabel_fontsize colorbar_fig.xaxis[0].formatter = PrintfTickFormatter(format="%5.2f") colorbar_fig.title.text_font_size = xlabel_fontsize colorbar_fig.title.align = 'center' colorbar_fig.title.text_font_style = 'normal' # ============================== # annotating text annotating_fig01 = Div(text=style_parameter['annotating_html01'], \ width=style_parameter['annotation_plot_width'], height=style_parameter['annotation_plot_height']) annotating_fig02 = Div(text="""<p style="font-size:16px">""", \ width=style_parameter['annotation_plot_width'], height=style_parameter['annotation_plot_height']) # ============================== # plot cross-section along latitude cross_section_plot_width = int(style_parameter['cross_plot_height']*1.0/plot_depth*plot_lon/10.) cross_view = Figure(plot_width=cross_section_plot_width, plot_height=style_parameter['cross_plot_height'], \ tools=style_parameter['cross_view_tools'], title=style_parameter['cross_view_title'], \ y_range=[plot_depth, -30],\ x_range=[0, plot_lon]) cross_view.image('cross_data',x='x',\ y='y',dw='dw',\ dh='dh',palette=my_palette,\ source=cross_data_bokeh, level='image') cross_view.text([plot_lon*0.1], [-10], ['A'], \ text_font_size=style_parameter['title_font_size'],text_align='left',level='underlay') cross_view.text([plot_lon*0.9], [-10], ['B'], \ text_font_size=style_parameter['title_font_size'],text_align='left',level='underlay') # ------------------------------ # change style cross_view.title.text_font_size = style_parameter['title_font_size'] cross_view.title.align = 'center' cross_view.title.text_font_style = 'normal' cross_view.xaxis.axis_label = style_parameter['cross_view_xlabel'] cross_view.xaxis.axis_label_text_font_style = 'normal' cross_view.xaxis.axis_label_text_font_size = xlabel_fontsize cross_view.xaxis.major_label_text_font_size = xlabel_fontsize cross_view.yaxis.axis_label = style_parameter['cross_view_ylabel'] cross_view.yaxis.axis_label_text_font_style = 'normal' cross_view.yaxis.axis_label_text_font_size = xlabel_fontsize cross_view.yaxis.major_label_text_font_size = xlabel_fontsize cross_view.xgrid.grid_line_color = None cross_view.ygrid.grid_line_color = None cross_view.toolbar.logo = None cross_view.toolbar_location = 'right' cross_view.toolbar_sticky = False # ============================== colorbar_fig_right = Figure(tools=[], y_range=(0,0.1),plot_width=cross_section_plot_width, \ plot_height=style_parameter['colorbar_plot_height'],title=style_parameter['colorbar_title']) colorbar_fig_right.toolbar_location=None colorbar_fig_right.quad(top=colorbar_top_cross,bottom=colorbar_bottom_cross,\ left=colorbar_left_cross,right=colorbar_right_cross,\ color=my_palette) colorbar_fig_right.yaxis[0].ticker=FixedTicker(ticks=[]) colorbar_fig_right.xgrid.grid_line_color = None colorbar_fig_right.ygrid.grid_line_color = None colorbar_fig_right.xaxis.axis_label_text_font_size = xlabel_fontsize colorbar_fig_right.xaxis.major_label_text_font_size = xlabel_fontsize colorbar_fig_right.xaxis[0].formatter = PrintfTickFormatter(format="%5.2f") colorbar_fig_right.title.text_font_size = xlabel_fontsize colorbar_fig_right.title.align = 'center' colorbar_fig_right.title.text_font_style = 'normal' # ============================== output_file(filename,title=style_parameter['html_title'], mode=style_parameter['library_source']) left_column = Column(depth_slider, map_view, colorbar_fig, annotating_fig01, width=style_parameter['left_column_width']) right_column = Column(annotating_fig02, cross_view, colorbar_fig_right, width=cross_section_plot_width) layout = Row(left_column, right_column, height=800) save(layout)
def plot_3DModel_bokeh(filename, map_data_all_slices, map_depth_all_slices, \ color_range_all_slices, profile_data_all, boundary_data, \ style_parameter): ''' Plot shear velocity maps and velocity profiles using bokeh Input: filename is the filename of the resulting html file map_data_all_slices contains the velocity model parameters saved for map view plots map_depth_all_slices is a list of depths color_range_all_slices is a list of color ranges profile_data_all constains the velocity model parameters saved for profile plots boundary_data is a list of boundaries style_parameter contains plotting parameters Output: None ''' xlabel_fontsize = style_parameter['xlabel_fontsize'] # colorbar_data_all_left = [] colorbar_data_all_right = [] map_view_ndepth = style_parameter['map_view_ndepth'] ncolor = len(palette) colorbar_top = [0.1 for i in range(ncolor)] colorbar_bottom = [0 for i in range(ncolor)] map_data_all_slices_depth = [] for idepth in range(map_view_ndepth): color_min = color_range_all_slices[idepth][0] color_max = color_range_all_slices[idepth][1] color_step = (color_max - color_min)*1./ncolor colorbar_left = np.linspace(color_min,color_max-color_step,ncolor) colorbar_right = np.linspace(color_min+color_step,color_max,ncolor) colorbar_data_all_left.append(colorbar_left) colorbar_data_all_right.append(colorbar_right) map_depth = map_depth_all_slices[idepth] map_data_all_slices_depth.append('Depth: {0:8.0f} km'.format(map_depth)) # palette_r = palette[::-1] # data for the colorbar colorbar_data_one_slice = {} colorbar_data_one_slice['colorbar_left'] = colorbar_data_all_left[style_parameter['map_view_default_index']] colorbar_data_one_slice['colorbar_right'] = colorbar_data_all_right[style_parameter['map_view_default_index']] colorbar_data_one_slice_bokeh = ColumnDataSource(data=dict(colorbar_top=colorbar_top,colorbar_bottom=colorbar_bottom,\ colorbar_left=colorbar_data_one_slice['colorbar_left'],\ colorbar_right=colorbar_data_one_slice['colorbar_right'],\ palette_r=palette_r)) colorbar_data_all_slices_bokeh = ColumnDataSource(data=dict(colorbar_data_all_left=colorbar_data_all_left,\ colorbar_data_all_right=colorbar_data_all_right)) # map_view_label_lon = style_parameter['map_view_depth_label_lon'] map_view_label_lat = style_parameter['map_view_depth_label_lat'] map_data_one_slice_depth = map_data_all_slices_depth[style_parameter['map_view_default_index']] map_data_one_slice_depth_bokeh = ColumnDataSource(data=dict(lat=[map_view_label_lat], lon=[map_view_label_lon], map_depth=[map_data_one_slice_depth])) # map_view_default_index = style_parameter['map_view_default_index'] map_data_one_slice = map_data_all_slices[map_view_default_index] map_data_one_slice_bokeh = ColumnDataSource(data=dict(x=[style_parameter['map_view_image_lon_min']],\ y=[style_parameter['map_view_image_lat_min']],dw=[style_parameter['nlon']*style_parameter['dlon']],\ dh=[style_parameter['nlat']*style_parameter['dlat']],map_data_one_slice=[map_data_one_slice])) map_data_all_slices_bokeh = ColumnDataSource(data=dict(map_data_all_slices=map_data_all_slices,\ map_data_all_slices_depth=map_data_all_slices_depth)) # ------------------------------ nprofile = len(profile_data_all) grid_lat_list = [] grid_lon_list = [] width_list = [] height_list = [] for iprofile in range(nprofile): aprofile = profile_data_all[iprofile] grid_lat_list.append(aprofile['lat']) grid_lon_list.append(aprofile['lon']) width_list.append(style_parameter['map_view_grid_width']) height_list.append(style_parameter['map_view_grid_height']) grid_data_bokeh = ColumnDataSource(data=dict(lon=grid_lon_list,lat=grid_lat_list,\ width=width_list, height=height_list)) profile_default_index = style_parameter['profile_default_index'] selected_dot_on_map_bokeh = ColumnDataSource(data=dict(lat=[grid_lat_list[profile_default_index]], \ lon=[grid_lon_list[profile_default_index]], \ width=[style_parameter['map_view_grid_width']],\ height=[style_parameter['map_view_grid_height']],\ index=[profile_default_index])) # ------------------------------ profile_vs_all = [] profile_depth_all = [] profile_ndepth = style_parameter['profile_ndepth'] profile_lat_label_list = [] profile_lon_label_list = [] for iprofile in range(nprofile): aprofile = profile_data_all[iprofile] vs_raw = aprofile['vs'] top_raw = aprofile['top'] profile_lat_label_list.append('Lat: {0:12.1f}'.format(aprofile['lat'])) profile_lon_label_list.append('Lon: {0:12.1f}'.format(aprofile['lon'])) vs_plot = [] depth_plot = [] for idepth in range(profile_ndepth): vs_plot.append(vs_raw[idepth]) depth_plot.append(top_raw[idepth]) vs_plot.append(vs_raw[idepth]) depth_plot.append(top_raw[idepth+1]) profile_vs_all.append(vs_plot) profile_depth_all.append(depth_plot) profile_data_all_bokeh = ColumnDataSource(data=dict(profile_vs_all=profile_vs_all, \ profile_depth_all=profile_depth_all)) selected_profile_data_bokeh = ColumnDataSource(data=dict(vs=profile_vs_all[profile_default_index],\ depth=profile_depth_all[profile_default_index])) selected_profile_lat_label_bokeh = ColumnDataSource(data=\ dict(x=[style_parameter['profile_lat_label_x']], y=[style_parameter['profile_lat_label_y']],\ lat_label=[profile_lat_label_list[profile_default_index]])) selected_profile_lon_label_bokeh = ColumnDataSource(data=\ dict(x=[style_parameter['profile_lon_label_x']], y=[style_parameter['profile_lon_label_y']],\ lon_label=[profile_lon_label_list[profile_default_index]])) all_profile_lat_label_bokeh = ColumnDataSource(data=dict(profile_lat_label_list=profile_lat_label_list)) all_profile_lon_label_bokeh = ColumnDataSource(data=dict(profile_lon_label_list=profile_lon_label_list)) # button_ndepth = style_parameter['button_ndepth'] button_data_all_vs = [] button_data_all_vp = [] button_data_all_rho = [] button_data_all_top = [] for iprofile in range(nprofile): aprofile = profile_data_all[iprofile] button_data_all_vs.append(aprofile['vs'][:button_ndepth]) button_data_all_vp.append(aprofile['vp'][:button_ndepth]) button_data_all_rho.append(aprofile['rho'][:button_ndepth]) button_data_all_top.append(aprofile['top'][:button_ndepth]) button_data_all_bokeh = ColumnDataSource(data=dict(button_data_all_vs=button_data_all_vs,\ button_data_all_vp=button_data_all_vp,\ button_data_all_rho=button_data_all_rho,\ button_data_all_top=button_data_all_top)) # ============================== map_view = Figure(plot_width=style_parameter['map_view_plot_width'], plot_height=style_parameter['map_view_plot_height'], \ tools=style_parameter['map_view_tools'], title=style_parameter['map_view_title'], \ y_range=[style_parameter['map_view_figure_lat_min'], style_parameter['map_view_figure_lat_max']],\ x_range=[style_parameter['map_view_figure_lon_min'], style_parameter['map_view_figure_lon_max']]) # map_view.image('map_data_one_slice',x='x',\ y='y',dw='dw',\ dh='dh',palette=palette_r,\ source=map_data_one_slice_bokeh, level='image') depth_slider_callback = CustomJS(args=dict(map_data_one_slice_bokeh=map_data_one_slice_bokeh,\ map_data_all_slices_bokeh=map_data_all_slices_bokeh,\ colorbar_data_all_slices_bokeh=colorbar_data_all_slices_bokeh,\ colorbar_data_one_slice_bokeh=colorbar_data_one_slice_bokeh,\ map_data_one_slice_depth_bokeh=map_data_one_slice_depth_bokeh), code=""" var d_index = Math.round(cb_obj.value) var map_data_all_slices = map_data_all_slices_bokeh.data map_data_one_slice_bokeh.data['map_data_one_slice'] = [map_data_all_slices['map_data_all_slices'][d_index]] map_data_one_slice_bokeh.change.emit() var color_data_all_slices = colorbar_data_all_slices_bokeh.data colorbar_data_one_slice_bokeh.data['colorbar_left'] = color_data_all_slices['colorbar_data_all_left'][d_index] colorbar_data_one_slice_bokeh.data['colorbar_right'] = color_data_all_slices['colorbar_data_all_right'][d_index] colorbar_data_one_slice_bokeh.change.emit() map_data_one_slice_depth_bokeh.data['map_depth'] = [map_data_all_slices['map_data_all_slices_depth'][d_index]] map_data_one_slice_depth_bokeh.change.emit() """) depth_slider = Slider(start=0, end=style_parameter['map_view_ndepth']-1, \ value=map_view_default_index, step=1, \ width=style_parameter['map_view_plot_width'],\ title=style_parameter['depth_slider_title'], height=50, \ callback=depth_slider_callback) # ------------------------------ # add boundaries to map view # country boundaries map_view.multi_line(boundary_data['country']['longitude'],\ boundary_data['country']['latitude'],color='black',\ line_width=2, level='underlay',nonselection_line_alpha=1.0,\ nonselection_line_color='black') # marine boundaries map_view.multi_line(boundary_data['marine']['longitude'],\ boundary_data['marine']['latitude'],color='black',\ level='underlay',nonselection_line_alpha=1.0,\ nonselection_line_color='black') # shoreline boundaries map_view.multi_line(boundary_data['shoreline']['longitude'],\ boundary_data['shoreline']['latitude'],color='black',\ line_width=2, level='underlay',nonselection_line_alpha=1.0,\ nonselection_line_color='black') # state boundaries map_view.multi_line(boundary_data['state']['longitude'],\ boundary_data['state']['latitude'],color='black',\ level='underlay',nonselection_line_alpha=1.0,\ nonselection_line_color='black') # ------------------------------ # add depth label map_view.rect(style_parameter['map_view_depth_box_lon'], style_parameter['map_view_depth_box_lat'], \ width=style_parameter['map_view_depth_box_width'], height=style_parameter['map_view_depth_box_height'], \ width_units='screen',height_units='screen', color='#FFFFFF', line_width=1., line_color='black', level='underlay') map_view.text('lon', 'lat', 'map_depth', source=map_data_one_slice_depth_bokeh,\ text_font_size=style_parameter['annotating_text_font_size'],text_align='left',level='underlay') # ------------------------------ map_view.rect('lon', 'lat', width='width', \ width_units='screen', height='height', \ height_units='screen', line_color='gray', line_alpha=0.5, \ selection_line_color='gray', selection_line_alpha=0.5, selection_fill_color=None,\ nonselection_line_color='gray',nonselection_line_alpha=0.5, nonselection_fill_color=None,\ source=grid_data_bokeh, color=None, line_width=1, level='glyph') map_view.rect('lon', 'lat',width='width', \ width_units='screen', height='height', \ height_units='screen', line_color='#00ff00', line_alpha=1.0, \ source=selected_dot_on_map_bokeh, fill_color=None, line_width=3.,level='glyph') # ------------------------------ grid_data_bokeh.callback = CustomJS(args=dict(selected_dot_on_map_bokeh=selected_dot_on_map_bokeh, \ grid_data_bokeh=grid_data_bokeh,\ profile_data_all_bokeh=profile_data_all_bokeh,\ selected_profile_data_bokeh=selected_profile_data_bokeh,\ selected_profile_lat_label_bokeh=selected_profile_lat_label_bokeh,\ selected_profile_lon_label_bokeh=selected_profile_lon_label_bokeh, \ all_profile_lat_label_bokeh=all_profile_lat_label_bokeh, \ all_profile_lon_label_bokeh=all_profile_lon_label_bokeh, \ ), code=""" var inds = Math.round(cb_obj.selected['1d'].indices) var grid_data = grid_data_bokeh.data selected_dot_on_map_bokeh.data['lat'] = [grid_data['lat'][inds]] selected_dot_on_map_bokeh.data['lon'] = [grid_data['lon'][inds]] selected_dot_on_map_bokeh.data['index'] = [inds] selected_dot_on_map_bokeh.change.emit() var profile_data_all = profile_data_all_bokeh.data selected_profile_data_bokeh.data['vs'] = profile_data_all['profile_vs_all'][inds] selected_profile_data_bokeh.data['depth'] = profile_data_all['profile_depth_all'][inds] selected_profile_data_bokeh.change.emit() var all_profile_lat_label = all_profile_lat_label_bokeh.data['profile_lat_label_list'] var all_profile_lon_label = all_profile_lon_label_bokeh.data['profile_lon_label_list'] selected_profile_lat_label_bokeh.data['lat_label'] = [all_profile_lat_label[inds]] selected_profile_lon_label_bokeh.data['lon_label'] = [all_profile_lon_label[inds]] selected_profile_lat_label_bokeh.change.emit() selected_profile_lon_label_bokeh.change.emit() """) # ------------------------------ # change style map_view.title.text_font_size = style_parameter['title_font_size'] map_view.title.align = 'center' map_view.title.text_font_style = 'normal' map_view.xaxis.axis_label = style_parameter['map_view_xlabel'] map_view.xaxis.axis_label_text_font_style = 'normal' map_view.xaxis.axis_label_text_font_size = xlabel_fontsize map_view.xaxis.major_label_text_font_size = xlabel_fontsize map_view.yaxis.axis_label = style_parameter['map_view_ylabel'] map_view.yaxis.axis_label_text_font_style = 'normal' map_view.yaxis.axis_label_text_font_size = xlabel_fontsize map_view.yaxis.major_label_text_font_size = xlabel_fontsize map_view.xgrid.grid_line_color = None map_view.ygrid.grid_line_color = None map_view.toolbar.logo = None map_view.toolbar_location = 'above' map_view.toolbar_sticky = False # ============================== # plot colorbar colorbar_fig = Figure(tools=[], y_range=(0,0.1),plot_width=style_parameter['map_view_plot_width'], \ plot_height=style_parameter['colorbar_plot_height'],title=style_parameter['colorbar_title']) colorbar_fig.toolbar_location=None colorbar_fig.quad(top='colorbar_top',bottom='colorbar_bottom',left='colorbar_left',right='colorbar_right',\ color='palette_r',source=colorbar_data_one_slice_bokeh) colorbar_fig.yaxis[0].ticker=FixedTicker(ticks=[]) colorbar_fig.xgrid.grid_line_color = None colorbar_fig.ygrid.grid_line_color = None colorbar_fig.xaxis.axis_label_text_font_size = xlabel_fontsize colorbar_fig.xaxis.major_label_text_font_size = xlabel_fontsize colorbar_fig.xaxis[0].formatter = PrintfTickFormatter(format="%5.2f") colorbar_fig.title.text_font_size = xlabel_fontsize colorbar_fig.title.align = 'center' colorbar_fig.title.text_font_style = 'normal' # ============================== profile_xrange = Range1d(start=style_parameter['profile_plot_xmin'], end=style_parameter['profile_plot_xmax']) profile_yrange = Range1d(start=style_parameter['profile_plot_ymax'], end=style_parameter['profile_plot_ymin']) profile_fig = Figure(plot_width=style_parameter['profile_plot_width'], plot_height=style_parameter['profile_plot_height'],\ x_range=profile_xrange, y_range=profile_yrange, tools=style_parameter['profile_tools'],\ title=style_parameter['profile_title']) profile_fig.line('vs','depth',source=selected_profile_data_bokeh, line_width=2, line_color='black') # ------------------------------ # add lat, lon profile_fig.rect([style_parameter['profile_label_box_x']], [style_parameter['profile_label_box_y']],\ width=style_parameter['profile_label_box_width'], height=style_parameter['profile_label_box_height'],\ width_units='screen', height_units='screen', color='#FFFFFF', line_width=1., line_color='black',\ level='underlay') profile_fig.text('x','y','lat_label', source=selected_profile_lat_label_bokeh) profile_fig.text('x','y','lon_label', source=selected_profile_lon_label_bokeh) # ------------------------------ # change style profile_fig.xaxis.axis_label = style_parameter['profile_xlabel'] profile_fig.xaxis.axis_label_text_font_style = 'normal' profile_fig.xaxis.axis_label_text_font_size = xlabel_fontsize profile_fig.xaxis.major_label_text_font_size = xlabel_fontsize profile_fig.yaxis.axis_label = style_parameter['profile_ylabel'] profile_fig.yaxis.axis_label_text_font_style = 'normal' profile_fig.yaxis.axis_label_text_font_size = xlabel_fontsize profile_fig.yaxis.major_label_text_font_size = xlabel_fontsize profile_fig.xgrid.grid_line_dash = [4, 2] profile_fig.ygrid.grid_line_dash = [4, 2] profile_fig.title.text_font_size = style_parameter['title_font_size'] profile_fig.title.align = 'center' profile_fig.title.text_font_style = 'normal' profile_fig.toolbar_location = 'above' profile_fig.toolbar_sticky = False profile_fig.toolbar.logo = None # ============================== profile_slider_callback = CustomJS(args=dict(selected_dot_on_map_bokeh=selected_dot_on_map_bokeh,\ grid_data_bokeh=grid_data_bokeh, \ profile_data_all_bokeh=profile_data_all_bokeh, \ selected_profile_data_bokeh=selected_profile_data_bokeh,\ selected_profile_lat_label_bokeh=selected_profile_lat_label_bokeh,\ selected_profile_lon_label_bokeh=selected_profile_lon_label_bokeh, \ all_profile_lat_label_bokeh=all_profile_lat_label_bokeh, \ all_profile_lon_label_bokeh=all_profile_lon_label_bokeh), code=""" var p_index = Math.round(cb_obj.value) var grid_data = grid_data_bokeh.data selected_dot_on_map_bokeh.data['lat'] = [grid_data['lat'][p_index]] selected_dot_on_map_bokeh.data['lon'] = [grid_data['lon'][p_index]] selected_dot_on_map_bokeh.data['index'] = [p_index] selected_dot_on_map_bokeh.change.emit() var profile_data_all = profile_data_all_bokeh.data selected_profile_data_bokeh.data['vs'] = profile_data_all['profile_vs_all'][p_index] selected_profile_data_bokeh.data['depth'] = profile_data_all['profile_depth_all'][p_index] selected_profile_data_bokeh.change.emit() var all_profile_lat_label = all_profile_lat_label_bokeh.data['profile_lat_label_list'] var all_profile_lon_label = all_profile_lon_label_bokeh.data['profile_lon_label_list'] selected_profile_lat_label_bokeh.data['lat_label'] = [all_profile_lat_label[p_index]] selected_profile_lon_label_bokeh.data['lon_label'] = [all_profile_lon_label[p_index]] selected_profile_lat_label_bokeh.change.emit() selected_profile_lon_label_bokeh.change.emit() """) profile_slider = Slider(start=0, end=nprofile-1, value=style_parameter['profile_default_index'], \ step=1, title=style_parameter['profile_slider_title'], \ width=style_parameter['profile_plot_width'], height=50,\ callback=profile_slider_callback) profile_slider_callback.args['profile_index'] = profile_slider # ============================== simple_text_button_callback = CustomJS(args=dict(button_data_all_bokeh=button_data_all_bokeh,\ selected_dot_on_map_bokeh=selected_dot_on_map_bokeh), \ code=""" var index = selected_dot_on_map_bokeh.data['index'] var button_data_vs = button_data_all_bokeh.data['button_data_all_vs'][index] var button_data_vp = button_data_all_bokeh.data['button_data_all_vp'][index] var button_data_rho = button_data_all_bokeh.data['button_data_all_rho'][index] var button_data_top = button_data_all_bokeh.data['button_data_all_top'][index] var csvContent = "data:text;charset=utf-8," var i = 0 var temp = csvContent temp += "# Layer Top (km) Vs(km/s) Vp(km/s) Rho(g/cm^3) \\n" while(button_data_vp[i]) { temp+=button_data_top[i].toPrecision(6) + " " + button_data_vs[i].toPrecision(4) + " " + \ button_data_vp[i].toPrecision(4) + " " + button_data_rho[i].toPrecision(4) + "\\n" i = i + 1 } var encodedUri = encodeURI(temp) link = document.createElement('a'); link.setAttribute('href', encodedUri); link.setAttribute('download', 'vel_model.txt'); link.click(); """) simple_text_button = Button(label=style_parameter['simple_text_button_label'], button_type='default', width=style_parameter['button_width'],\ callback=simple_text_button_callback) # ------------------------------ model96_button_callback = CustomJS(args=dict(button_data_all_bokeh=button_data_all_bokeh,\ selected_dot_on_map_bokeh=selected_dot_on_map_bokeh), \ code=""" var index = selected_dot_on_map_bokeh.data['index'] var lat = selected_dot_on_map_bokeh.data['lat'] var lon = selected_dot_on_map_bokeh.data['lon'] var button_data_vs = button_data_all_bokeh.data['button_data_all_vs'][index] var button_data_vp = button_data_all_bokeh.data['button_data_all_vp'][index] var button_data_rho = button_data_all_bokeh.data['button_data_all_rho'][index] var button_data_top = button_data_all_bokeh.data['button_data_all_top'][index] var csvContent = "data:text;charset=utf-8," var i = 0 var temp = csvContent temp += "MODEL." + index + " \\n" temp += "ShearVelocityModel Lat: "+ lat +" Lon: " + lon + "\\n" temp += "ISOTROPIC \\n" temp += "KGS \\n" temp += "SPHERICAL EARTH \\n" temp += "1-D \\n" temp += "CONSTANT VELOCITY \\n" temp += "LINE08 \\n" temp += "LINE09 \\n" temp += "LINE10 \\n" temp += "LINE11 \\n" temp += " H(KM) VP(KM/S) VS(KM/S) RHO(GM/CC) QP QS ETAP ETAS FREFP FREFS \\n" while(button_data_vp[i+1]) { var thickness = button_data_top[i+1] - button_data_top[i] temp+=" " +thickness.toPrecision(6) + " " + button_data_vp[i].toPrecision(4) + " " + button_data_vs[i].toPrecision(4) \ + " " + button_data_rho[i].toPrecision(4) + " 0.00 0.00 0.00 0.00 1.00 1.00" + "\\n" i = i + 1 } var encodedUri = encodeURI(temp) link = document.createElement('a'); link.setAttribute('href', encodedUri); link.setAttribute('download', 'vel_model96.txt'); link.click(); """) model96_button = Button(label=style_parameter['model96_button_label'], button_type='default', width=style_parameter['button_width'],\ callback=model96_button_callback) # ============================== # annotating text annotating_fig01 = Div(text=style_parameter['annotating_html01'], \ width=style_parameter['annotation_plot_width'], height=style_parameter['annotation_plot_height']) annotating_fig02 = Div(text=style_parameter['annotating_html02'],\ width=style_parameter['annotation_plot_width'], height=style_parameter['annotation_plot_height']) # ============================== output_file(filename,title=style_parameter['html_title'], mode=style_parameter['library_source']) left_column = Column(depth_slider, map_view, colorbar_fig, annotating_fig01, width=style_parameter['left_column_width']) button_pannel = Row(simple_text_button, model96_button) right_column = Column(profile_slider, profile_fig, button_pannel, annotating_fig02, width=style_parameter['right_column_width']) layout = Row(left_column, right_column) save(layout)