| import numpy as np
|
|
|
| def check_if_matplotlib(return_mpl=False):
|
| if not return_mpl:
|
| try:
|
| import matplotlib.pyplot as plt
|
| except Exception:
|
| raise ImportError('matplotlib is not installed. Please install it with: pip install matplotlib')
|
| return plt
|
| else:
|
| try:
|
| import matplotlib as mpl
|
| except Exception:
|
| raise ImportError('matplotlib is not installed. Please install it with: pip install matplotlib')
|
| return mpl
|
|
|
|
|
| def check_if_seaborn():
|
| try:
|
| import seaborn as sns
|
| except Exception:
|
| raise ImportError('seaborn is not installed. Please install it with: pip install seaborn')
|
| return sns
|
|
|
| def set_limits(vmin, vcenter, vmax, values):
|
|
|
| if vmin is None:
|
| vmin = values.min()
|
|
|
| if vmax is None:
|
| vmax = values.max()
|
|
|
| if vcenter is None:
|
| vcenter = values.mean()
|
|
|
| if vmin >= vcenter:
|
| vmin = -vmax
|
|
|
| if vcenter >= vmax:
|
| vmax = -vmin
|
|
|
| return vmin, vcenter, vmax
|
|
|
| def plot_barplot(acts, contrast, top=25, vertical=False, cmap='coolwarm', vmin=None, vcenter=0, vmax=None,
|
| figsize=(7, 5), dpi=100, ax=None, return_fig=False):
|
| """
|
| Plot barplots showing the top absolute value activities.
|
|
|
| Parameters
|
| ----------
|
| acts : DataFrame
|
| Activities obtained from any method.
|
| contrast : str
|
| Name of the contrast (row) to plot.
|
| top : int
|
| Number of top features to plot.
|
| vertical : bool
|
| Whether to plot verticaly or horizontaly.
|
| cmap : str
|
| Colormap to use.
|
| vmin : float, None
|
| The value representing the lower limit of the color scale.
|
| vcenter : float, None
|
| The value representing the center of the color scale.
|
| vmax : float, None
|
| The value representing the upper limit of the color scale.
|
| figsize : tuple
|
| Figure size.
|
| dpi : int
|
| DPI resolution of figure.
|
| ax : Axes, None
|
| A matplotlib axes object. If None returns new figure.
|
| return_fig : bool
|
| Whether to return a Figure object or not.
|
| save : str, None
|
| Path to where to save the plot. Infer the filetype if ending on {``.pdf``, ``.png``, ``.svg``}.
|
|
|
| Returns
|
| -------
|
| fig : Figure, None
|
| If return_fig, returns Figure object.
|
| """
|
|
|
|
|
| sns = check_if_seaborn()
|
| plt = check_if_matplotlib()
|
| mpl = check_if_matplotlib(return_mpl=True)
|
|
|
|
|
| if np.any(~np.isfinite(acts)):
|
| raise ValueError('Input acts contains non finite values.')
|
|
|
|
|
| df = acts.loc[[contrast]]
|
| df.index.name = None
|
| df.columns.name = None
|
| df = (df
|
|
|
|
|
| .iloc[:, np.argsort(abs(df.values))[0]].T
|
|
|
|
|
| .tail(top).reset_index()
|
|
|
|
|
| .rename({contrast: 'acts'}, axis=1)
|
|
|
|
|
| .sort_values('acts'))
|
|
|
| if vertical:
|
| x, y = 'acts', 'index'
|
| else:
|
| x, y = 'index', 'acts'
|
|
|
|
|
| fig = None
|
| if ax is None:
|
| fig, ax = plt.subplots(1, 1, figsize=figsize, dpi=dpi)
|
| sns.barplot(data=df, x=x, y=y, ax=ax)
|
|
|
| if vertical:
|
| sizes = np.array([bar.get_width() for bar in ax.containers[0]])
|
| ax.set_xlabel('Activity')
|
| ax.set_ylabel('')
|
| else:
|
| sizes = np.array([bar.get_height() for bar in ax.containers[0]])
|
| ax.tick_params(axis='x', rotation=90)
|
| ax.set_ylabel('Activity')
|
| ax.set_xlabel('')
|
|
|
|
|
| vmin, vcenter, vmax = set_limits(vmin, vcenter, vmax, df['acts'])
|
|
|
|
|
| divnorm = mpl.colors.TwoSlopeNorm(vmin=vmin, vcenter=vcenter, vmax=vmax)
|
| cmap_f = plt.get_cmap(cmap)
|
| div_colors = cmap_f(divnorm(sizes))
|
| for bar, color in zip(ax.containers[0], div_colors):
|
| bar.set_facecolor(color)
|
|
|
|
|
| sm = plt.cm.ScalarMappable(cmap=cmap, norm=divnorm)
|
| sm.set_array([])
|
| ax.get_figure().colorbar(sm, ax=ax)
|
|
|
| if return_fig:
|
| return fig
|
|
|