diff --git a/README.md b/README.md index b8d11a7..c6bd6cb 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ Date: 2025-11-21 **MSc2 Internship: SMACS Cluster** -Copyright (C) 2025 Yaël Moussouni (yael.moussouni@astro.unistra.fr) +Copyright (C) 2026 Yaël Moussouni (yael.moussouni@astro.unistra.fr) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. diff --git a/activate.sh b/activate.sh index 1d115f5..1cf99a5 100755 --- a/activate.sh +++ b/activate.sh @@ -7,10 +7,10 @@ # # Licence: # MSc2 Internship: SMACS Cluster -# Copyright (C) 2025 Yaël Moussouni (yael.moussouni@etu.unistra.fr) +# Copyright (C) 2026 Yaël Moussouni (yael.moussouni@etu.unistra.fr) # # activate.sh -# Copyright (C) 2025 Yaël Moussouni (yael.moussouni@etu.unistra.fr) +# Copyright (C) 2026 Yaël Moussouni (yael.moussouni@etu.unistra.fr) # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/pyproject.toml b/pyproject.toml index 60dc883..94f5eb1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -7,10 +7,10 @@ # # Licence: # Python Matplotlib Style -# Copyright (C) 2025 Yaël Moussouni (yael.moussouni@astro.unistra.fr) +# Copyright (C) 2026 Yaël Moussouni (yael.moussouni@astro.unistra.fr) # # pyproject.toml -# Copyright (C) 2025 Yaël Moussouni (yael.moussouni@astro.unistra.fr) +# Copyright (C) 2026 Yaël Moussouni (yael.moussouni@astro.unistra.fr) # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/src/manchot_plot/__init__.py b/src/manchot_plot/__init__.py index 9d9132b..d9327bc 100644 --- a/src/manchot_plot/__init__.py +++ b/src/manchot_plot/__init__.py @@ -10,10 +10,10 @@ __init__.py Licence: Python Matplotlib Style -Copyright (C) 2025 Yaël Moussouni (yael.moussouni@astro.unistra.fr) +Copyright (C) 2026 Yaël Moussouni (yael.moussouni@astro.unistra.fr) __init__.py -Copyright (C) 2025 Yaël Moussouni (yael.moussouni@astro.unistra.fr) +Copyright (C) 2026 Yaël Moussouni (yael.moussouni@astro.unistra.fr) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/src/manchot_plot/colours.py b/src/manchot_plot/colours.py index 69b01d3..c63a65e 100644 --- a/src/manchot_plot/colours.py +++ b/src/manchot_plot/colours.py @@ -11,10 +11,10 @@ manchot_plot.py Licence: Python Matplotlib Style -Copyright (C) 2025 Yaël Moussouni (yael.moussouni@astro.unistra.fr) +Copyright (C) 2026 Yaël Moussouni (yael.moussouni@astro.unistra.fr) manchot_plot.py -Copyright (C) 2025 Yaël Moussouni (yael.moussouni@astro.unistra.fr) +Copyright (C) 2026 Yaël Moussouni (yael.moussouni@astro.unistra.fr) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/src/manchot_plot/manchot_plot.py b/src/manchot_plot/manchot_plot.py index 1577d72..5cd93f7 100644 --- a/src/manchot_plot/manchot_plot.py +++ b/src/manchot_plot/manchot_plot.py @@ -10,10 +10,10 @@ manchot_plot.py Licence: Python Matplotlib Style -Copyright (C) 2025 Yaël Moussouni (yael.moussouni@astro.unistra.fr) +Copyright (C) 2026 Yaël Moussouni (yael.moussouni@astro.unistra.fr) manchot_plot.py -Copyright (C) 2025 Yaël Moussouni (yael.moussouni@astro.unistra.fr) +Copyright (C) 2026 Yaël Moussouni (yael.moussouni@astro.unistra.fr) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -54,76 +54,306 @@ class ManchotRC: # Colours self.colour_fg = "#000000" + self.colour_mg = "#7F7F7F" self.colour_bg = "#FFFFFF" - self.colours = [c.bright_blue, c.bright_yellow] + self.colours = [c.bright_blue, + c.bright_orange, + c.bright_green, + c.bright_blue, + c.bright_red, + c.bright_purple, + c.bright_cyan] + self.lines_color = self.colours[0] + self.lines_markerfacecolor = "auto" + self.lines_markeredgecolor = "auto" + self.patch_facecolor = self.colours[0] + self.patch_edgecolor = self.colour_fg + self.hatch_color = self.colour_fg + self.boxplot_flierprops_color = self.colour_mg + self.boxplot_flierprops_markerfacecolor = self.colour_fg + self.boxplot_flierprops_markeredgecolor = self.colour_fg + self.boxplot_boxprops_color = self.colour_fg + self.boxplot_whiskerprops_color = self.boxplot_boxprops_color + self.boxplot_capprops_color = self.boxplot_boxprops_color + self.boxplot_medianprops_color = c.bright_orange + self.boxplot_meanprops_color = c.bright_cyan + self.boxplot_meanprops_markerfacecolor = self.boxplot_meanprops_color + self.boxplot_meanprops_markeredgecolor = self.boxplot_meanprops_color + self.text_color = self.colour_fg self.axes_facecolor = self.colour_bg self.axes_edgecolor = self.colour_fg - self.axes_labelcolor = self.colour_fg + self.axes_titlecolor = self.axes_edgecolor + self.axes_labelcolor = self.axes_edgecolor self.axes_prop_cycle = cycler(color=self.colours) + # Global parameters + self.linewidth = 2 + self.markersize = 3 + + # Lines + self.lines_linewidth = self.linewidth + self.lines_markersize = self.markersize + self.lines_linestyle = "-" + self.lines_marker = "" + self.lines_markeredgewidth = self.linewidth/2 + self.lines_dash_joinstyle = "round" + self.lines_dash_capstyle = "round" + self.lines_solid_joinstyle = "round" + self.lines_solid_capstyle = "round" + + # Patches + self.patch_linewidth = self.linewidth + self.patch_force_edgecolor = False + + # Hatches + self.hatch_linewidth = self.linewidth/2 + + # Boxplots + self.boxplot_notch = False + self.boxplot_vertical = True + self.boxplot_whiskers = 1.5 + self.boxplot_bootstrap = None + self.boxplot_patchartist = False + self.boxplot_showmeans = True + self.boxplot_showcaps = True + self.boxplot_showbox = True + self.boxplot_showfliers = True + self.boxplot_meanline = True + + self.boxplot_flierprops_marker = "x" + self.boxplot_flierprops_markeredgewidth = self.linewidth/2 + self.boxplot_flierprops_markersize = self.markersize + self.boxplot_flierprops_linestyle = "" + self.boxplot_flierprops_linewidth = self.linewidth + + self.boxplot_boxprops_linewidth = self.linewidth + self.boxplot_boxprops_linestyle = "-" + + self.boxplot_whiskerprops_linewidth = self.boxplot_boxprops_linewidth + self.boxplot_whiskerprops_linestyle = self.boxplot_boxprops_linestyle + + self.boxplot_capprops_linewidth = self.boxplot_boxprops_linewidth + self.boxplot_capprops_linestyle = self.boxplot_boxprops_linestyle + + self.boxplot_medianprops_linewidth = self.boxplot_boxprops_linewidth + self.boxplot_medianprops_linestyle = self.boxplot_boxprops_linestyle + + self.boxplot_meanprops_marker = "+" + self.boxplot_meanprops_markersize = self.markersize + self.boxplot_meanprops_linestyle = self.boxplot_boxprops_linestyle + self.boxplot_meanprops_linewidth = self.boxplot_boxprops_linewidth + + # Font + font_list = mpl.font_manager.get_font_names() + if "Latin Modern Roman" in font_list : + self.font_family = "Latin Modern Roman" + elif "Computer Modern Roman" in font_list: + self.font_family = "Computer Modern Roman" + elif "Times" in font_list: + self.font_family = "Computer Modern Roman" + else: + self.font_family = "serif" + self.font_style = "normal" + self.font_variant = "normal" + self.font_weight = "normal" + self.font_stretch = "normal" + self.font_size = 10 + + self.font_serif = ["Computer Modern Roman", + "Latin Modern Roman", + "Times", + "serif"] + self.font_sans_serif = ["Computer Modern Sans Serif", + "Latin Modern Sans", + "Helvetica", + "Arial", + "sans-serif"] + self.font_monospace = ["Computer Modern Typewriter", + "Latin Modern Mono", + "Courier", + "monospace"] + + # Text / LaTeX + self.text_usetex = False + self.latex_preamble = "" + self.mathtext_fontset = "cm" + + # Axes + self.axes_linewidth = self.linewidth/2 + self.axes_grid = True + self.axes_grid_axis = "both" + self.axes_grid_which = "major" + self.axes_titlelocation = "center" + self.axes_titley = None + self.axes_titlesize = "medium" + self.axes_titleweight = "normal" + self.axes_titlepad = 6.0 + self.axes_labelsize = "medium" + self.axes_labelweight = "normal" + self.axes_labelpad = 4.0 + self.axes_axisbelow = "line" + # Figure self.figure_dpi = 150 self.savefig_dpi = 300 self.savefig_transparent = True - # Font - self.font_family = "serif" - self.font_serif = "Latin Modern Roman" - self.font_size = 10 - # Text / LaTeX - self.text_usetex = True - self.latex_preamble = "" - # Axes - - self.axes_titlesize = "large" - self.axes_labelsize = "medium" # Compute self._compute() return None def _compute(self): + self.context = {} + # Paper margin = self.margin_left + self.margin_right \ + (self.n_cols - 1) * self.margin_cols figsize_x = self.paper[0]/self.n_cols - margin figsize_y = figsize_x / self.aspect - # Colours + + # Lines + self.context["lines.linewidth"] = self.lines_linewidth + self.context["lines.linestyle"] = self.lines_linestyle + self.context["lines.color"] = self.lines_color + self.context["lines.marker"] = self.lines_marker + self.context["lines.markerfacecolor"] = self.lines_markerfacecolor + self.context["lines.markeredgecolor"] = self.lines_markeredgecolor + self.context["lines.markeredgewidth"] = self.lines_markeredgewidth + self.context["lines.markersize"] = self.lines_markersize + self.context["lines.dash_joinstyle"] = self.lines_dash_joinstyle + self.context["lines.dash_capstyle"] = self.lines_dash_capstyle + self.context["lines.solid_joinstyle"] = self.lines_solid_joinstyle + self.context["lines.solid_capstyle"] = self.lines_solid_capstyle + + # Patches + self.context["patch.linewidth"] = self.patch_linewidth + self.context["patch.facecolor"] = self.patch_facecolor + self.context["patch.edgecolor"] = self.patch_edgecolor + self.context["patch.force_edgecolor"] = self.patch_force_edgecolor + + # Boxplot + self.context["boxplot.notch"] = self.boxplot_notch + self.context["boxplot.vertical"] = self.boxplot_vertical + self.context["boxplot.whiskers"] = self.boxplot_whiskers + self.context["boxplot.bootstrap"] = self.boxplot_bootstrap + self.context["boxplot.patchartist"] = self.boxplot_patchartist + self.context["boxplot.showmeans"] = self.boxplot_showmeans + self.context["boxplot.showcaps"] = self.boxplot_showcaps + self.context["boxplot.showbox"] = self.boxplot_showbox + self.context["boxplot.showfliers"] = self.boxplot_showfliers + self.context["boxplot.meanline"] = self.boxplot_meanline + + self.context["boxplot.flierprops.color"] = self.boxplot_flierprops_color + self.context["boxplot.flierprops.marker"] = self.boxplot_flierprops_marker + self.context["boxplot.flierprops.markerfacecolor"] = self.boxplot_flierprops_markerfacecolor + self.context["boxplot.flierprops.markeredgecolor"] = self.boxplot_flierprops_markeredgecolor + self.context["boxplot.flierprops.markeredgewidth"] = self.boxplot_flierprops_markeredgewidth + self.context["boxplot.flierprops.markersize"] = self.boxplot_flierprops_markersize + self.context["boxplot.flierprops.linestyle"] = self.boxplot_flierprops_linestyle + self.context["boxplot.flierprops.linewidth"] = self.boxplot_flierprops_linewidth + + self.context["boxplot.boxprops.color"] = self.boxplot_boxprops_color + self.context["boxplot.boxprops.linewidth"] = self.boxplot_boxprops_linewidth + self.context["boxplot.boxprops.linestyle"] = self.boxplot_boxprops_linestyle + + self.context["boxplot.whiskerprops.color"] = self.boxplot_whiskerprops_color + self.context["boxplot.whiskerprops.linewidth"] = self.boxplot_whiskerprops_linewidth + self.context["boxplot.whiskerprops.linestyle"] = self.boxplot_whiskerprops_linestyle + + + self.context["boxplot.capprops.color"] = self.boxplot_capprops_color + self.context["boxplot.capprops.linewidth"] = self.boxplot_capprops_linewidth + self.context["boxplot.capprops.linestyle"] = self.boxplot_capprops_linestyle + + self.context["boxplot.medianprops.color"] = self.boxplot_medianprops_color + self.context["boxplot.medianprops.linewidth"] = self.boxplot_medianprops_linewidth + self.context["boxplot.medianprops.linestyle"] = self.boxplot_medianprops_linestyle + + self.context["boxplot.meanprops.color"] = self.boxplot_meanprops_color + self.context["boxplot.meanprops.marker"] = self.boxplot_meanprops_marker + self.context["boxplot.meanprops.markerfacecolor"] = self.boxplot_meanprops_markerfacecolor + self.context["boxplot.meanprops.markeredgecolor"] = self.boxplot_meanprops_markeredgecolor + self.context["boxplot.meanprops.linestyle"] = self.boxplot_meanprops_linestyle + self.context["boxplot.meanprops.linewidth"] = self.boxplot_meanprops_linewidth + + # Font + self.context["font.family"] = self.font_family + self.context["font.style"] = self.font_style + self.context["font.variant"] = self.font_variant + self.context["font.weight"] = self.font_weight + self.context["font.stretch"] = self.font_stretch + self.context["font.size"] = self.font_size + self.context["font.serif"] = self.font_serif + self.context["font.sans-serif"] = self.font_sans_serif + self.context["font.monospace"] = self.font_monospace + + # Text / LaTeX + self.context["text.usetex"] = self.text_usetex + self.context["text.latex.preamble"] = self.latex_preamble + self.context["mathtext.fontset"] = self.mathtext_fontset + + # Axes self.context["axes.facecolor"] = self.axes_facecolor self.context["axes.edgecolor"] = self.axes_edgecolor + self.context["axes.linewidth"] = self.axes_linewidth + self.context["axes.grid"] = self.axes_grid + self.context["axes.grid.axis"] = self.axes_grid_axis + self.context["axes.grid.which"] = self.axes_grid_which + self.context["axes.titlelocation"] = self.axes_titlelocation + self.context["axes.titlesize"] = self.axes_titlesize + self.context["axes.titleweight"] = self.axes_titleweight + self.context["axes.titlecolor"] = self.axes_titlecolor + self.context["axes.titley"] = self.axes_titley + self.context["axes.titlepad"] = self.axes_titlepad + self.context["axes.labelsize"] = self.axes_labelsize + self.context["axes.labelpad"] = self.axes_labelpad + self.context["axes.labelweight"] = self.axes_labelweight self.context["axes.labelcolor"] = self.axes_labelcolor + self.context["axes.axisbelow"] = self.axes_axisbelow + self.context["axes.prop_cycle"] = self.axes_prop_cycle # Figure self.context["figure.figsize"] = (figsize_x, figsize_y) self.context["figure.dpi"] = self.figure_dpi + self.context["savefig.dpi"] = self.savefig_dpi self.context["savefig.transparent"] = self.savefig_transparent - - # Font - self.context["font.family"] = self.font_family - self.context["font.serif"] = self.font_serif - self.context["font.size"] = self.font_size - - # Text / LaTeX - self.context["text.usetex"] = self.text_usetex - self.context["text.latex.preamble"] = self.latex_preamble return None if __name__ == "__main__": rc = ManchotRC() - print(rc.context) - with plt.style.context(rc.context): - fig, ax = plt.subplots(1) - ax.plot([0,1,2,3,4], [2,1,4,3,6]) - ax.plot([0,1,2,3,4], [4,3,1,2,4]) - ax.set_xlabel("$x\\ \\mathrm{[cm]}$") - ax.set_ylabel("$y\\ \\mathrm{[cm]}$") + fig, axs = plt.subplots(1, 3) + axs[0].plot([0,1,2,3,4], [2,1,4,3,6]) + axs[0].plot([0,1,2,3,4], [4,3,1,2,4], "--") + + axs[0].set_title("Lorem") + axs[0].set_xlabel("$x\\ \\mathrm{[cm]}$") + axs[0].set_ylabel("$y\\ \\mathrm{[cm]}$") + + axs[1].scatter([0,1,2,3,4], [2,1,4,3,6]) + axs[1].scatter([0,1,2,3,4], [4,3,1,2,4], s=[1,2,3,4,6]) + + axs[1].set_title("Ipsum") + axs[1].set_xlabel("$x\\ \\mathrm{[cm]}$") + axs[1].set_ylabel("$y\\ \\mathrm{[cm]}$") + axs[1].text(2, 2, "sample text") + + axs[2].set_title("Dolor") + axs[2].bar([1,2], [3,2]) + axs[2].bar([3,4], [3,4], hatch="/") + axs[2].boxplot([[2,4,6,4,6,4,6,5,6,6,7,7,8,7,5], + [1,4,6,5,6,7,5,3,5,6,7], + [2,6,5,6,6,4,5,6,7,5,4,5,2]]) + axs[2].set_xlabel("Value") + axs[2].set_ylabel("Number") + fig.tight_layout() # NOTE: Temporary plt.show()