def _plot_data(self): df = densiometry.calc_mean_change(self.df) df = densiometry.sort_by_activity(df, self.select_designs) if self.designs: designs = self.designs elif self.show_all_designs: designs = self.all_designs else: designs = self.select_designs data = np.vstack( [df[df.design == x].mean_change.values for x in designs]) spacers = df['spacer'].unique() num_spacers = len(spacers) spacers_per_row = int(np.ceil(num_spacers / self.rows)) for i in range(self.rows): j0 = spacers_per_row * (i + 0) j1 = spacers_per_row * (i + 1) self.ax[i].pcolor(data[:, j0:j1], cmap=self.cmap, norm=self.norm) self.ax[i].set_yticks(0.5 + np.arange(len(self.designs))) self.ax[i].set_yticklabels(self.designs) self.ax[i].set_xticks(0.5 + np.arange(spacers_per_row)) self.ax[i].set_xticklabels( spacers[j0:j1] if self.label_spacers else []) self.ax[i].axis('image')
def _plot_data(self): # For dot plots: dots = densiometry.calc_percent_change(self.df) # For bar plots: bars = densiometry.calc_mean_change(self.df) bars = densiometry.sort_by_activity(bars, self.designs) for i, design in enumerate(self.designs): x_from_spacer = {} success_count = 0 for x, row in bars[bars.design == design].reset_index().iterrows(): x_from_spacer[row.spacer] = x success_count += self._plot_bar( self.axes[i], x, row.mean_change, None, # Don't plot error bars, since we're plotting every point. self.colors[design], ) dots_i = dots.xs(design, level='design') for spacer, group in dots_i.groupby(['spacer']): self._plot_dots( self.axes[i], x_from_spacer[spacer], group.percent_change.values, self.dot_colors[design], ) # If a figure size was given, also try to take some steps to ensure # a more regular/representative size. In particular, use shorter # labels and don't label redundant axes. y_max = self.y_max[design] self.axes[i].set_ylabel( 'Δ cleavage (%)' if not self.fig_size else 'Δ (%)') self.axes[i].set_ylim((0, y_max)) self.axes[i].set_yticks([0, y_max // 2, y_max]) self.axes[i].set_xlabel('spacer' if i == 1 else '') self.axes[i].set_xlim((-3, x + 1)) self.axes[i].set_xticks(range(-2, x + 1)) self.axes[i].set_xticklabels(['on', 'off'] + [str(x) for x in range(1, x + 2)], rotation='vertical') self.axes[i].axhline( self.success_cutoff, color=ucsf.light_grey[0], linestyle='--', ) print(f'{design}: {success_count}/{x+1}')
def load_rational_designs(): df = densiometry.load_cleavage_data_from_xlsx_dir('densiometry') df = densiometry.calc_mean_change(df) df = df.apply(name_to_strategy, axis='columns') df['strategy'] = pd.Categorical(df.strategy, [e.value for e in Strategy]) df['domain'] = pd.Categorical(df.domain, [e.value for e in Domain]) df['active'] = abs(df.mean_change) > 0.15 df['sequence'] = df.apply(name_to_sequence, axis='columns') #df['aligned_sequence'] = align_sequences(df.sequence) df = discard_modified_aptamers(df) df = get_pretty_sequences(df) priority = [ 'align_group', 'strategy', 'algorithm', 'domain', 'earliest_date', 'earliest_order' ] df = df.sort_values(priority).reset_index(drop=True) df['id'] = df.index.values + 1 return df
def get_construct(x): names = { 'on': 'pos', 'off': 'neg', 'mhf 30': r'\ligrnaF{}', 'rxb 11,1': r'\ligrnaB{}', } return names[x] args = docopt.docopt(__doc__) # Parse the densiometry data. df = densiometry.load_cleavage_data_from_xlsx_dir(DATA_DIR) df = densiometry.calc_mean_change(df) # Add NaNs for the experiments that didn't work. df = df.append({'spacer': 'd9', 'design': 'on'}, ignore_index=True) # Add a column for the names I want to display. df = df[df.design.isin(DESIGN_ORDER)] df['construct'] = df.design.apply(get_construct) # Put the rows in the order I want to display them in. spacer_order = densiometry.sort_spacers_by_activity(df, ['mhf 30', 'rxb 11,1']) df['spacer'] = pd.Categorical(df.spacer, spacer_order) df['design'] = pd.Categorical(df.design, DESIGN_ORDER) df = df.sort_values(['spacer', 'design']).reset_index() n = len(df) // 2