def plot_spearman_matrix(self, omic1=OMIC.transcriptomic, omic2=OMIC.proteomic, var_names1=MARKER_ADT_GENE.values(), var_names2=MARKER_ADT_GENE.keys(), is_marker_pairs=True, title='', return_figure=False): r""" Plot correlation matrix between omic1 and omic2 """ n_var1 = self.get_n_var(omic1) n_var2 = self.get_n_var(omic2) corr = self.get_correlation(omic1, omic2) spearman = np.zeros(shape=(n_var1, n_var2), dtype=np.float64) for i1, i2, p, s in corr: spearman[i1, i2] = s return self._plot_heatmap_matrix( matrix=spearman, figname="Spearman", omic1=omic1, omic2=omic2, var_names1=var_names1, var_names2=var_names2, is_marker_pairs=is_marker_pairs, title=title, return_figure=return_figure, )
def plot_pearson_matrix(self, omic1=OMIC.transcriptomic, omic2=OMIC.proteomic, var_names1=MARKER_ADT_GENE.values(), var_names2=MARKER_ADT_GENE.keys(), is_marker_pairs=True, title='', return_figure=False): r""" Plot correlation matrix between omic1 and omic2 Arguments: omic1, omic2 : instance of OMIC. With `omic1` represent the x-axis, and `omic2` represent the y-axis. markers : a List of String (optional) a list of `omic1` variable that should be most coordinated to `omic2` """ n_var1 = self.get_n_var(omic1) n_var2 = self.get_n_var(omic2) corr = self.get_correlation(omic1, omic2) pearson = np.zeros(shape=(n_var1, n_var2), dtype=np.float64) for i1, i2, p, s in corr: pearson[i1, i2] = p return self._plot_heatmap_matrix( matrix=pearson, figname="Pearson", omic1=omic1, omic2=omic2, var_names1=var_names1, var_names2=var_names2, is_marker_pairs=is_marker_pairs, title=title, return_figure=return_figure, )
def plot_importance_matrix(self, omic1=OMIC.transcriptomic, omic2=OMIC.proteomic, var_names1=MARKER_ADT_GENE.values(), var_names2=MARKER_ADT_GENE.keys(), is_marker_pairs=True, title='', return_figure=False): r""" Showing importance heatmap matrix """ return self._plot_heatmap_matrix( matrix=self.get_importance_matrix(omic1, omic2), figname="Importance", omic1=omic1, omic2=omic2, var_names1=var_names1, var_names2=var_names2, is_marker_pairs=is_marker_pairs, title=title, return_figure=return_figure, )
def plot_mutual_information(self, omic1=OMIC.transcriptomic, omic2=OMIC.proteomic, var_names1=MARKER_ADT_GENE.values(), var_names2=MARKER_ADT_GENE.keys(), is_marker_pairs=True, title='', return_figure=False): r""" Plot estimated mutual information between each variable pair in omic1 and omic2. """ return self._plot_heatmap_matrix( matrix=self.get_mutual_information(omic1, omic2), figname="MutualInfo", omic1=omic1, omic2=omic2, var_names1=var_names1, var_names2=var_names2, is_marker_pairs=is_marker_pairs, title=title, return_figure=return_figure, )
def _plot_heatmap_matrix(self, matrix, figname, omic1=OMIC.transcriptomic, omic2=OMIC.proteomic, var_names1=MARKER_ADT_GENE.values(), var_names2=MARKER_ADT_GENE.keys(), is_marker_pairs=True, title='', return_figure=False): omic1 = OMIC.parse(omic1) omic2 = OMIC.parse(omic2) if isinstance(var_names1, string_types) and var_names1 == 'auto': var_names1 = omic1.markers if isinstance(var_names2, string_types) and var_names2 == 'auto': var_names2 = omic2.markers if var_names1 is None or var_names2 is None: is_marker_pairs = False names1 = self.get_var_names(omic1) names2 = self.get_var_names(omic2) om1_idx = {j: i for i, j in enumerate(names1)} om2_idx = {j: i for i, j in enumerate(names2)} assert matrix.shape == (len(names1), len(names2)), \ (f"Given OMIC {omic1.name}({len(names1)} variables) and " f"OMIC {omic2.name}({len(names2)} variables) " f"mistmach matrix shape {matrix.shape}") ## filter the variables if is_marker_pairs: pairs = [(v1, v2) for v1, v2 in zip(var_names1, var_names2) if v1 in om1_idx and v2 in om2_idx] var_names1 = [i for i, _ in pairs] var_names2 = [i for _, i in pairs] if var_names1 is not None: names1 = np.array([i for i in var_names1 if i in om1_idx]) matrix = matrix[[om1_idx[i] for i in names1]] if var_names2 is not None: names2 = np.array([i for i in var_names2 if i in om2_idx]) matrix = matrix[:, [om2_idx[i] for i in names2]] ## find the best diagonal match if is_marker_pairs: ids2 = list(range(len(names2))) else: ids2 = search.diagonal_linear_assignment(matrix, nan_policy=0) matrix = matrix[:, ids2] names2 = names2[ids2].tolist() names1 = names1.tolist() n1 = len(names1) n2 = len(names2) ## helper for marking the marker def _mark(ax): # row is yaxis and col is xaxis for y, row in enumerate(matrix): # sort descending order order = np.argsort(row)[::-1] x = order[0] ax.text(x + 0.02, y + 0.03, s=f"{matrix[y, x]:.2f}", horizontalalignment='center', verticalalignment='center', fontsize=32 / np.log1p(max(n1, n2)), color='magenta', alpha=0.8, weight='regular') ## plotting styles = dict(cmap="bwr", xticklabels=names2, yticklabels=names1, xlabel=omic2.name, ylabel=omic1.name, gridline=0.1, fontsize=10, cbar=True) width = min(25, matrix.shape[1] / 1.2) fig = plt.figure(figsize=(width, width * matrix.shape[0] / matrix.shape[1])) _mark( vs.plot_heatmap( matrix, **styles, ax=None, title=f"[{figname}_x:{omic2.name}_y:{omic1.name}]{title}")) with catch_warnings_ignore(UserWarning): fig.tight_layout(rect=[0.0, 0.02, 1.0, 0.98]) ## store and return if return_figure: return fig self.add_figure(f"{figname.lower()}_{omic1.name}_{omic2.name}", fig) return self