def show_num(ids, samplefolder=None,useQT=False,avg_sub='',do_plots=True,savepng=True, fig_size=[6,4],clim=None,dataname=None,xlim=None,ylim=None,**kwargs): """ Show and return plot and data. Args: ids (number, list): id or list of ids of dataset(s) samplefolder (str): Sample folder if loading data from different sample than the initialized. useQT (boolean): If true plots with QTplot instead of matplotlib avg_sub (str: 'col' or 'row'): Subtracts average from either each collumn ('col') or each row ('row') do_plots: (boolean): if false no plots are produced. dataname (str): If given only plots dataset with that name savepng (boolean): If true saves matplotlib figure as png fig_size [6,4]: Figure size in inches clim [cmin,cmax]: Set min and max of colorbar to cmin and cmax respectrively xlim [xmin,xmax]: Set limits on x axis ylim [ymin,ymax]: set limits on y axis **kwargs: Are passed to plot function Returns: data, plots : returns the plots and the datasets """ if not isinstance(ids, collections.Iterable): ids = (ids,) data_list = [] keys_list = [] # Define samplefolder if samplefolder==None: check_experiment_is_initialized() samplefolder = qc.DataSet.location_provider.fmt.format(counter='') # Load all datasets into list for id in ids: path = samplefolder + '{0:03d}'.format(id) data = qc.load_data(path) data_list.append(data) # find datanames to be plotted if do_plots: if useQT and len(ids) is not 1: raise ValueError('qcodes.QtPlot does not support multigraph plotting. Set useQT=False to plot multiple datasets.') if dataname is not None: if dataname not in [key for key in data.arrays.keys() if "_set" not in key]: raise RuntimeError('Dataname not in dataset. Input dataname was: \'{}\'', \ 'while dataname(s) in dataset are: {}.'.format(dataname,', '.join(data.arrays.keys()))) keys = [dataname] else: keys = [key for key in data.arrays.keys() if "_set" not in key] keys_list.append(keys) if do_plots: unique_keys = list(set([item for sublist in keys_list for item in sublist])) plots = [] num = '' l = len(unique_keys) for j, key in enumerate(unique_keys): array_list = [] xlims = [[],[]] ylims = [[],[]] clims = [[],[]] # Find datasets containing data with dataname == key for data, keys in zip(data_list,keys_list): if key in keys: arrays = getattr(data, key) if avg_sub == 'row': for i in range(np.shape(arrays)[0]): arrays[i,:] -= np.nanmean(arrays[i,:]) if avg_sub == 'col': for i in range(np.shape(arrays)[1]): arrays[:,i] -= np.nanmean(arrays[:,i]) array_list.append(arrays) # Find axis limits for dataset if len(arrays.set_arrays)==2: xlims[0].append(np.nanmin(arrays.set_arrays[1])) xlims[1].append(np.nanmax(arrays.set_arrays[1])) ylims[0].append(np.nanmin(arrays.set_arrays[0])) ylims[1].append(np.nanmax(arrays.set_arrays[0])) clims[0].append(np.nanmin(arrays.ndarray)) clims[1].append(np.nanmax(arrays.ndarray)) else: xlims[0].append(np.nanmin(arrays.set_arrays[0])) xlims[1].append(np.nanmax(arrays.set_arrays[0])) ylims[0].append(np.nanmin(arrays.ndarray)) ylims[1].append(np.nanmax(arrays.ndarray)) if useQT: plot = QtPlot(array_list[0], fig_x_position=CURRENT_EXPERIMENT['plot_x_position'], **kwargs) title = "{} #{}".format(CURRENT_EXPERIMENT["sample_name"], '{}'.format(ids[0])) plot.subplots[0].setTitle(title) plot.subplots[0].showGrid(True, True) if savepng: print('Save plot only working for matplotlib figure.', \ 'Set useQT=False to save png.') else: plot = MatPlot(array_list, **kwargs) plot.rescale_axis() plot.fig.tight_layout(pad=3) plot.fig.set_size_inches(fig_size) # Set axis limits if xlim is None: plot[0].axes.set_xlim([np.nanmin(xlims[0]),np.nanmax(xlims[1])]) else: plot[0].axes.set_xlim(xlim) if ylim is None: plot[0].axes.set_ylim([np.nanmin(ylims[0]),np.nanmax(ylims[1])]) else: plot[0].axes.set_ylim(ylim) if len(arrays.set_arrays)==2: for i in range(len(array_list)): if clim is None: plot[0].get_children()[i].set_clim(np.nanmin(clims[0]),np.nanmax(clims[1])) else: plot[0].get_children()[i].set_clim(clim) # Set figure titles plot.fig.suptitle(samplefolder) if len(ids)<6: plot.subplots[0].set_title(', '.join(map(str,ids))) else: plot.subplots[0].set_title(' - '.join(map(str,[ids[0],ids[-1]]))) plt.draw() # Save figure if savepng: if len(ids) == 1: title_png = samplefolder+CURRENT_EXPERIMENT['png_subfolder']+sep+'{}'.format(ids[0]) else: title_png = samplefolder+CURRENT_EXPERIMENT['png_subfolder']+sep+'{}-{}'.format(ids[0],ids[-1]) if l>1: num = '{}'.format(j+1) plt.savefig(title_png+'_{}_{}.png'.format(num,avg_sub),dpi=500) plots.append(plot) else: plots = None return data_list, plots
def show_num(ids, samplefolder=None, useQT=False, avg_sub='', do_plots=True, savepng=True, fig_size=[6, 4], clim=None, dataname=None, xlim=None, ylim=None, transpose=False, auto_color_scale: Optional[bool] = None, cutoff_percentile: Optional[Union[Tuple[Number, Number], Number]] = None, **kwargs): """ Show and return plot and data. Args: ids (number, list): id or list of ids of dataset(s) samplefolder (str): Sample folder if loading data from different sample than the initialized. useQT (boolean): If true plots with QTplot instead of matplotlib avg_sub (str: 'col' or 'row'): Subtracts average from either each collumn ('col') or each row ('row') do_plots: (boolean): if false no plots are produced. dataname (str): If given only plots dataset with that name savepng (boolean): If true saves matplotlib figure as png fig_size [6,4]: Figure size in inches clim [cmin,cmax]: Set min and max of colorbar to cmin and cmax respectrively xlim [xmin,xmax]: Set limits on x axis ylim [ymin,ymax]: set limits on y axis transpose (boolean): Transpose data to be plotted (only works for 2D scans and qc.MatPlot) auto_color_scale: if True, the colorscale of heatmap plots will be automatically adjusted to disregard outliers. cutoff_percentile: percentile of data that may maximally be clipped on both sides of the distribution. If given a tuple (a,b) the percentile limits will be a and 100-b. See also the plotting tuorial notebook. **kwargs: Are passed to plot function Returns: data, plots : returns the plots and the datasets """ # default values if auto_color_scale is None: auto_color_scale = qcodes.config.plotting.auto_color_scale.enabled if cutoff_percentile is None: cutoff_percentile = cast( Tuple[Number, Number], tuple(qcodes.config.plotting.auto_color_scale.cutoff_percentile)) if not isinstance(ids, collections.Iterable): ids = (ids, ) data_list = [] keys_list = [] # Define samplefolder if samplefolder == None: check_experiment_is_initialized() samplefolder = qc.DataSet.location_provider.fmt.format(counter='') # Load all datasets into list for id in ids: path = samplefolder + '{0:03d}'.format(id) data = qc.load_data(path) data_list.append(data) # find datanames to be plotted if do_plots: if useQT and len(ids) is not 1: raise ValueError( 'qcodes.QtPlot does not support multigraph plotting. Set useQT=False to plot multiple datasets.' ) if dataname is not None: if dataname not in [ key for key in data.arrays.keys() if "_set" not in key ]: raise RuntimeError('Dataname not in dataset. Input dataname was: \'{}\''.format(dataname), \ 'while dataname(s) in dataset are: \'{}\'.'.format('\', \''.join(data.arrays.keys()))) keys = [dataname] else: keys = [key for key in data.arrays.keys() if "_set" not in key] keys_list.append(keys) if do_plots: unique_keys = list( set([item for sublist in keys_list for item in sublist])) plots = [] num = '' l = len(unique_keys) for j, key in enumerate(unique_keys): array_list = [] xlims = [[], []] ylims = [[], []] clims = [[], []] # Find datasets containing data with dataname == key for data, keys in zip(data_list, keys_list): if key in keys: arrays = getattr(data, key) if transpose and len(arrays.set_arrays) == 2: if useQT: raise AttributeError( 'Transpose only works for qc.MatPlot.') if dataname is None and l != 1: raise ValueError( 'Dataname has to be provided to plot data transposed for dataset with more ' 'than 1 measurement. Datanames in dataset are: \'{}\'.' .format('\', \''.join(unique_keys))) arrays.ndarray = arrays.ndarray.T set0_temp = arrays.set_arrays[0] set1_temp = arrays.set_arrays[1] set0_temp.ndarray = set0_temp.ndarray.T set1_temp.ndarray = set1_temp.ndarray.T arrays.set_arrays = ( set1_temp, set0_temp, ) if avg_sub == 'row': for i in range(np.shape(arrays.ndarray)[0]): arrays.ndarray[i, :] -= np.nanmean( arrays.ndarray[i, :]) if avg_sub == 'col': for i in range(np.shape(arrays.ndarray)[1]): arrays.ndarray[:, i] -= np.nanmean(arrays.ndarray[:, i]) array_list.append(arrays) # Find axis limits for dataset if len(arrays.set_arrays) == 2: xlims[0].append(np.nanmin(arrays.set_arrays[1])) xlims[1].append(np.nanmax(arrays.set_arrays[1])) ylims[0].append(np.nanmin(arrays.set_arrays[0])) ylims[1].append(np.nanmax(arrays.set_arrays[0])) if auto_color_scale: vlims = auto_range_iqr(arrays.ndarray) else: vlims = (np.nanmin(arrays.ndarray), np.nanmax(arrays.ndarray)) clims[0].append(vlims[0]) clims[1].append(vlims[1]) else: xlims[0].append(np.nanmin(arrays.set_arrays[0])) xlims[1].append(np.nanmax(arrays.set_arrays[0])) ylims[0].append(np.nanmin(arrays.ndarray)) ylims[1].append(np.nanmax(arrays.ndarray)) if useQT: plot = QtPlot( array_list[0], fig_x_position=CURRENT_EXPERIMENT['plot_x_position'], **kwargs) title = "{} #{}".format(CURRENT_EXPERIMENT["sample_name"], '{}'.format(ids[0])) plot.subplots[0].setTitle(title) plot.subplots[0].showGrid(True, True) if savepng: print('Save plot only working for matplotlib figure.', \ 'Set useQT=False to save png.') else: plot = MatPlot(array_list, **kwargs) plot.rescale_axis() plot.fig.tight_layout(pad=3) plot.fig.set_size_inches(fig_size) # Set axis limits if xlim is None: plot[0].axes.set_xlim( [np.nanmin(xlims[0]), np.nanmax(xlims[1])]) else: plot[0].axes.set_xlim(xlim) if ylim is None: plot[0].axes.set_ylim( [np.nanmin(ylims[0]), np.nanmax(ylims[1])]) else: plot[0].axes.set_ylim(ylim) if len(arrays.set_arrays) == 2: total_clim = [None, None] for i in range(len(array_list)): # TODO(DV): get colorbar from plot children (should be ax.qcodes_colorbar) if clim is None: internal_clim = np.nanmin(clims[0]), np.nanmax( clims[1]) else: internal_clim = clim if total_clim[0] is None or internal_clim[ 0] < total_clim[0]: total_clim[0] = internal_clim[0] if total_clim[1] is None or internal_clim[ 1] > total_clim[1]: total_clim[1] = internal_clim[1] colorbar = plot[0].qcodes_colorbar apply_color_scale_limits(colorbar, new_lim=tuple(total_clim)) # Set figure titles plot.fig.suptitle(samplefolder) if len(ids) < 6: plot.subplots[0].set_title(', '.join(map(str, ids))) else: plot.subplots[0].set_title(' - '.join( map(str, [ids[0], ids[-1]]))) plt.draw() # Save figure if savepng: if len(ids) == 1: title_png = samplefolder + CURRENT_EXPERIMENT[ 'png_subfolder'] + sep + '{}'.format(ids[0]) else: title_png = samplefolder + CURRENT_EXPERIMENT[ 'png_subfolder'] + sep + '{}-{}'.format( ids[0], ids[-1]) if l > 1: num = '{}'.format(j + 1) plt.savefig(title_png + '_{}_{}.png'.format(num, avg_sub), dpi=500) plots.append(plot) else: plots = None return data_list, plots
def show_num(id, samplefolder=None, useQT=False, ave_col=False, ave_row=False, do_plots=True, savepng=False, clim=None, **kwargs): """ Show and return plot and data for id in current instrument. Args: id(number): id of instrument useQT (boolean): If true plots with QTplot instead of matplotlib ave_col (boolean): If true subtracts average from each collumn ave_row (boolean): If true subtracts average from each row do_plots: Default False: if false no plots are produced. savepng (boolean): If true saves matplotlib figure as png clim [cmin,cmax]: Set min and max of colorbar to cmin and cmax respectrively **kwargs: Are passed to plot function Returns: data, plots : returns the plot and the dataset """ str_id = '{0:03d}'.format(id) if samplefolder==None: check_experiment_is_initialized() path = qc.DataSet.location_provider.fmt.format(counter=str_id) data = qc.load_data(path) else: path = '{}{}{}'.format(samplefolder,sep,str_id) data = qc.load_data(path) keys = [key for key in data.arrays.keys() if "_set" not in key[-4:]] if do_plots: plots = [] avestr = '' num = '' l = len(keys) for j, value in enumerate(keys): arrays = getattr(data, value) if ave_row: for i in range(np.shape(arrays)[0]): arrays[i,:] -= arrays[i,:].mean() avestr = '_row' if ave_col: for i in range(np.shape(arrays)[1]): arrays[:,i] -= arrays[:,i].mean() avestr = '_col' if useQT: plot = QtPlot( getattr(data, value), fig_x_position=CURRENT_EXPERIMENT['plot_x_position'], **kwargs) title = "{} #{}".format(CURRENT_EXPERIMENT["sample_name"], str_id) plot.subplots[0].setTitle(title) plot.subplots[0].showGrid(True, True) if savepng: print('Save plot only working for matplotlib figure. Set useQT=False to save png.') else: plot = MatPlot(getattr(data, value), **kwargs) plot.rescale_axis() plot.fig.tight_layout(pad=3) if clim is not None: mesh = plot[0].get_children()[0] mesh.set_clim(clim[0],clim[1]) plt.draw() if savepng: title_list_png = plot.get_default_title().split(sep) title_list_png.insert(-1, CURRENT_EXPERIMENT['png_subfolder']) title_png = sep.join(title_list_png) if l>1: num = '_{}'.format(j+1) plt.savefig("{}{}{}.png".format(title_png,num,avestr),dpi=500) plots.append(plot) else: plots = None return data, plots