From 5dc73383be654777ba77a87b354f325e5be0c1df Mon Sep 17 00:00:00 2001 From: Oscar Gustafsson Date: Wed, 28 Sep 2022 14:58:00 +0200 Subject: [PATCH] Add rcParams for 3D pane color --- .../next_whats_new/3d_pane_color_rcparams.rst | 18 ++++++ lib/matplotlib/mpl-data/matplotlibrc | 3 + lib/matplotlib/rcsetup.py | 4 ++ lib/mpl_toolkits/mplot3d/axis3d.py | 57 +++++++++--------- .../test_mplot3d/panecolor_rcparams.png | Bin 0 -> 4561 bytes lib/mpl_toolkits/tests/test_mplot3d.py | 11 ++++ 6 files changed, 65 insertions(+), 28 deletions(-) create mode 100644 doc/users/next_whats_new/3d_pane_color_rcparams.rst create mode 100644 lib/mpl_toolkits/tests/baseline_images/test_mplot3d/panecolor_rcparams.png diff --git a/doc/users/next_whats_new/3d_pane_color_rcparams.rst b/doc/users/next_whats_new/3d_pane_color_rcparams.rst new file mode 100644 index 000000000000..949b75a322c8 --- /dev/null +++ b/doc/users/next_whats_new/3d_pane_color_rcparams.rst @@ -0,0 +1,18 @@ +rcParam for 3D pane color +------------------------- + +The rcParams :rc:`axes3d.xaxis.panecolor`, :rc:`axes3d.yaxis.panecolor`, +:rc:`axes3d.zaxis.panecolor` can be used to change the color of the background +panes in 3D plots. Note that it is often beneficial to give them slightly +different shades to obtain a "3D effect" and to make them slightly transparent +(alpha < 1). + +.. plot:: + :include-source: true + + import matplotlib.pyplot as plt + with plt.rc_context({'axes3d.xaxis.panecolor': (0.9, 0.0, 0.0, 0.5), + 'axes3d.yaxis.panecolor': (0.7, 0.0, 0.0, 0.5), + 'axes3d.zaxis.panecolor': (0.8, 0.0, 0.0, 0.5)}): + fig = plt.figure() + fig.add_subplot(projection='3d') diff --git a/lib/matplotlib/mpl-data/matplotlibrc b/lib/matplotlib/mpl-data/matplotlibrc index 8dff1a6c6c33..b76b1191eecd 100644 --- a/lib/matplotlib/mpl-data/matplotlibrc +++ b/lib/matplotlib/mpl-data/matplotlibrc @@ -427,6 +427,9 @@ #polaraxes.grid: True # display grid on polar axes #axes3d.grid: True # display grid on 3D axes +#axes3d.xaxis.panecolor: (0.95, 0.95, 0.95, 0.5) # background pane on 3D axes +#axes3d.yaxis.panecolor: (0.90, 0.90, 0.90, 0.5) # background pane on 3D axes +#axes3d.zaxis.panecolor: (0.925, 0.925, 0.925, 0.5) # background pane on 3D axes ## *************************************************************************** ## * AXIS * diff --git a/lib/matplotlib/rcsetup.py b/lib/matplotlib/rcsetup.py index 0a0e0bb2734c..5a5914ba7b3b 100644 --- a/lib/matplotlib/rcsetup.py +++ b/lib/matplotlib/rcsetup.py @@ -1020,6 +1020,10 @@ def _convert_validator_spec(key, conv): "polaraxes.grid": validate_bool, # display polar grid or not "axes3d.grid": validate_bool, # display 3d grid + "axes3d.xaxis.panecolor": validate_color, # 3d background pane + "axes3d.yaxis.panecolor": validate_color, # 3d background pane + "axes3d.zaxis.panecolor": validate_color, # 3d background pane + # scatter props "scatter.marker": validate_string, "scatter.edgecolors": validate_string, diff --git a/lib/mpl_toolkits/mplot3d/axis3d.py b/lib/mpl_toolkits/mplot3d/axis3d.py index efb3ced73048..6e22123a5faa 100644 --- a/lib/mpl_toolkits/mplot3d/axis3d.py +++ b/lib/mpl_toolkits/mplot3d/axis3d.py @@ -61,12 +61,9 @@ class Axis(maxis.XAxis): # Some properties for the axes _AXINFO = { - 'x': {'i': 0, 'tickdir': 1, 'juggled': (1, 0, 2), - 'color': (0.95, 0.95, 0.95, 0.5)}, - 'y': {'i': 1, 'tickdir': 0, 'juggled': (0, 1, 2), - 'color': (0.90, 0.90, 0.90, 0.5)}, - 'z': {'i': 2, 'tickdir': 0, 'juggled': (0, 2, 1), - 'color': (0.925, 0.925, 0.925, 0.5)}, + 'x': {'i': 0, 'tickdir': 1, 'juggled': (1, 0, 2)}, + 'y': {'i': 1, 'tickdir': 0, 'juggled': (0, 1, 2)}, + 'z': {'i': 2, 'tickdir': 0, 'juggled': (0, 2, 1)}, } def _old_init(self, adir, v_intervalx, d_intervalx, axes, *args, @@ -97,17 +94,18 @@ def __init__(self, *args, **kwargs): # This is a temporary member variable. # Do not depend on this existing in future releases! self._axinfo = self._AXINFO[name].copy() + # Common parts + self._axinfo.update({ + 'label': {'va': 'center', 'ha': 'center'}, + 'color': mpl.rcParams[f'axes3d.{name}axis.panecolor'], + 'tick': { + 'inward_factor': 0.2, + 'outward_factor': 0.1, + }, + }) + if mpl.rcParams['_internal.classic_mode']: self._axinfo.update({ - 'label': {'va': 'center', 'ha': 'center'}, - 'tick': { - 'inward_factor': 0.2, - 'outward_factor': 0.1, - 'linewidth': { - True: mpl.rcParams['lines.linewidth'], # major - False: mpl.rcParams['lines.linewidth'], # minor - } - }, 'axisline': {'linewidth': 0.75, 'color': (0, 0, 0, 1)}, 'grid': { 'color': (0.9, 0.9, 0.9, 1), @@ -115,21 +113,14 @@ def __init__(self, *args, **kwargs): 'linestyle': '-', }, }) + self._axinfo['tick'].update({ + 'linewidth': { + True: mpl.rcParams['lines.linewidth'], # major + False: mpl.rcParams['lines.linewidth'], # minor + } + }) else: self._axinfo.update({ - 'label': {'va': 'center', 'ha': 'center'}, - 'tick': { - 'inward_factor': 0.2, - 'outward_factor': 0.1, - 'linewidth': { - True: ( # major - mpl.rcParams['xtick.major.width'] if name in 'xz' - else mpl.rcParams['ytick.major.width']), - False: ( # minor - mpl.rcParams['xtick.minor.width'] if name in 'xz' - else mpl.rcParams['ytick.minor.width']), - } - }, 'axisline': { 'linewidth': mpl.rcParams['axes.linewidth'], 'color': mpl.rcParams['axes.edgecolor'], @@ -140,6 +131,16 @@ def __init__(self, *args, **kwargs): 'linestyle': mpl.rcParams['grid.linestyle'], }, }) + self._axinfo['tick'].update({ + 'linewidth': { + True: ( # major + mpl.rcParams['xtick.major.width'] if name in 'xz' + else mpl.rcParams['ytick.major.width']), + False: ( # minor + mpl.rcParams['xtick.minor.width'] if name in 'xz' + else mpl.rcParams['ytick.minor.width']), + } + }) super().__init__(axes, *args, **kwargs) diff --git a/lib/mpl_toolkits/tests/baseline_images/test_mplot3d/panecolor_rcparams.png b/lib/mpl_toolkits/tests/baseline_images/test_mplot3d/panecolor_rcparams.png new file mode 100644 index 0000000000000000000000000000000000000000..e8e2ac6dcd5a338ca7ba5d73c9029a45f67e5160 GIT binary patch literal 4561 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