diff --git a/src/manchot_plot/manchot_plot.py b/src/manchot_plot/manchot_plot.py index ad55342..ccbcda4 100644 --- a/src/manchot_plot/manchot_plot.py +++ b/src/manchot_plot/manchot_plot.py @@ -358,11 +358,33 @@ class ManchotRC: self.figure_constrained_layout_hspace = 0.02 self.figure_constrained_layout_wspace = 0.02 - # XXX START BACK HERE - # XXX + # Images + self.image_aspect = "equal" + self.image_interpolation = "auto" + self.image_interpolation_stage = "auto" + self.image_cmap = "viridis" + self.image_lut = 256 + self.image_origin = "upper" + self.image_resample = True + self.image_composite_image = True - # FIXME: TMP + # Contour, error bar, histogram and scatter + self.contour_negative_linestyle = "dashed" + self.contour_corner_mask = True + self.contour_linewidth = self.linewidth + self.contour_algorithm = "mpl2014" + self.errorbar_capsize = self.markersize + self.hist_bins = 10 + self.scatter_marker = "o" + self.scatter_edgecolors = "face" + + # Savefig self.savefig_dpi = 300 + self.savefig_facecolor = "auto" + self.savefig_edgecolor = "auto" + self.savefig_format = "pdf" + self.savefig_bbox = "standard" + self.savefig_pad_inches = 0 self.savefig_transparent = True # Compute @@ -621,20 +643,37 @@ class ManchotRC: self.context["figure.constrained_layout.w_pad"] = self.figure_constrained_layout_w_pad self.context["figure.constrained_layout.hspace"] = self.figure_constrained_layout_hspace self.context["figure.constrained_layout.wspace"] = self.figure_constrained_layout_wspace + + # Images + self.context["image.aspect"] = self.image_aspect + self.context["image.interpolation"] = self.image_interpolation + self.context["image.interpolation_stage"] = self.image_interpolation_stage + self.context["image.cmap"] = self.image_cmap + self.context["image.lut"] = self.image_lut + self.context["image.origin"] = self.image_origin + self.context["image.resample"] = self.image_resample + self.context["image.composite_image"] = self.image_composite_image + # Contour, error bar, histogram and scatter + self.context["contour.negative_linestyle"] = self.contour_negative_linestyle + self.context["contour.corner_mask"] = self.contour_corner_mask + self.context["contour.linewidth"] = self.contour_linewidth + self.context["contour.algorithm"] = self.contour_algorithm + self.context["errorbar.capsize"] = self.errorbar_capsize + self.context["hist.bins"] = self.hist_bins + self.context["scatter.marker"] = self.scatter_marker + self.context["scatter.edgecolors"] = self.scatter_edgecolors - - - - - # FIXME: TMP + # Savefig self.context["savefig.dpi"] = self.savefig_dpi + self.context["savefig.facecolor"] = self.savefig_facecolor + self.context["savefig.edgecolor"] = self.savefig_edgecolor + self.context["savefig.format"] = self.savefig_format + self.context["savefig.bbox"] = self.savefig_bbox + self.context["savefig.pad_inches"] = self.savefig_pad_inches self.context["savefig.transparent"] = self.savefig_transparent - return None - - from mpl_toolkits.mplot3d import axes3d if __name__ == "__main__": diff --git a/ç b/ç new file mode 100644 index 0000000..6275c53 --- /dev/null +++ b/ç @@ -0,0 +1,730 @@ +#!/usr/bin/env python +#[TLP:CLEAR] UNLIMITED DISTRIBUTION +""" +manchot_plot.py + +@ Author: Moussouni, Yaël (PhD student; yael.moussouni@astro.unistra.fr) +@ Institution: Université de Strasbourg, CNRS, Observatoire astronomique + de Strasbourg, UMR 7550, F-67000 Strasbourg, France +@ Date: 2025-11-21 + +Licence: +Python Matplotlib Style +Copyright (C) 2026 Yaël Moussouni (yael.moussouni@astro.unistra.fr) + +manchot_plot.py +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. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see www.gnu.org/licenses/. +""" +import os + +import matplotlib as mpl +import numpy as np +import colours as c + +import matplotlib.pyplot as plt + +from cycler import cycler + +cm = 0.3937 # in/cm + +class ManchotRC: + def __init__(self): + self.context = {} + + # Paper + self.paper = (21*cm, 29.7*cm) + self.margin_left = 3*cm + self.margin_right = 3*cm + self.margin_cols = 0*cm + self.n_cols = 1 + self.aspect = 3/2 + + self.page_linewidth = (self.paper[0] - self.margin_left - self.margin_right) + self.page_textwidth = self.page_linewidth/self.n_cols - self.margin_cols*(self.n_cols - 1) + # Global parameters + self.linewidth = 2 + self.markersize = 3 + self.pad = 3.5 + self.joinstyle = "round" + + + self.fig_x = self.page_textwidth + self.fig_y = self.fig_x / self.aspect + + # Colours + self.colour_fg = "#000000" + self.colour_bg = "#FFFFFF" + self.colours = [c.signal_blue, + c.signal_orange, + c.signal_green, + c.signal_red, + c.signal_violet, + c.signal_brown, + c.signal_pink, + c.signal_grey] + + self.colour_fg_rgb = np.array(mpl.colors.to_rgb(self.colour_fg)) + self.colour_bg_rgb = np.array(mpl.colors.to_rgb(self.colour_bg)) + + self.colour_mg_rgb = np.mean([self.colour_fg_rgb, self.colour_bg_rgb], + axis=0) + self.colour_mg = mpl.colors.to_hex(self.colour_mg_rgb) + + self.colour_mbg_rgb = np.mean([self.colour_mg_rgb, self.colour_bg_rgb], + axis=0) + self.colour_mbg = mpl.colors.to_hex(self.colour_mbg_rgb) + + self.colour_mfg_rgb = np.mean([self.colour_mg_rgb, self.colour_fg_rgb], + axis=0) + self.colour_mfg = mpl.colors.to_hex(self.colour_mfg_rgb) + + # 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 = self.joinstyle + self.lines_dash_capstyle = self.joinstyle + self.lines_solid_joinstyle = self.joinstyle + self.lines_solid_capstyle = self.joinstyle + self.lines_color = self.colours[0] + self.lines_markerfacecolor = "auto" + self.lines_markeredgecolor = self.lines_markerfacecolor + + # Patches + self.patch_linewidth = self.linewidth + self.patch_force_edgecolor = False + self.patch_facecolor = self.colours[0] + self.patch_edgecolor = self.colour_fg + + # Hatches + self.hatch_linewidth = self.linewidth/2 + self.hatch_color = self.colour_fg + + # 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 + + 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 = self.colours[1] + self.boxplot_meanprops_color = self.colours[2] + self.boxplot_meanprops_markerfacecolor = self.boxplot_meanprops_color + self.boxplot_meanprops_markeredgecolor = self.boxplot_meanprops_color + + # 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" + self.text_color = self.colour_fg + + # 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 = self.pad + self.axes_labelsize = "medium" + self.axes_labelweight = "normal" + self.axes_labelpad = self.pad + self.axes_axisbelow = True + self.axes_facecolor = self.colour_bg + self.axes_edgecolor = self.colour_fg + self.axes_titlecolor = self.axes_edgecolor + self.axes_labelcolor = self.axes_edgecolor + self.axes_prop_cycle = cycler(color=self.colours) + + self.axes_formatter_limits = (-5, 6) + self.axes_formatter_use_locale = False + self.axes_formatter_use_mathtext = False + self.axes_formatter_min_exponent = 0 + self.axes_formatter_useoffset = True + self.axes_formatter_offset_threshold = 4 + self.axes_spines_left = True + self.axes_spines_bottom = True + self.axes_spines_top = True + self.axes_spines_right = True + self.axes_unicode_minus = True + + self.axes_xmargin = 0.05 + self.axes_ymargin = 0.05 + self.axes_zmargin = 0.05 + self.axes_autolimit_mode = "data" + + self.polaraxes_grid = True + + self.axes3d_grid = True + self.axes3d_automargin = False + self.axes3d_xaxis_panecolor = np.concatenate([self.colour_mg_rgb, [0.05]]) + self.axes3d_yaxis_panecolor = np.concatenate([self.colour_mg_rgb, [0.10]]) + self.axes3d_zaxis_panecolor = np.concatenate([self.colour_mg_rgb, [0.15]]) + self.axes3d_mouserotationstyle = "trackball" + self.axes3d_trackballsize = 0.667 + self.axes3d_trackballborder = 0.2 + + # Axis + self.xaxis_labellocation = "center" + self.yaxis_labellocation = "center" + + # Dates + self.date_autoformatter_year = "%Y" + self.date_autoformatter_month = "%Y-%m" + self.date_autoformatter_day = "%Y-%m-%d" + self.date_autoformatter_hour = "%m-%d%H" + self.date_autoformatter_minute = "%d%H:%M" + self.date_autoformatter_second = "%H:%M:%S" + self.date_autoformatter_microsecond = "%M:%S.%f" + self.date_converter = "auto" + self.date_interval_multiples = True + + # Ticks + self.xtick_top = True + self.xtick_bottom = True + self.xtick_labeltop = False + self.xtick_labelbottom = True + self.xtick_major_size = self.linewidth*2 + self.xtick_minor_size = self.xtick_major_size/2 + self.xtick_major_width = self.linewidth/2 + self.xtick_minor_width = self.xtick_major_width + self.xtick_major_pad = self.pad + self.xtick_minor_pad = self.pad + self.xtick_color = self.colour_fg + self.xtick_labelcolor = self.xtick_color + self.xtick_labelsize = "medium" + self.xtick_direction = "in" + self.xtick_minor_visible = False + self.xtick_major_top = True + self.xtick_major_bottom = True + self.xtick_minor_top = True + self.xtick_minor_bottom = True + self.xtick_minor_ndivs = "auto" + self.xtick_alignment = "center" + + self.ytick_left = self.xtick_bottom + self.ytick_right = self.xtick_top + self.ytick_labelleft = self.xtick_labelbottom + self.ytick_labelright = self.xtick_labeltop + self.ytick_major_size = self.xtick_major_size + self.ytick_minor_size = self.xtick_minor_size + self.ytick_major_width = self.xtick_major_width + self.ytick_minor_width = self.xtick_minor_width + self.ytick_major_pad = self.xtick_major_pad + self.ytick_minor_pad = self.xtick_minor_pad + self.ytick_color = self.xtick_color + self.ytick_labelcolor = self.xtick_labelcolor + self.ytick_labelsize = self.xtick_labelsize + self.ytick_direction = self.xtick_direction + self.ytick_minor_visible = self.xtick_minor_visible + self.ytick_major_left = self.xtick_major_bottom + self.ytick_major_right = self.xtick_major_top + self.ytick_minor_left = self.xtick_minor_bottom + self.ytick_minor_right = self.xtick_minor_top + self.ytick_minor_ndivs = self.xtick_minor_ndivs + self.ytick_alignment = "center_baseline" + + # Grids + self.grid_color = self.colour_mbg + self.grid_linestyle = ":" + self.grid_linewidth = self.linewidth/2 + self.grid_alpha = 1 + + # Legend + self.legend_loc = "best" + self.legend_frameon = True + self.legend_framealpha = 0.8 + self.legend_facecolor = self.colour_bg + self.legend_edgecolor = self.colour_mbg + self.legend_fancybox = True + self.legend_shadow = False + self.legend_numpoints = 1 + self.legend_scatterpoints = 1 + self.legend_markerscale = 1.0 + self.legend_fontsize = "medium" + self.legend_labelcolor = self.colour_fg + self.legend_title_fontsize = None + + self.legend_borderpad = 0.4 + self.legend_labelspacing = 0.5 + self.legend_handlelength = 2.0 + self.legend_handleheight = 0.7 + self.legend_handletextpad = 0.8 + self.legend_borderaxespad = 0.5 + self.legend_columnspacing = 2.0 + + # Figure + self.figure_titlesize = "medium" + self.figure_titleweight = "normal" + self.figure_labelsize = "medium" + self.figure_labelweight = "normal" + + self.figure_figsize = self.fig_x, self.fig_y + self.figure_dpi = 150 + self.figure_facecolor = self.colour_bg + self.figure_edgecolor = self.colour_bg + self.figure_frameon = True + self.figure_subplot_left = 0.125 + self.figure_subplot_right = 0.9 + self.figure_subplot_bottom = 0.11 + self.figure_subplot_top = 0.88 + self.figure_subplot_wspace = 0.2 + self.figure_subplot_hspace = 0.2 + self.figure_autolayout = False + self.figure_constrained_layout_use = True + self.figure_constrained_layout_h_pad = 0.04 + self.figure_constrained_layout_w_pad = 0.04 + self.figure_constrained_layout_hspace = 0.02 + self.figure_constrained_layout_wspace = 0.02 + + # Images + self.image_aspect = "equal" + self.image_interpolation = "auto" + self.image_interpolation_stage = "auto" + self.image_cmap = "viridis" + self.image_lut = 256 + self.image_origin = "upper" + self.image_resample = True + self.image_composite_image = True + + # Contour, error bar, histogram and scatter + self.contour_negative_linestyle = "dashed" + self.contour_corner_mask = True + self.contour_linewidth = self.linewidth + self.contour_algorithm = "mpl2014" + self.errorbar_capsize = self.markersize + self.hist_bins = 10 + self.scatter_marker = "o" + self.scatter_edgecolors = "face" + + # Savefig + self.savefig_dpi = 300 + self.savefig_facecolor = "auto" + self.savefig_edgecolor = "auto" + self.savefig_format = "pdf" + self.savefig_bbox = "standard" + self.savefig_pad_inches = 0 + self.savefig_transparent = True + + # 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 + + + # 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 + + + # Axes + self.context["axes.formatter.limits"] = self.axes_formatter_limits + self.context["axes.formatter.use_locale"] = self.axes_formatter_use_locale + self.context["axes.formatter.use_mathtext"] = self.axes_formatter_use_mathtext + self.context["axes.formatter.min_exponent"] = self.axes_formatter_min_exponent + self.context["axes.formatter.useoffset"] = self.axes_formatter_useoffset + self.context["axes.formatter.offset_threshold"] = self.axes_formatter_offset_threshold + self.context["axes.spines.left"] = self.axes_spines_left + self.context["axes.spines.bottom"] = self.axes_spines_bottom + self.context["axes.spines.top"] = self.axes_spines_top + self.context["axes.spines.right"] = self.axes_spines_right + self.context["axes.unicode_minus"] = self.axes_unicode_minus + + self.context["axes.xmargin"] = self.axes_xmargin + self.context["axes.ymargin"] = self.axes_ymargin + self.context["axes.zmargin"] = self.axes_zmargin + self.context["axes.autolimit_mode"] = self.axes_autolimit_mode + + self.context["polaraxes.grid"] = self.polaraxes_grid + + self.context["axes3d.grid"] = self.axes3d_grid + self.context["axes3d.automargin"] = self.axes3d_automargin + self.context["axes3d.xaxis.panecolor"] = self.axes3d_xaxis_panecolor + self.context["axes3d.yaxis.panecolor"] = self.axes3d_yaxis_panecolor + self.context["axes3d.zaxis.panecolor"] = self.axes3d_zaxis_panecolor + self.context["axes3d.mouserotationstyle"] = self.axes3d_mouserotationstyle + self.context["axes3d.trackballsize"] = self.axes3d_trackballsize + self.context["axes3d.trackballborder"] = self.axes3d_trackballborder + + # Axis + self.context["xaxis.labellocation"] = self.xaxis_labellocation + self.context["yaxis.labellocation"] = self.yaxis_labellocation + + # Dates + self.context["date.autoformatter.year"] = self.date_autoformatter_year + self.context["date.autoformatter.month"] = self.date_autoformatter_month + self.context["date.autoformatter.day"] = self.date_autoformatter_day + self.context["date.autoformatter.hour"] = self.date_autoformatter_hour + self.context["date.autoformatter.minute"] = self.date_autoformatter_minute + self.context["date.autoformatter.second"] = self.date_autoformatter_second + self.context["date.autoformatter.microsecond"] = self.date_autoformatter_microsecond + self.context["date.converter"] = self.date_converter + self.context["date.interval_multiples"] = self.date_interval_multiples + + # Ticks + self.context["xtick.top"] = self.xtick_top + self.context["xtick.bottom"] = self.xtick_bottom + self.context["xtick.labeltop"] = self.xtick_labeltop + self.context["xtick.labelbottom"] = self.xtick_labelbottom + self.context["xtick.major.size"] = self.xtick_major_size + self.context["xtick.minor.size"] = self.xtick_minor_size + self.context["xtick.major.width"] = self.xtick_major_width + self.context["xtick.minor.width"] = self.xtick_minor_width + self.context["xtick.major.pad"] = self.xtick_major_pad + self.context["xtick.minor.pad"] = self.xtick_minor_pad + self.context["xtick.color"] = self.xtick_color + self.context["xtick.labelcolor"] = self.xtick_labelcolor + self.context["xtick.labelsize"] = self.xtick_labelsize + self.context["xtick.direction"] = self.xtick_direction + self.context["xtick.minor.visible"] = self.xtick_minor_visible + self.context["xtick.major.top"] = self.xtick_major_top + self.context["xtick.major.bottom"] = self.xtick_major_bottom + self.context["xtick.minor.top"] = self.xtick_minor_top + self.context["xtick.minor.bottom"] = self.xtick_minor_bottom + self.context["xtick.minor.ndivs"] = self.xtick_minor_ndivs + self.context["xtick.alignment"] = self.xtick_alignment + + self.context["ytick.left"] = self.ytick_left + self.context["ytick.right"] = self.ytick_right + self.context["ytick.labelleft"] = self.ytick_labelleft + self.context["ytick.labelright"] = self.ytick_labelright + self.context["ytick.major.size"] = self.ytick_major_size + self.context["ytick.minor.size"] = self.ytick_minor_size + self.context["ytick.major.width"] = self.ytick_major_width + self.context["ytick.minor.width"] = self.ytick_minor_width + self.context["ytick.major.pad"] = self.ytick_major_pad + self.context["ytick.minor.pad"] = self.ytick_minor_pad + self.context["ytick.color"] = self.ytick_color + self.context["ytick.labelcolor"] = self.ytick_labelcolor + self.context["ytick.labelsize"] = self.ytick_labelsize + self.context["ytick.direction"] = self.ytick_direction + self.context["ytick.minor.visible"] = self.ytick_minor_visible + self.context["ytick.major.left"] = self.ytick_major_left + self.context["ytick.major.right"] = self.ytick_major_right + self.context["ytick.minor.left"] = self.ytick_minor_left + self.context["ytick.minor.right"] = self.ytick_minor_right + self.context["ytick.minor.ndivs"] = self.ytick_minor_ndivs + self.context["ytick.alignment"] = self.ytick_alignment + + # Grid + self.context["grid.color"] = self.grid_color + self.context["grid.linestyle"] = self.grid_linestyle + self.context["grid.linewidth"] = self.grid_linewidth + self.context["grid.alpha"] = self.grid_alpha + + # Legend + self.context["legend.loc"] = self.legend_loc + self.context["legend.frameon"] = self.legend_frameon + self.context["legend.framealpha"] = self.legend_framealpha + self.context["legend.facecolor"] = self.legend_facecolor + self.context["legend.edgecolor"] = self.legend_edgecolor + self.context["legend.fancybox"] = self.legend_fancybox + self.context["legend.shadow"] = self.legend_shadow + self.context["legend.numpoints"] = self.legend_numpoints + self.context["legend.scatterpoints"] = self.legend_scatterpoints + self.context["legend.markerscale"] = self.legend_markerscale + self.context["legend.fontsize"] = self.legend_fontsize + self.context["legend.labelcolor"] = self.legend_labelcolor + self.context["legend.title_fontsize"] = self.legend_title_fontsize + self.context["legend.borderpad"] = self.legend_borderpad + self.context["legend.labelspacing"] = self.legend_labelspacing + self.context["legend.handlelength"] = self.legend_handlelength + self.context["legend.handleheight"] = self.legend_handleheight + self.context["legend.handletextpad"] = self.legend_handletextpad + self.context["legend.borderaxespad"] = self.legend_borderaxespad + self.context["legend.columnspacing"] = self.legend_columnspacing + + # Figure + self.context["figure.titlesize"] = self.figure_titlesize + self.context["figure.titleweight"] = self.figure_titleweight + self.context["figure.labelsize"] = self.figure_labelsize + self.context["figure.labelweight"] = self.figure_labelweight + self.context["figure.figsize"] = self.figure_figsize + self.context["figure.dpi"] = self.figure_dpi + self.context["figure.facecolor"] = self.figure_facecolor + self.context["figure.edgecolor"] = self.figure_edgecolor + self.context["figure.frameon"] = self.figure_frameon + self.context["figure.subplot.left"] = self.figure_subplot_left + self.context["figure.subplot.right"] = self.figure_subplot_right + self.context["figure.subplot.bottom"] = self.figure_subplot_bottom + self.context["figure.subplot.top"] = self.figure_subplot_top + self.context["figure.subplot.wspace"] = self.figure_subplot_wspace + self.context["figure.subplot.hspace"] = self.figure_subplot_hspace + self.context["figure.autolayout"] = self.figure_autolayout + self.context["figure.constrained_layout.use"] = self.figure_constrained_layout_use + self.context["figure.constrained_layout.h_pad"] = self.figure_constrained_layout_h_pad + self.context["figure.constrained_layout.w_pad"] = self.figure_constrained_layout_w_pad + self.context["figure.constrained_layout.hspace"] = self.figure_constrained_layout_hspace + self.context["figure.constrained_layout.wspace"] = self.figure_constrained_layout_wspace + + # Images + self.context["image.aspect"] = self.image_aspect + self.context["image.interpolation"] = self.image_interpolation + self.context["image.interpolation_stage"] = self.image_interpolation_stage + self.context["image.cmap"] = self.image_cmap + self.context["image.lut"] = self.image_lut + self.context["image.origin"] = self.image_origin + self.context["image.resample"] = self.image_resample + self.context["image.composite_image"] = self.image_composite_image + + # Contour, error bar, histogram and scatter + self.context["contour.negative_linestyle"] = self.contour_negative_linestyle + self.context["contour.corner_mask"] = self.contour_corner_mask + self.context["contour.linewidth"] = self.contour_linewidth + self.context["contour.algorithm"] = self.contour_algorithm + self.context["errorbar.capsize"] = self.errorbar_capsize + self.context["hist.bins"] = self.hist_bins + self.context["scatter.marker"] = self.scatter_marker + self.context["scatter.edgecolors"] = self.scatter_edgecolors + + # Savefig + self.context["savefig.dpi"] = self.savefig_dpi + self.context["savefig.facecolor"] = self.savefig_facecolor + self.context["savefig.edgecolor"] = self.savefig_edgecolor + self.context["savefig.format"] = self.savefig_format + self.context["savefig.bbox"] = self.savefig_bbox + self.context["savefig.pad_inches"] = self.savefig_pad_inches + self.context["savefig.transparent"] = self.savefig_transparent + return None + + + +from mpl_toolkits.mplot3d import axes3d + +if __name__ == "__main__": + rc = ManchotRC() + + with plt.style.context(rc.context): + fig, axs = plt.subplots(1, 3) + fig.suptitle("Default plot") + axs[0].plot([0,1,2,3,4], [2,1,4,3,6], label="curve 1") + axs[0].plot([0,1,2,3,4], [4,3,1,2,4], "o--", label="curve 2") + + axs[0].set_title("Lorem") + axs[0].set_xlabel("$x~\\mathrm{[cm]}$") + axs[0].set_ylabel("$y~\\mathrm{[cm]}$") + axs[0].legend() + + 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 = plt.figure() + ax = fig.add_subplot(projection="3d") + + X, Y, Z = axes3d.get_test_data(0.05) + + # Plot the 3D surface + ax.plot_surface(X, Y, Z, edgecolor='C0', lw=0.5, rstride=8, cstride=8, + alpha=0.3) + + # Plot projections of the contours for each dimension. By choosing offsets + # that match the appropriate axes limits, the projected contours will sit on + # the 'walls' of the graph. + ax.contour(X, Y, Z, zdir='z', offset=-100) + ax.contour(X, Y, Z, zdir='x', offset=-40) + ax.contour(X, Y, Z, zdir='y', offset=40) + + ax.set(xlim=(-40, 40), ylim=(-40, 40), zlim=(-100, 100), + xlabel='X', ylabel='Y', zlabel='Z') + plt.show()