Compare commits

...

1 Commits

Author SHA1 Message Date
Moussouni, Yaël
7178c3de85 2026-01-01: Updated copyright 2026-01-01 00:52:02 +01:00
6 changed files with 271 additions and 41 deletions

View File

@@ -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.

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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()