diff --git a/src/visu/figure_maker.py b/src/visu/figure_maker.py index d8bfd7c869d3b2b8dff26a5e7e8af264f37f07ff..0eb5e664b0fe9cc43b111570b73a3a622546a2de 100644 --- a/src/visu/figure_maker.py +++ b/src/visu/figure_maker.py @@ -7,7 +7,7 @@ Description: """ from pathlib import Path -from typing import List, Union, Any, Tuple +from typing import List, Union, Any, Tuple, Optional from doctest import testmod from ..bed_handler.config import TestConfig import pandas as pd @@ -16,6 +16,8 @@ import seaborn as sns import matplotlib.pyplot as plt from tqdm import tqdm from loguru import logger +import matplotlib as mpl +import matplotlib.font_manager def load_bed(bed: Path, bed_name: str) -> List[List[Union[int, str]]]: @@ -292,7 +294,7 @@ def figure_metagene(df_sum: pd.DataFrame, show_replicate: bool, border_names: List[str], nb_bin: int, environment: List[int], bed_name: str, output: Path, norm: Union[int, Path], - condition_col: str) -> None: + condition_col: str, ylim: Optional[List[float]]) -> None: """ Create a metagene figure on the region of interest. @@ -309,8 +311,15 @@ def figure_metagene(df_sum: pd.DataFrame, show_replicate: bool, the samples or a file containing the normalisations to apply to \ each samples :param condition_col: The name of the condition columns + :param ylim: The range of the y axis """ - sns.set(context='poster', style='white') + font_files = matplotlib.font_manager.findSystemFonts(fontpaths=None, + fontext='ttf') + font_list = matplotlib.font_manager.createFontList(font_files) + matplotlib.font_manager.fontManager.ttflist.extend(font_list) + + sns.set(context='poster', style='white', font_scale=1.4) + mpl.rcParams['font.family'] = 'Arial' if show_replicate: g = sns.relplot('bin', 'coverage', hue=condition_col, data=df_sum, kind='line', style='replicate', ci=None, @@ -332,8 +341,8 @@ def figure_metagene(df_sum: pd.DataFrame, show_replicate: bool, tmp_bed_name = bed_name.replace("--", ", ") title = f"Average coverage in region '{tmp_bed_name}'" if environment[0] != 0: - title += f"\nand in their surrounding regions of {environment[0]} nt" - g.fig.suptitle(title) + title += f" and in their surrounding regions of {environment[0]} nt" + g.fig.suptitle(title, fontsize=30) tmp_bed_name = bed_name.replace("--", "-") outfile_title = f"metagene_{tmp_bed_name}_{nb_bin}bin_" \ f"{environment[0]}_nt-around-{environment[1]}-bin" @@ -342,6 +351,9 @@ def figure_metagene(df_sum: pd.DataFrame, show_replicate: bool, elif isinstance(norm, Path): outfile_title += f"_file_norm" outfile_title += ".pdf" + if ylim[0] is not None: + g.ax.set_ylim(ylim[0], ylim[1]) + g.ax.tick_params(left=True, bottom=True) g.savefig(output / outfile_title) g.fig.clf() @@ -438,7 +450,8 @@ def create_figure(design: Path, bw_folder: Path, region_beds: List[Path], norm: Union[int, Path, None] = None, show_replicate: bool = True, environment: List[int] = (0, 0), border_names: List[str] = ('', ''), - output: Path = Path('.')) -> None: + output: Path = Path('.'), + ylim: List[float] = (None, None)) -> None: """ Create A metagene or a barplot figure from bigwig file on regions defined \ in the bed file provided with 'region_bed' parameter. @@ -464,14 +477,14 @@ def create_figure(design: Path, bw_folder: Path, region_beds: List[Path], the number of bin used to represent those surrounding regions. :param border_names: The name of the borders :param output: Folder where the results will be created + :param ylim: The range of y-axis """ if len(region_beds) != len(bed_names): raise IndexError("Parameter region_beds and bed_names should " "have the same length") df_exp = pd.read_csv(design, sep="\t") regions = load_beds(region_beds, bed_names) - region_bed_name = "-".join([b.name.replace('.bed', '') - for b in region_beds]) + region_bed_name = "-".join(b.name.replace('.bed', '') for b in region_beds) outfile = f'tmp_cov_table_{design.name.replace(".txt", "")}' \ f'_{region_bed_name}_{nb_bin}bin_' \ f'{environment[0]}_nt-around-{environment[1]}-bin' @@ -495,7 +508,8 @@ def create_figure(design: Path, bw_folder: Path, region_beds: List[Path], ordered_condition, bed_names) if figure_type == "metagene": figure_metagene(df_sum, show_replicate, border_names, nb_bin, - environment, region_kind, output, norm, cond_col) + environment, region_kind, output, norm, cond_col, + ylim) else: if 'location' in df_sum.columns: for cur_region in df_sum['location'].unique():