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