From bffeb0a702f106a0d6d37cf4dbdc02097c315f74 Mon Sep 17 00:00:00 2001 From: konmenel Date: Fri, 17 Jan 2025 17:39:02 +0000 Subject: [PATCH 01/17] Possible fix for issue #13919 --- lib/matplotlib/axis.py | 16 ++++++++++++---- lib/matplotlib/mpl-data/matplotlibrc | 10 ++++++++++ lib/matplotlib/rcsetup.py | 10 ++++++++++ 3 files changed, 32 insertions(+), 4 deletions(-) diff --git a/lib/matplotlib/axis.py b/lib/matplotlib/axis.py index 7f202869eb64..4479de564b3d 100644 --- a/lib/matplotlib/axis.py +++ b/lib/matplotlib/axis.py @@ -124,16 +124,24 @@ def __init__( zorder = mlines.Line2D.zorder self._zorder = zorder - grid_color = mpl._val_or_rc(grid_color, "grid.color") - grid_linestyle = mpl._val_or_rc(grid_linestyle, "grid.linestyle") - grid_linewidth = mpl._val_or_rc(grid_linewidth, "grid.linewidth") + grid_color = (mpl._val_or_rc(grid_color, "grid.color") + if mpl.rcParams[f"grid.{major_minor}.color"] == "none" + else mpl._val_or_rc(grid_color, f"grid.{major_minor}.color")) + grid_linestyle = (mpl._val_or_rc(grid_linestyle, "grid.linestyle") + if mpl.rcParams[f"grid.{major_minor}.linestyle"] == "none" + else mpl._val_or_rc(grid_linestyle, f"grid.{major_minor}.linestyle")) + grid_linewidth = (mpl._val_or_rc(grid_linewidth, "grid.linewidth") + if mpl.rcParams[f"grid.{major_minor}.linewidth"] is None + else mpl._val_or_rc(grid_linewidth, f"grid.{major_minor}.linewidth")) if grid_alpha is None and not mcolors._has_alpha_channel(grid_color): # alpha precedence: kwarg > color alpha > rcParams['grid.alpha'] # Note: only resolve to rcParams if the color does not have alpha # otherwise `grid(color=(1, 1, 1, 0.5))` would work like # grid(color=(1, 1, 1, 0.5), alpha=rcParams['grid.alpha']) # so the that the rcParams default would override color alpha. - grid_alpha = mpl.rcParams["grid.alpha"] + grid_alpha = (mpl.rcParams["grid.alpha"] + if f"grid.{major_minor}.alpha" not in mpl.rcParams + else mpl.rcParams[f"grid.{major_minor}.alpha"]) grid_kw = {k[5:]: v for k, v in kwargs.items()} self.tick1line = mlines.Line2D( diff --git a/lib/matplotlib/mpl-data/matplotlibrc b/lib/matplotlib/mpl-data/matplotlibrc index cc498dc69a9c..199eecc03e64 100644 --- a/lib/matplotlib/mpl-data/matplotlibrc +++ b/lib/matplotlib/mpl-data/matplotlibrc @@ -535,6 +535,16 @@ #grid.linewidth: 0.8 # in points #grid.alpha: 1.0 # transparency, between 0.0 and 1.0 +#grid.major.color: None # If None defaults to grid.color +#grid.major.linestyle: None # If None defaults to grid.linestyle +#grid.major.linewidth: None # If None defaults to grid.linewidth +#grid.major.alpha: None # If None defaults to grid.alpha + +#grid.minor.color: None # If None defaults to grid.color +#grid.minor.linestyle: None # If None defaults to grid.linestyle +#grid.minor.linewidth: None # If None defaults to grid.linewidth +#grid.minor.alpha: None # If None defaults to grid.alpha + ## *************************************************************************** ## * LEGEND * diff --git a/lib/matplotlib/rcsetup.py b/lib/matplotlib/rcsetup.py index 04beb8126b74..fbbfe0abe98d 100644 --- a/lib/matplotlib/rcsetup.py +++ b/lib/matplotlib/rcsetup.py @@ -1237,6 +1237,16 @@ def _convert_validator_spec(key, conv): "grid.linewidth": validate_float, # in points "grid.alpha": validate_float, + "grid.major.color": validate_color, # grid color + "grid.major.linestyle": _validate_linestyle, # solid + "grid.major.linewidth": validate_float_or_None, # in points + "grid.major.alpha": validate_float_or_None, + + "grid.minor.color": validate_color, # grid color + "grid.minor.linestyle": _validate_linestyle, # solid + "grid.minor.linewidth": validate_float_or_None, # in points + "grid.minor.alpha": validate_float_or_None, + ## figure props # figure title "figure.titlesize": validate_fontsize, From 87726b681abd9ae378894b0fea68f52c4bcc0c2b Mon Sep 17 00:00:00 2001 From: Constantinos Menelaou Date: Sat, 18 Jan 2025 20:12:28 +0000 Subject: [PATCH 02/17] fix flake warnings --- lib/matplotlib/axis.py | 32 ++++++++++++++++++++------------ 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/lib/matplotlib/axis.py b/lib/matplotlib/axis.py index 4479de564b3d..cad209693783 100644 --- a/lib/matplotlib/axis.py +++ b/lib/matplotlib/axis.py @@ -124,24 +124,32 @@ def __init__( zorder = mlines.Line2D.zorder self._zorder = zorder - grid_color = (mpl._val_or_rc(grid_color, "grid.color") - if mpl.rcParams[f"grid.{major_minor}.color"] == "none" - else mpl._val_or_rc(grid_color, f"grid.{major_minor}.color")) - grid_linestyle = (mpl._val_or_rc(grid_linestyle, "grid.linestyle") - if mpl.rcParams[f"grid.{major_minor}.linestyle"] == "none" - else mpl._val_or_rc(grid_linestyle, f"grid.{major_minor}.linestyle")) - grid_linewidth = (mpl._val_or_rc(grid_linewidth, "grid.linewidth") - if mpl.rcParams[f"grid.{major_minor}.linewidth"] is None - else mpl._val_or_rc(grid_linewidth, f"grid.{major_minor}.linewidth")) + grid_color = ( + mpl._val_or_rc(grid_color, "grid.color") + if mpl.rcParams[f"grid.{major_minor}.color"] == "none" + else mpl._val_or_rc(grid_color, f"grid.{major_minor}.color") + ) + grid_linestyle = ( + mpl._val_or_rc(grid_linestyle, "grid.linestyle") + if mpl.rcParams[f"grid.{major_minor}.linestyle"] == "none" + else mpl._val_or_rc(grid_linestyle, f"grid.{major_minor}.linestyle") + ) + grid_linewidth = ( + mpl._val_or_rc(grid_linewidth, "grid.linewidth") + if mpl.rcParams[f"grid.{major_minor}.linewidth"] is None + else mpl._val_or_rc(grid_linewidth, f"grid.{major_minor}.linewidth") + ) if grid_alpha is None and not mcolors._has_alpha_channel(grid_color): # alpha precedence: kwarg > color alpha > rcParams['grid.alpha'] # Note: only resolve to rcParams if the color does not have alpha # otherwise `grid(color=(1, 1, 1, 0.5))` would work like # grid(color=(1, 1, 1, 0.5), alpha=rcParams['grid.alpha']) # so the that the rcParams default would override color alpha. - grid_alpha = (mpl.rcParams["grid.alpha"] - if f"grid.{major_minor}.alpha" not in mpl.rcParams - else mpl.rcParams[f"grid.{major_minor}.alpha"]) + grid_alpha = ( + mpl.rcParams["grid.alpha"] + if f"grid.{major_minor}.alpha" not in mpl.rcParams + else mpl.rcParams[f"grid.{major_minor}.alpha"] + ) grid_kw = {k[5:]: v for k, v in kwargs.items()} self.tick1line = mlines.Line2D( From e3d22aa22d40ff7b2083ca2da72a1c3e4dbd3488 Mon Sep 17 00:00:00 2001 From: konmenel Date: Mon, 27 Jan 2025 15:13:28 +0000 Subject: [PATCH 03/17] Resolve suggested changes --- lib/matplotlib/axis.py | 6 +++--- lib/matplotlib/rcsetup.py | 21 +++++++++++++++++---- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/lib/matplotlib/axis.py b/lib/matplotlib/axis.py index cad209693783..960fd9d5063c 100644 --- a/lib/matplotlib/axis.py +++ b/lib/matplotlib/axis.py @@ -126,12 +126,12 @@ def __init__( grid_color = ( mpl._val_or_rc(grid_color, "grid.color") - if mpl.rcParams[f"grid.{major_minor}.color"] == "none" + if mpl.rcParams[f"grid.{major_minor}.color"] is None else mpl._val_or_rc(grid_color, f"grid.{major_minor}.color") ) grid_linestyle = ( mpl._val_or_rc(grid_linestyle, "grid.linestyle") - if mpl.rcParams[f"grid.{major_minor}.linestyle"] == "none" + if mpl.rcParams[f"grid.{major_minor}.linestyle"] is None else mpl._val_or_rc(grid_linestyle, f"grid.{major_minor}.linestyle") ) grid_linewidth = ( @@ -147,7 +147,7 @@ def __init__( # so the that the rcParams default would override color alpha. grid_alpha = ( mpl.rcParams["grid.alpha"] - if f"grid.{major_minor}.alpha" not in mpl.rcParams + if mpl.rcParams[f"grid.{major_minor}.alpha"] is None else mpl.rcParams[f"grid.{major_minor}.alpha"] ) grid_kw = {k[5:]: v for k, v in kwargs.items()} diff --git a/lib/matplotlib/rcsetup.py b/lib/matplotlib/rcsetup.py index fbbfe0abe98d..a10f27daa965 100644 --- a/lib/matplotlib/rcsetup.py +++ b/lib/matplotlib/rcsetup.py @@ -360,6 +360,12 @@ def validate_color(s): raise ValueError(f'{s!r} does not look like a color arg') +def validate_color_or_None(s): + if s is None or cbook._str_equal(s, "None"): + return None + return validate_color(s) + + validate_colorlist = _listify_validator( validate_color, allow_stringlist=True, doc='return a list of colorspecs') @@ -514,6 +520,13 @@ def _is_iterable_not_string_like(x): raise ValueError(f"linestyle {ls!r} is not a valid on-off ink sequence.") +def _validate_linestyle_or_None(ls): + if ls is None or cbook._str_equal(ls, "None"): + return None + + return _validate_linestyle(ls) + + validate_fillstyle = ValidateInStrings( 'markers.fillstyle', ['full', 'left', 'right', 'bottom', 'top', 'none']) @@ -1237,13 +1250,13 @@ def _convert_validator_spec(key, conv): "grid.linewidth": validate_float, # in points "grid.alpha": validate_float, - "grid.major.color": validate_color, # grid color - "grid.major.linestyle": _validate_linestyle, # solid + "grid.major.color": validate_color_or_None, # grid color + "grid.major.linestyle": _validate_linestyle_or_None, # solid "grid.major.linewidth": validate_float_or_None, # in points "grid.major.alpha": validate_float_or_None, - "grid.minor.color": validate_color, # grid color - "grid.minor.linestyle": _validate_linestyle, # solid + "grid.minor.color": validate_color_or_None, # grid color + "grid.minor.linestyle": _validate_linestyle_or_None, # solid "grid.minor.linewidth": validate_float_or_None, # in points "grid.minor.alpha": validate_float_or_None, From 536b52e04dd05927b643256addb16edc31a5f5f2 Mon Sep 17 00:00:00 2001 From: konmenel Date: Mon, 27 Jan 2025 15:27:47 +0000 Subject: [PATCH 04/17] Add new validators in stub file --- lib/matplotlib/rcsetup.pyi | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/matplotlib/rcsetup.pyi b/lib/matplotlib/rcsetup.pyi index 79538511c0e4..952663ec952a 100644 --- a/lib/matplotlib/rcsetup.pyi +++ b/lib/matplotlib/rcsetup.pyi @@ -51,6 +51,7 @@ def validate_color_or_auto(s: Any) -> ColorType | Literal["auto"]: ... def _validate_color_or_edge(s: Any) -> ColorType | Literal["edge"]: ... def validate_color_for_prop_cycle(s: Any) -> ColorType: ... def validate_color(s: Any) -> ColorType: ... +def validate_color_or_None(s: Any) -> ColorType | None: ... def validate_colorlist(s: Any) -> list[ColorType]: ... def _validate_color_or_linecolor( s: Any, @@ -140,6 +141,7 @@ def validate_fillstylelist( ) -> list[Literal["full", "left", "right", "bottom", "top", "none"]]: ... def validate_markevery(s: Any) -> MarkEveryType: ... def _validate_linestyle(s: Any) -> LineStyleType: ... +def _validate_linestyle_or_None(s: Any) -> LineStyleType | None: ... def validate_markeverylist(s: Any) -> list[MarkEveryType]: ... def validate_bbox(s: Any) -> Literal["tight", "standard"] | None: ... def validate_sketch(s: Any) -> None | tuple[float, float, float]: ... From 397a2ad16c596923c461421eb95385f7463bc76a Mon Sep 17 00:00:00 2001 From: Constantinos Menelaou Date: Mon, 27 Jan 2025 22:51:30 +0000 Subject: [PATCH 05/17] make stub file arguments same as runtime --- lib/matplotlib/rcsetup.pyi | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/matplotlib/rcsetup.pyi b/lib/matplotlib/rcsetup.pyi index 952663ec952a..cf3fe1861674 100644 --- a/lib/matplotlib/rcsetup.pyi +++ b/lib/matplotlib/rcsetup.pyi @@ -140,8 +140,8 @@ def validate_fillstylelist( s: Any, ) -> list[Literal["full", "left", "right", "bottom", "top", "none"]]: ... def validate_markevery(s: Any) -> MarkEveryType: ... -def _validate_linestyle(s: Any) -> LineStyleType: ... -def _validate_linestyle_or_None(s: Any) -> LineStyleType | None: ... +def _validate_linestyle(ls: Any) -> LineStyleType: ... +def _validate_linestyle_or_None(ls: Any) -> LineStyleType | None: ... def validate_markeverylist(s: Any) -> list[MarkEveryType]: ... def validate_bbox(s: Any) -> Literal["tight", "standard"] | None: ... def validate_sketch(s: Any) -> None | tuple[float, float, float]: ... From 87339d8c7876ffb6e955779e65288565f1857060 Mon Sep 17 00:00:00 2001 From: Constantinos Menelaou Date: Tue, 28 Jan 2025 00:21:30 +0000 Subject: [PATCH 06/17] Add distinction for x and y axis in grid line options --- lib/matplotlib/axis.py | 25 +++++++++++++++++-------- lib/matplotlib/mpl-data/matplotlibrc | 20 ++++++++++++++++++++ lib/matplotlib/rcsetup.py | 20 ++++++++++++++++++++ 3 files changed, 57 insertions(+), 8 deletions(-) diff --git a/lib/matplotlib/axis.py b/lib/matplotlib/axis.py index 960fd9d5063c..f7fc991281ae 100644 --- a/lib/matplotlib/axis.py +++ b/lib/matplotlib/axis.py @@ -105,6 +105,7 @@ def __init__( name = self.__name__ major_minor = "major" if major else "minor" + xaxis_yaxis = "xaxis" if name == "xtick" else "yaxis" self._size = mpl._val_or_rc(size, f"{name}.{major_minor}.size") self._width = mpl._val_or_rc(width, f"{name}.{major_minor}.width") self._base_pad = mpl._val_or_rc(pad, f"{name}.{major_minor}.pad") @@ -125,19 +126,25 @@ def __init__( self._zorder = zorder grid_color = ( - mpl._val_or_rc(grid_color, "grid.color") - if mpl.rcParams[f"grid.{major_minor}.color"] is None + mpl._val_or_rc(grid_color, f"grid.{xaxis_yaxis}.{major_minor}.color") + if mpl.rcParams[f"grid.{xaxis_yaxis}.{major_minor}.color"] is not None else mpl._val_or_rc(grid_color, f"grid.{major_minor}.color") + if mpl.rcParams[f"grid.{major_minor}.color"] is not None + else mpl._val_or_rc(grid_color, "grid.color") ) grid_linestyle = ( - mpl._val_or_rc(grid_linestyle, "grid.linestyle") - if mpl.rcParams[f"grid.{major_minor}.linestyle"] is None + mpl._val_or_rc(grid_linestyle, f"grid.{xaxis_yaxis}.{major_minor}.linestyle") + if mpl.rcParams[f"grid.{xaxis_yaxis}.{major_minor}.linestyle"] is not None else mpl._val_or_rc(grid_linestyle, f"grid.{major_minor}.linestyle") + if mpl.rcParams[f"grid.{major_minor}.linestyle"] is not None + else mpl._val_or_rc(grid_linestyle, "grid.linestyle") ) grid_linewidth = ( - mpl._val_or_rc(grid_linewidth, "grid.linewidth") - if mpl.rcParams[f"grid.{major_minor}.linewidth"] is None + mpl._val_or_rc(grid_linewidth, f"grid.{xaxis_yaxis}.{major_minor}.linewidth") + if mpl.rcParams[f"grid.{xaxis_yaxis}.{major_minor}.linewidth"] is not None else mpl._val_or_rc(grid_linewidth, f"grid.{major_minor}.linewidth") + if mpl.rcParams[f"grid.{major_minor}.linewidth"] is not None + else mpl._val_or_rc(grid_linewidth, "grid.linewidth") ) if grid_alpha is None and not mcolors._has_alpha_channel(grid_color): # alpha precedence: kwarg > color alpha > rcParams['grid.alpha'] @@ -146,9 +153,11 @@ def __init__( # grid(color=(1, 1, 1, 0.5), alpha=rcParams['grid.alpha']) # so the that the rcParams default would override color alpha. grid_alpha = ( - mpl.rcParams["grid.alpha"] - if mpl.rcParams[f"grid.{major_minor}.alpha"] is None + mpl.rcParams[f"grid.{xaxis_yaxis}.{major_minor}.alpha"] + if mpl.rcParams[f"grid.{xaxis_yaxis}.{major_minor}.alpha"] is not None else mpl.rcParams[f"grid.{major_minor}.alpha"] + if mpl.rcParams[f"grid.{major_minor}.alpha"] is not None + else mpl.rcParams["grid.alpha"] ) grid_kw = {k[5:]: v for k, v in kwargs.items()} diff --git a/lib/matplotlib/mpl-data/matplotlibrc b/lib/matplotlib/mpl-data/matplotlibrc index 199eecc03e64..8a3a8986fac4 100644 --- a/lib/matplotlib/mpl-data/matplotlibrc +++ b/lib/matplotlib/mpl-data/matplotlibrc @@ -545,6 +545,26 @@ #grid.minor.linewidth: None # If None defaults to grid.linewidth #grid.minor.alpha: None # If None defaults to grid.alpha +#grid.xaxis.major.color: None # If None defaults to grid.color +#grid.xaxis.major.linestyle: None # If None defaults to grid.linestyle +#grid.xaxis.major.linewidth: None # If None defaults to grid.linewidth +#grid.xaxis.major.alpha: None # If None defaults to grid.alpha + +#grid.xaxis.minor.color: None # If None defaults to grid.color +#grid.xaxis.minor.linestyle: None # If None defaults to grid.linestyle +#grid.xaxis.minor.linewidth: None # If None defaults to grid.linewidth +#grid.xaxis.minor.alpha: None # If None defaults to grid.alpha + +#grid.yaxis.major.color: None # If None defaults to grid.color +#grid.yaxis.major.linestyle: None # If None defaults to grid.linestyle +#grid.yaxis.major.linewidth: None # If None defaults to grid.linewidth +#grid.yaxis.major.alpha: None # If None defaults to grid.alpha + +#grid.yaxis.minor.color: None # If None defaults to grid.color +#grid.yaxis.minor.linestyle: None # If None defaults to grid.linestyle +#grid.yaxis.minor.linewidth: None # If None defaults to grid.linewidth +#grid.yaxis.minor.alpha: None # If None defaults to grid.alpha + ## *************************************************************************** ## * LEGEND * diff --git a/lib/matplotlib/rcsetup.py b/lib/matplotlib/rcsetup.py index a10f27daa965..00290b874d12 100644 --- a/lib/matplotlib/rcsetup.py +++ b/lib/matplotlib/rcsetup.py @@ -1260,6 +1260,26 @@ def _convert_validator_spec(key, conv): "grid.minor.linewidth": validate_float_or_None, # in points "grid.minor.alpha": validate_float_or_None, + "grid.xaxis.major.color": validate_color_or_None, # grid color + "grid.xaxis.major.linestyle": _validate_linestyle_or_None, # solid + "grid.xaxis.major.linewidth": validate_float_or_None, # in points + "grid.xaxis.major.alpha": validate_float_or_None, + + "grid.xaxis.minor.color": validate_color_or_None, # grid color + "grid.xaxis.minor.linestyle": _validate_linestyle_or_None, # solid + "grid.xaxis.minor.linewidth": validate_float_or_None, # in points + "grid.xaxis.minor.alpha": validate_float_or_None, + + "grid.yaxis.major.color": validate_color_or_None, # grid color + "grid.yaxis.major.linestyle": _validate_linestyle_or_None, # solid + "grid.yaxis.major.linewidth": validate_float_or_None, # in points + "grid.yaxis.major.alpha": validate_float_or_None, + + "grid.yaxis.minor.color": validate_color_or_None, # grid color + "grid.yaxis.minor.linestyle": _validate_linestyle_or_None, # solid + "grid.yaxis.minor.linewidth": validate_float_or_None, # in points + "grid.yaxis.minor.alpha": validate_float_or_None, + ## figure props # figure title "figure.titlesize": validate_fontsize, From 09a7346f926526b3c5a394e4e85635d44e08b3c3 Mon Sep 17 00:00:00 2001 From: Constantinos Menelaou Date: Tue, 28 Jan 2025 00:25:45 +0000 Subject: [PATCH 07/17] fix flake8 --- lib/matplotlib/axis.py | 44 ++++++++++++++++++++++++++++-------------- 1 file changed, 29 insertions(+), 15 deletions(-) diff --git a/lib/matplotlib/axis.py b/lib/matplotlib/axis.py index f7fc991281ae..b2134fcd2f4d 100644 --- a/lib/matplotlib/axis.py +++ b/lib/matplotlib/axis.py @@ -126,25 +126,37 @@ def __init__( self._zorder = zorder grid_color = ( - mpl._val_or_rc(grid_color, f"grid.{xaxis_yaxis}.{major_minor}.color") + mpl._val_or_rc( + grid_color, f"grid.{xaxis_yaxis}.{major_minor}.color" + ) if mpl.rcParams[f"grid.{xaxis_yaxis}.{major_minor}.color"] is not None - else mpl._val_or_rc(grid_color, f"grid.{major_minor}.color") - if mpl.rcParams[f"grid.{major_minor}.color"] is not None - else mpl._val_or_rc(grid_color, "grid.color") + else ( + mpl._val_or_rc(grid_color, f"grid.{major_minor}.color") + if mpl.rcParams[f"grid.{major_minor}.color"] is not None + else mpl._val_or_rc(grid_color, "grid.color") + ) ) grid_linestyle = ( - mpl._val_or_rc(grid_linestyle, f"grid.{xaxis_yaxis}.{major_minor}.linestyle") + mpl._val_or_rc( + grid_linestyle, f"grid.{xaxis_yaxis}.{major_minor}.linestyle" + ) if mpl.rcParams[f"grid.{xaxis_yaxis}.{major_minor}.linestyle"] is not None - else mpl._val_or_rc(grid_linestyle, f"grid.{major_minor}.linestyle") - if mpl.rcParams[f"grid.{major_minor}.linestyle"] is not None - else mpl._val_or_rc(grid_linestyle, "grid.linestyle") + else ( + mpl._val_or_rc(grid_linestyle, f"grid.{major_minor}.linestyle") + if mpl.rcParams[f"grid.{major_minor}.linestyle"] is not None + else mpl._val_or_rc(grid_linestyle, "grid.linestyle") + ) ) grid_linewidth = ( - mpl._val_or_rc(grid_linewidth, f"grid.{xaxis_yaxis}.{major_minor}.linewidth") + mpl._val_or_rc( + grid_linewidth, f"grid.{xaxis_yaxis}.{major_minor}.linewidth" + ) if mpl.rcParams[f"grid.{xaxis_yaxis}.{major_minor}.linewidth"] is not None - else mpl._val_or_rc(grid_linewidth, f"grid.{major_minor}.linewidth") - if mpl.rcParams[f"grid.{major_minor}.linewidth"] is not None - else mpl._val_or_rc(grid_linewidth, "grid.linewidth") + else ( + mpl._val_or_rc(grid_linewidth, f"grid.{major_minor}.linewidth") + if mpl.rcParams[f"grid.{major_minor}.linewidth"] is not None + else mpl._val_or_rc(grid_linewidth, "grid.linewidth") + ) ) if grid_alpha is None and not mcolors._has_alpha_channel(grid_color): # alpha precedence: kwarg > color alpha > rcParams['grid.alpha'] @@ -155,9 +167,11 @@ def __init__( grid_alpha = ( mpl.rcParams[f"grid.{xaxis_yaxis}.{major_minor}.alpha"] if mpl.rcParams[f"grid.{xaxis_yaxis}.{major_minor}.alpha"] is not None - else mpl.rcParams[f"grid.{major_minor}.alpha"] - if mpl.rcParams[f"grid.{major_minor}.alpha"] is not None - else mpl.rcParams["grid.alpha"] + else ( + mpl.rcParams[f"grid.{major_minor}.alpha"] + if mpl.rcParams[f"grid.{major_minor}.alpha"] is not None + else mpl.rcParams["grid.alpha"] + ) ) grid_kw = {k[5:]: v for k, v in kwargs.items()} From 42e0054c72b032c8327caefddd4eb6044d7e4aa9 Mon Sep 17 00:00:00 2001 From: Constantinos Menelaou Date: Tue, 28 Jan 2025 13:45:33 +0000 Subject: [PATCH 08/17] Add What's New note --- .../new_rcparams_grid_options.rst | 80 +++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 doc/users/next_whats_new/new_rcparams_grid_options.rst diff --git a/doc/users/next_whats_new/new_rcparams_grid_options.rst b/doc/users/next_whats_new/new_rcparams_grid_options.rst new file mode 100644 index 000000000000..802244f2ba65 --- /dev/null +++ b/doc/users/next_whats_new/new_rcparams_grid_options.rst @@ -0,0 +1,80 @@ +Seperate styling options for major/minor and x/y axis grid line in rcParams +--------------------------------------------------------------------------- + +Using :rc:`grid.major.*` or :rc:`grid.minor.*` will overwrite the value in +:rc:`grid.*` for the major and minor gridlines, respectively. Similarly, +specifying :rc:`grid.xaxis.major.*` and :rc:`grid.yaxis.major.*` will overwrite +`grid.major.*` for x and y axis major gridlines respectively. + +.. plot:: + :include-source: true + :alt: Modifying the gridlines for three figures using the new options `rcParams` + + import matplotlib as mpl + import matplotlib.pyplot as plt + + # Using old values + mpl.rcdefaults() + mpl.rcParams["axes.grid"] = True + mpl.rcParams["ytick.minor.visible"] = True + mpl.rcParams["xtick.minor.visible"] = True + mpl.rcParams["axes.grid.which"] = "both" + mpl.rcParams["grid.color"] = "red" + mpl.rcParams["grid.linewidth"] = 1 + mpl.rcParams["grid.linestyle"] = "-" + mpl.rcParams["grid.alpha"] = 1 + plt.figure() + plt.plot([0, 1], [0, 1]) + plt.title("Runtime both set implicitly") + + # Overwriting major and minor settings + mpl.rcdefaults() + mpl.rcParams["axes.grid"] = True + mpl.rcParams["ytick.minor.visible"] = True + mpl.rcParams["xtick.minor.visible"] = True + mpl.rcParams["axes.grid.which"] = "both" + mpl.rcParams["grid.color"] = "red" + mpl.rcParams["grid.linewidth"] = 1 + mpl.rcParams["grid.linestyle"] = "-" + mpl.rcParams["grid.alpha"] = 1 + + mpl.rcParams["grid.major.color"] = "black" + mpl.rcParams["grid.major.linewidth"] = 2 + mpl.rcParams["grid.major.linestyle"] = ":" + mpl.rcParams["grid.minor.color"] = "gray" + mpl.rcParams["grid.minor.linewidth"] = 0.5 + mpl.rcParams["grid.minor.linestyle"] = "--" + mpl.rcParams["grid.minor.alpha"] = 0.5 + plt.figure() + plt.plot([0, 1], [0, 1]) + plt.title("Runtime explicitly set major and minor") + + # Overwriting x and y axis for majro and minor lines + mpl.rcdefaults() + mpl.rcParams["axes.grid"] = True + mpl.rcParams["ytick.minor.visible"] = True + mpl.rcParams["xtick.minor.visible"] = True + mpl.rcParams["axes.grid.which"] = "both" + mpl.rcParams["grid.color"] = "red" + mpl.rcParams["grid.linewidth"] = 1 + mpl.rcParams["grid.linestyle"] = "-" + mpl.rcParams["grid.alpha"] = 1 + + mpl.rcParams["grid.major.color"] = "black" + mpl.rcParams["grid.major.linewidth"] = 2 + mpl.rcParams["grid.major.linestyle"] = ":" + mpl.rcParams["grid.minor.color"] = "gray" + mpl.rcParams["grid.minor.linewidth"] = 0.5 + mpl.rcParams["grid.minor.linestyle"] = "--" + mpl.rcParams["grid.minor.alpha"] = 0.5 + + mpl.rcParams["grid.xaxis.major.color"] = "red" + mpl.rcParams["grid.xaxis.major.linewidth"] = 5 + mpl.rcParams["grid.xaxis.major.alpha"] = 0.2 + mpl.rcParams["grid.yaxis.minor.linestyle"] = "-" + mpl.rcParams["grid.yaxis.major.linewidth"] = 3 + plt.figure() + plt.plot([0, 1], [0, 1]) + plt.title("Runtime explicitly set some values for x and y axis") + + plt.show() From 39eef7926bd99d53365ed8b1f4566a7a0543f83a Mon Sep 17 00:00:00 2001 From: Constantinos Menelaou Date: Tue, 28 Jan 2025 13:52:38 +0000 Subject: [PATCH 09/17] Extend `_val_or_rc` to support multiply names `_val_or_rc` now accept multiple rc names and return val or the first non-None value in rcParams. Returns last rc name if all other are None. Also, simplified code in `Tick` for grid lines creatation --- lib/matplotlib/__init__.py | 13 +++++++++--- lib/matplotlib/axis.py | 43 ++++++++++++++------------------------ 2 files changed, 26 insertions(+), 30 deletions(-) diff --git a/lib/matplotlib/__init__.py b/lib/matplotlib/__init__.py index 5f964e0b34de..e1eda2d35659 100644 --- a/lib/matplotlib/__init__.py +++ b/lib/matplotlib/__init__.py @@ -1348,11 +1348,18 @@ def is_interactive(): return rcParams['interactive'] -def _val_or_rc(val, rc_name): +def _val_or_rc(val, *rc_names): """ - If *val* is None, return ``mpl.rcParams[rc_name]``, otherwise return val. + If *val* is None, the first not-None value in ``mpl.rcParams[rc_names[i]]``. + If all are None returns ``mpl.rcParams[rc_names[-1]]``. """ - return val if val is not None else rcParams[rc_name] + if val is not None: + return val + + for rc_name in rc_names[:-1]: + if rcParams[rc_name] is not None: + return rcParams[rc_name] + return rcParams[rc_names[-1]] def _init_tests(): diff --git a/lib/matplotlib/axis.py b/lib/matplotlib/axis.py index b2134fcd2f4d..9bd89e80bce3 100644 --- a/lib/matplotlib/axis.py +++ b/lib/matplotlib/axis.py @@ -127,35 +127,26 @@ def __init__( grid_color = ( mpl._val_or_rc( - grid_color, f"grid.{xaxis_yaxis}.{major_minor}.color" - ) - if mpl.rcParams[f"grid.{xaxis_yaxis}.{major_minor}.color"] is not None - else ( - mpl._val_or_rc(grid_color, f"grid.{major_minor}.color") - if mpl.rcParams[f"grid.{major_minor}.color"] is not None - else mpl._val_or_rc(grid_color, "grid.color") + grid_color, + f"grid.{xaxis_yaxis}.{major_minor}.color", + f"grid.{major_minor}.color", + "grid.color", ) ) grid_linestyle = ( mpl._val_or_rc( - grid_linestyle, f"grid.{xaxis_yaxis}.{major_minor}.linestyle" - ) - if mpl.rcParams[f"grid.{xaxis_yaxis}.{major_minor}.linestyle"] is not None - else ( - mpl._val_or_rc(grid_linestyle, f"grid.{major_minor}.linestyle") - if mpl.rcParams[f"grid.{major_minor}.linestyle"] is not None - else mpl._val_or_rc(grid_linestyle, "grid.linestyle") + grid_linestyle, + f"grid.{xaxis_yaxis}.{major_minor}.linestyle", + f"grid.{major_minor}.linestyle", + "grid.linestyle", ) ) grid_linewidth = ( mpl._val_or_rc( - grid_linewidth, f"grid.{xaxis_yaxis}.{major_minor}.linewidth" - ) - if mpl.rcParams[f"grid.{xaxis_yaxis}.{major_minor}.linewidth"] is not None - else ( - mpl._val_or_rc(grid_linewidth, f"grid.{major_minor}.linewidth") - if mpl.rcParams[f"grid.{major_minor}.linewidth"] is not None - else mpl._val_or_rc(grid_linewidth, "grid.linewidth") + grid_linewidth, + f"grid.{xaxis_yaxis}.{major_minor}.linewidth", + f"grid.{major_minor}.linewidth", + "grid.linewidth", ) ) if grid_alpha is None and not mcolors._has_alpha_channel(grid_color): @@ -165,12 +156,10 @@ def __init__( # grid(color=(1, 1, 1, 0.5), alpha=rcParams['grid.alpha']) # so the that the rcParams default would override color alpha. grid_alpha = ( - mpl.rcParams[f"grid.{xaxis_yaxis}.{major_minor}.alpha"] - if mpl.rcParams[f"grid.{xaxis_yaxis}.{major_minor}.alpha"] is not None - else ( - mpl.rcParams[f"grid.{major_minor}.alpha"] - if mpl.rcParams[f"grid.{major_minor}.alpha"] is not None - else mpl.rcParams["grid.alpha"] + mpl._val_or_rc( + mpl.rcParams[f"grid.{xaxis_yaxis}.{major_minor}.alpha"], # grid_alpha is None + f"grid.{major_minor}.alpha", + "grid.alpha", ) ) grid_kw = {k[5:]: v for k, v in kwargs.items()} From a4e6f44d12c2789379d40cd028cadee386770c02 Mon Sep 17 00:00:00 2001 From: Constantinos Menelaou Date: Tue, 28 Jan 2025 14:04:54 +0000 Subject: [PATCH 10/17] Fix linting for and _validate_linestyle_or_None to mypy allowlist --- ci/mypy-stubtest-allowlist.txt | 1 + lib/matplotlib/axis.py | 6 ++++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/ci/mypy-stubtest-allowlist.txt b/ci/mypy-stubtest-allowlist.txt index 46ec06e0a9f1..10efc9d71520 100644 --- a/ci/mypy-stubtest-allowlist.txt +++ b/ci/mypy-stubtest-allowlist.txt @@ -5,6 +5,7 @@ matplotlib\.pylab(\..*)? matplotlib\._.* matplotlib\.rcsetup\._listify_validator matplotlib\.rcsetup\._validate_linestyle +matplotlib\.rcsetup\._validate_linestyle_or_None matplotlib\.ft2font\.Glyph matplotlib\.testing\.jpl_units\..* matplotlib\.sphinxext(\..*)? diff --git a/lib/matplotlib/axis.py b/lib/matplotlib/axis.py index 9bd89e80bce3..fcd93dcf8123 100644 --- a/lib/matplotlib/axis.py +++ b/lib/matplotlib/axis.py @@ -155,9 +155,11 @@ def __init__( # otherwise `grid(color=(1, 1, 1, 0.5))` would work like # grid(color=(1, 1, 1, 0.5), alpha=rcParams['grid.alpha']) # so the that the rcParams default would override color alpha. + grid_alpha = ( - mpl._val_or_rc( - mpl.rcParams[f"grid.{xaxis_yaxis}.{major_minor}.alpha"], # grid_alpha is None + # grid_alpha is None so we can use the first key + mpl._val_or_rc( + mpl.rcParams[f"grid.{xaxis_yaxis}.{major_minor}.alpha"], f"grid.{major_minor}.alpha", "grid.alpha", ) From 9a2b2b263b6f1971f48a0fb3e76efb036320ac47 Mon Sep 17 00:00:00 2001 From: Constantinos Menelaou Date: Tue, 28 Jan 2025 22:49:14 +0000 Subject: [PATCH 11/17] Remove validate linestyle functions from stubtest allow list --- ci/mypy-stubtest-allowlist.txt | 2 -- 1 file changed, 2 deletions(-) diff --git a/ci/mypy-stubtest-allowlist.txt b/ci/mypy-stubtest-allowlist.txt index 10efc9d71520..3a39159ec7c6 100644 --- a/ci/mypy-stubtest-allowlist.txt +++ b/ci/mypy-stubtest-allowlist.txt @@ -4,8 +4,6 @@ matplotlib\.tests(\..*)? matplotlib\.pylab(\..*)? matplotlib\._.* matplotlib\.rcsetup\._listify_validator -matplotlib\.rcsetup\._validate_linestyle -matplotlib\.rcsetup\._validate_linestyle_or_None matplotlib\.ft2font\.Glyph matplotlib\.testing\.jpl_units\..* matplotlib\.sphinxext(\..*)? From c886330dad7b7eaa0fa8ddc6b9941a46769484b1 Mon Sep 17 00:00:00 2001 From: Constantinos Menelaou Date: Wed, 29 Jan 2025 00:25:44 +0000 Subject: [PATCH 12/17] Revert change to just grid.major/minor distinction in rcParams --- lib/matplotlib/axis.py | 7 +------ lib/matplotlib/mpl-data/matplotlibrc | 20 -------------------- lib/matplotlib/rcsetup.py | 20 -------------------- 3 files changed, 1 insertion(+), 46 deletions(-) diff --git a/lib/matplotlib/axis.py b/lib/matplotlib/axis.py index fcd93dcf8123..b2fcb1b9dbab 100644 --- a/lib/matplotlib/axis.py +++ b/lib/matplotlib/axis.py @@ -105,7 +105,6 @@ def __init__( name = self.__name__ major_minor = "major" if major else "minor" - xaxis_yaxis = "xaxis" if name == "xtick" else "yaxis" self._size = mpl._val_or_rc(size, f"{name}.{major_minor}.size") self._width = mpl._val_or_rc(width, f"{name}.{major_minor}.width") self._base_pad = mpl._val_or_rc(pad, f"{name}.{major_minor}.pad") @@ -128,7 +127,6 @@ def __init__( grid_color = ( mpl._val_or_rc( grid_color, - f"grid.{xaxis_yaxis}.{major_minor}.color", f"grid.{major_minor}.color", "grid.color", ) @@ -136,7 +134,6 @@ def __init__( grid_linestyle = ( mpl._val_or_rc( grid_linestyle, - f"grid.{xaxis_yaxis}.{major_minor}.linestyle", f"grid.{major_minor}.linestyle", "grid.linestyle", ) @@ -144,7 +141,6 @@ def __init__( grid_linewidth = ( mpl._val_or_rc( grid_linewidth, - f"grid.{xaxis_yaxis}.{major_minor}.linewidth", f"grid.{major_minor}.linewidth", "grid.linewidth", ) @@ -159,8 +155,7 @@ def __init__( grid_alpha = ( # grid_alpha is None so we can use the first key mpl._val_or_rc( - mpl.rcParams[f"grid.{xaxis_yaxis}.{major_minor}.alpha"], - f"grid.{major_minor}.alpha", + mpl.rcParams[f"grid.{major_minor}.alpha"], "grid.alpha", ) ) diff --git a/lib/matplotlib/mpl-data/matplotlibrc b/lib/matplotlib/mpl-data/matplotlibrc index 8a3a8986fac4..199eecc03e64 100644 --- a/lib/matplotlib/mpl-data/matplotlibrc +++ b/lib/matplotlib/mpl-data/matplotlibrc @@ -545,26 +545,6 @@ #grid.minor.linewidth: None # If None defaults to grid.linewidth #grid.minor.alpha: None # If None defaults to grid.alpha -#grid.xaxis.major.color: None # If None defaults to grid.color -#grid.xaxis.major.linestyle: None # If None defaults to grid.linestyle -#grid.xaxis.major.linewidth: None # If None defaults to grid.linewidth -#grid.xaxis.major.alpha: None # If None defaults to grid.alpha - -#grid.xaxis.minor.color: None # If None defaults to grid.color -#grid.xaxis.minor.linestyle: None # If None defaults to grid.linestyle -#grid.xaxis.minor.linewidth: None # If None defaults to grid.linewidth -#grid.xaxis.minor.alpha: None # If None defaults to grid.alpha - -#grid.yaxis.major.color: None # If None defaults to grid.color -#grid.yaxis.major.linestyle: None # If None defaults to grid.linestyle -#grid.yaxis.major.linewidth: None # If None defaults to grid.linewidth -#grid.yaxis.major.alpha: None # If None defaults to grid.alpha - -#grid.yaxis.minor.color: None # If None defaults to grid.color -#grid.yaxis.minor.linestyle: None # If None defaults to grid.linestyle -#grid.yaxis.minor.linewidth: None # If None defaults to grid.linewidth -#grid.yaxis.minor.alpha: None # If None defaults to grid.alpha - ## *************************************************************************** ## * LEGEND * diff --git a/lib/matplotlib/rcsetup.py b/lib/matplotlib/rcsetup.py index 00290b874d12..a10f27daa965 100644 --- a/lib/matplotlib/rcsetup.py +++ b/lib/matplotlib/rcsetup.py @@ -1260,26 +1260,6 @@ def _convert_validator_spec(key, conv): "grid.minor.linewidth": validate_float_or_None, # in points "grid.minor.alpha": validate_float_or_None, - "grid.xaxis.major.color": validate_color_or_None, # grid color - "grid.xaxis.major.linestyle": _validate_linestyle_or_None, # solid - "grid.xaxis.major.linewidth": validate_float_or_None, # in points - "grid.xaxis.major.alpha": validate_float_or_None, - - "grid.xaxis.minor.color": validate_color_or_None, # grid color - "grid.xaxis.minor.linestyle": _validate_linestyle_or_None, # solid - "grid.xaxis.minor.linewidth": validate_float_or_None, # in points - "grid.xaxis.minor.alpha": validate_float_or_None, - - "grid.yaxis.major.color": validate_color_or_None, # grid color - "grid.yaxis.major.linestyle": _validate_linestyle_or_None, # solid - "grid.yaxis.major.linewidth": validate_float_or_None, # in points - "grid.yaxis.major.alpha": validate_float_or_None, - - "grid.yaxis.minor.color": validate_color_or_None, # grid color - "grid.yaxis.minor.linestyle": _validate_linestyle_or_None, # solid - "grid.yaxis.minor.linewidth": validate_float_or_None, # in points - "grid.yaxis.minor.alpha": validate_float_or_None, - ## figure props # figure title "figure.titlesize": validate_fontsize, From cd3c260d6af54dd8002b2b78a2b5fa57f3cc4e63 Mon Sep 17 00:00:00 2001 From: Constantinos Menelaou Date: Wed, 29 Jan 2025 00:37:42 +0000 Subject: [PATCH 13/17] Update What's New note and reduced example --- .../new_rcparams_grid_options.rst | 85 +++++-------------- 1 file changed, 19 insertions(+), 66 deletions(-) diff --git a/doc/users/next_whats_new/new_rcparams_grid_options.rst b/doc/users/next_whats_new/new_rcparams_grid_options.rst index 802244f2ba65..238a97d961f2 100644 --- a/doc/users/next_whats_new/new_rcparams_grid_options.rst +++ b/doc/users/next_whats_new/new_rcparams_grid_options.rst @@ -1,80 +1,33 @@ -Seperate styling options for major/minor and x/y axis grid line in rcParams ---------------------------------------------------------------------------- +Seperate styling options for major/minor grid line in rcParams +-------------------------------------------------------------- Using :rc:`grid.major.*` or :rc:`grid.minor.*` will overwrite the value in -:rc:`grid.*` for the major and minor gridlines, respectively. Similarly, -specifying :rc:`grid.xaxis.major.*` and :rc:`grid.yaxis.major.*` will overwrite -`grid.major.*` for x and y axis major gridlines respectively. +:rc:`grid.*` for the major and minor gridlines, respectively. .. plot:: :include-source: true :alt: Modifying the gridlines for three figures using the new options `rcParams` import matplotlib as mpl - import matplotlib.pyplot as plt +import matplotlib.pyplot as plt - # Using old values - mpl.rcdefaults() - mpl.rcParams["axes.grid"] = True - mpl.rcParams["ytick.minor.visible"] = True - mpl.rcParams["xtick.minor.visible"] = True - mpl.rcParams["axes.grid.which"] = "both" - mpl.rcParams["grid.color"] = "red" - mpl.rcParams["grid.linewidth"] = 1 - mpl.rcParams["grid.linestyle"] = "-" - mpl.rcParams["grid.alpha"] = 1 - plt.figure() - plt.plot([0, 1], [0, 1]) - plt.title("Runtime both set implicitly") - # Overwriting major and minor settings - mpl.rcdefaults() - mpl.rcParams["axes.grid"] = True - mpl.rcParams["ytick.minor.visible"] = True - mpl.rcParams["xtick.minor.visible"] = True - mpl.rcParams["axes.grid.which"] = "both" - mpl.rcParams["grid.color"] = "red" - mpl.rcParams["grid.linewidth"] = 1 - mpl.rcParams["grid.linestyle"] = "-" - mpl.rcParams["grid.alpha"] = 1 +# Set visibility for major and minor gridlines +mpl.rcParams["axes.grid"] = True +mpl.rcParams["ytick.minor.visible"] = True +mpl.rcParams["xtick.minor.visible"] = True +mpl.rcParams["axes.grid.which"] = "both" - mpl.rcParams["grid.major.color"] = "black" - mpl.rcParams["grid.major.linewidth"] = 2 - mpl.rcParams["grid.major.linestyle"] = ":" - mpl.rcParams["grid.minor.color"] = "gray" - mpl.rcParams["grid.minor.linewidth"] = 0.5 - mpl.rcParams["grid.minor.linestyle"] = "--" - mpl.rcParams["grid.minor.alpha"] = 0.5 - plt.figure() - plt.plot([0, 1], [0, 1]) - plt.title("Runtime explicitly set major and minor") +# Using old old values to set both major and minor properties +mpl.rcParams["grid.color"] = "red" +mpl.rcParams["grid.linewidth"] = 1 - # Overwriting x and y axis for majro and minor lines - mpl.rcdefaults() - mpl.rcParams["axes.grid"] = True - mpl.rcParams["ytick.minor.visible"] = True - mpl.rcParams["xtick.minor.visible"] = True - mpl.rcParams["axes.grid.which"] = "both" - mpl.rcParams["grid.color"] = "red" - mpl.rcParams["grid.linewidth"] = 1 - mpl.rcParams["grid.linestyle"] = "-" - mpl.rcParams["grid.alpha"] = 1 +# Overwrite some values for major and minor seperately +mpl.rcParams["grid.major.color"] = "black" +mpl.rcParams["grid.major.linewidth"] = 2 +mpl.rcParams["grid.minor.linestyle"] = ":" +mpl.rcParams["grid.minor.alpha"] = 0.6 - mpl.rcParams["grid.major.color"] = "black" - mpl.rcParams["grid.major.linewidth"] = 2 - mpl.rcParams["grid.major.linestyle"] = ":" - mpl.rcParams["grid.minor.color"] = "gray" - mpl.rcParams["grid.minor.linewidth"] = 0.5 - mpl.rcParams["grid.minor.linestyle"] = "--" - mpl.rcParams["grid.minor.alpha"] = 0.5 +plt.plot([0, 1], [0, 1]) - mpl.rcParams["grid.xaxis.major.color"] = "red" - mpl.rcParams["grid.xaxis.major.linewidth"] = 5 - mpl.rcParams["grid.xaxis.major.alpha"] = 0.2 - mpl.rcParams["grid.yaxis.minor.linestyle"] = "-" - mpl.rcParams["grid.yaxis.major.linewidth"] = 3 - plt.figure() - plt.plot([0, 1], [0, 1]) - plt.title("Runtime explicitly set some values for x and y axis") - - plt.show() +plt.show() From 456034cd0496ac1ece6a7a5299acc05baa7bd60d Mon Sep 17 00:00:00 2001 From: konmenel Date: Wed, 29 Jan 2025 17:25:49 +0000 Subject: [PATCH 14/17] Add testing for `grid.major/minor.*` in rcParams --- lib/matplotlib/tests/test_axis.py | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/lib/matplotlib/tests/test_axis.py b/lib/matplotlib/tests/test_axis.py index e33656ea9c17..6f79887071ba 100644 --- a/lib/matplotlib/tests/test_axis.py +++ b/lib/matplotlib/tests/test_axis.py @@ -67,3 +67,31 @@ def test_get_tick_position_tick_params(): right=True, labelright=True, left=False, labelleft=False) assert ax.xaxis.get_ticks_position() == "top" assert ax.yaxis.get_ticks_position() == "right" + + +def test_grid_rcparams(): + """Tests that `grid.major/minor.*` overwrites `grid.*` in rcParams.""" + plt.rcParams.update({ + "axes.grid": True, "axes.grid.which": "both", + "ytick.minor.visible": True, "xtick.minor.visible": True, + }) + def_linewidth = plt.rcParams["grid.linewidth"] + def_linestyle = plt.rcParams["grid.linestyle"] + def_alpha = plt.rcParams["grid.alpha"] + + plt.rcParams.update({ + "grid.color": "gray","grid.minor.color": "red", + "grid.major.linestyle": ":", "grid.major.linewidth": 2, + "grid.minor.alpha": 0.6, + }) + _, ax = plt.subplots() + ax.plot([0, 1]) + + assert ax.xaxis.get_major_ticks()[0].gridline.get_color() == "gray" + assert ax.xaxis.get_minor_ticks()[0].gridline.get_color() == "red" + assert ax.xaxis.get_major_ticks()[0].gridline.get_linewidth() == 2 + assert ax.xaxis.get_minor_ticks()[0].gridline.get_linewidth() == def_linewidth + assert ax.xaxis.get_major_ticks()[0].gridline.get_linestyle() == ":" + assert ax.xaxis.get_minor_ticks()[0].gridline.get_linestyle() == def_linestyle + assert ax.xaxis.get_major_ticks()[0].gridline.get_alpha() == def_alpha + assert ax.xaxis.get_minor_ticks()[0].gridline.get_alpha() == 0.6 From ca5a443c0f49d8cc79ede382d468850fed2521d1 Mon Sep 17 00:00:00 2001 From: Constantinos Menelaou Date: Wed, 29 Jan 2025 22:33:57 +0000 Subject: [PATCH 15/17] fix indentation and linting --- .../new_rcparams_grid_options.rst | 32 +++++++++---------- lib/matplotlib/tests/test_axis.py | 2 +- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/doc/users/next_whats_new/new_rcparams_grid_options.rst b/doc/users/next_whats_new/new_rcparams_grid_options.rst index 238a97d961f2..3ebacfea1ad8 100644 --- a/doc/users/next_whats_new/new_rcparams_grid_options.rst +++ b/doc/users/next_whats_new/new_rcparams_grid_options.rst @@ -9,25 +9,25 @@ Using :rc:`grid.major.*` or :rc:`grid.minor.*` will overwrite the value in :alt: Modifying the gridlines for three figures using the new options `rcParams` import matplotlib as mpl -import matplotlib.pyplot as plt + import matplotlib.pyplot as plt -# Set visibility for major and minor gridlines -mpl.rcParams["axes.grid"] = True -mpl.rcParams["ytick.minor.visible"] = True -mpl.rcParams["xtick.minor.visible"] = True -mpl.rcParams["axes.grid.which"] = "both" + # Set visibility for major and minor gridlines + mpl.rcParams["axes.grid"] = True + mpl.rcParams["ytick.minor.visible"] = True + mpl.rcParams["xtick.minor.visible"] = True + mpl.rcParams["axes.grid.which"] = "both" -# Using old old values to set both major and minor properties -mpl.rcParams["grid.color"] = "red" -mpl.rcParams["grid.linewidth"] = 1 + # Using old old values to set both major and minor properties + mpl.rcParams["grid.color"] = "red" + mpl.rcParams["grid.linewidth"] = 1 -# Overwrite some values for major and minor seperately -mpl.rcParams["grid.major.color"] = "black" -mpl.rcParams["grid.major.linewidth"] = 2 -mpl.rcParams["grid.minor.linestyle"] = ":" -mpl.rcParams["grid.minor.alpha"] = 0.6 + # Overwrite some values for major and minor seperately + mpl.rcParams["grid.major.color"] = "black" + mpl.rcParams["grid.major.linewidth"] = 2 + mpl.rcParams["grid.minor.linestyle"] = ":" + mpl.rcParams["grid.minor.alpha"] = 0.6 -plt.plot([0, 1], [0, 1]) + plt.plot([0, 1], [0, 1]) -plt.show() + plt.show() diff --git a/lib/matplotlib/tests/test_axis.py b/lib/matplotlib/tests/test_axis.py index 6f79887071ba..ff7d8594c689 100644 --- a/lib/matplotlib/tests/test_axis.py +++ b/lib/matplotlib/tests/test_axis.py @@ -80,7 +80,7 @@ def test_grid_rcparams(): def_alpha = plt.rcParams["grid.alpha"] plt.rcParams.update({ - "grid.color": "gray","grid.minor.color": "red", + "grid.color": "gray", "grid.minor.color": "red", "grid.major.linestyle": ":", "grid.major.linewidth": 2, "grid.minor.alpha": 0.6, }) From b455d6b09a41753c13359e6cf41c89d49c59c175 Mon Sep 17 00:00:00 2001 From: Constantinos Menelaou Date: Wed, 29 Jan 2025 22:37:33 +0000 Subject: [PATCH 16/17] Fix example description --- doc/users/next_whats_new/new_rcparams_grid_options.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/users/next_whats_new/new_rcparams_grid_options.rst b/doc/users/next_whats_new/new_rcparams_grid_options.rst index 3ebacfea1ad8..73adbb27e52e 100644 --- a/doc/users/next_whats_new/new_rcparams_grid_options.rst +++ b/doc/users/next_whats_new/new_rcparams_grid_options.rst @@ -6,7 +6,7 @@ Using :rc:`grid.major.*` or :rc:`grid.minor.*` will overwrite the value in .. plot:: :include-source: true - :alt: Modifying the gridlines for three figures using the new options `rcParams` + :alt: Modifying the gridlines using the new options `rcParams` import matplotlib as mpl import matplotlib.pyplot as plt From 2cb99fc6cea6d28f8ac71b2426d34644cb27b7ab Mon Sep 17 00:00:00 2001 From: Constantinos Menelaou Date: Wed, 29 Jan 2025 22:42:18 +0000 Subject: [PATCH 17/17] Fix spelling --- doc/users/next_whats_new/new_rcparams_grid_options.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/users/next_whats_new/new_rcparams_grid_options.rst b/doc/users/next_whats_new/new_rcparams_grid_options.rst index 73adbb27e52e..4bfe6949f6a2 100644 --- a/doc/users/next_whats_new/new_rcparams_grid_options.rst +++ b/doc/users/next_whats_new/new_rcparams_grid_options.rst @@ -1,4 +1,4 @@ -Seperate styling options for major/minor grid line in rcParams +Separate styling options for major/minor grid line in rcParams -------------------------------------------------------------- Using :rc:`grid.major.*` or :rc:`grid.minor.*` will overwrite the value in @@ -22,7 +22,7 @@ Using :rc:`grid.major.*` or :rc:`grid.minor.*` will overwrite the value in mpl.rcParams["grid.color"] = "red" mpl.rcParams["grid.linewidth"] = 1 - # Overwrite some values for major and minor seperately + # Overwrite some values for major and minor separately mpl.rcParams["grid.major.color"] = "black" mpl.rcParams["grid.major.linewidth"] = 2 mpl.rcParams["grid.minor.linestyle"] = ":"