From 9a88576ea249992b0027f0f1affdcad020c19b1f Mon Sep 17 00:00:00 2001 From: Oscar Gustafsson Date: Sun, 5 Mar 2023 13:59:01 +0100 Subject: [PATCH] Add configuration of Shadow and pie shadow --- .../next_whats_new/pie_shadow_control.rst | 5 ++ doc/users/next_whats_new/shadow_shade.rst | 6 ++ .../pie_and_polar_charts/pie_demo2.py | 55 ------------------ .../pie_and_polar_charts/pie_features.py | 29 ++++++++- lib/matplotlib/axes/_axes.py | 14 +++-- lib/matplotlib/patches.py | 14 ++++- .../baseline_images/test_axes/pie_shadow.png | Bin 0 -> 29950 bytes lib/matplotlib/tests/test_axes.py | 24 ++++++++ lib/matplotlib/tests/test_legend.py | 4 +- 9 files changed, 87 insertions(+), 64 deletions(-) create mode 100644 doc/users/next_whats_new/pie_shadow_control.rst create mode 100644 doc/users/next_whats_new/shadow_shade.rst delete mode 100644 galleries/examples/pie_and_polar_charts/pie_demo2.py create mode 100644 lib/matplotlib/tests/baseline_images/test_axes/pie_shadow.png diff --git a/doc/users/next_whats_new/pie_shadow_control.rst b/doc/users/next_whats_new/pie_shadow_control.rst new file mode 100644 index 000000000000..a112928e5b6f --- /dev/null +++ b/doc/users/next_whats_new/pie_shadow_control.rst @@ -0,0 +1,5 @@ +The pie chart shadow can be controlled +-------------------------------------- + +The *shadow* argument to `~.Axes.pie` can now be a dict, allowing more control +of the `.Shadow`-patch used. diff --git a/doc/users/next_whats_new/shadow_shade.rst b/doc/users/next_whats_new/shadow_shade.rst new file mode 100644 index 000000000000..cafa2f4d346f --- /dev/null +++ b/doc/users/next_whats_new/shadow_shade.rst @@ -0,0 +1,6 @@ +Shadow shade can be controlled +------------------------------ + +The `.Shadow` patch now has a *shade* argument to control the shadow darkness. +If 1, the shadow is black, if 0, the shadow has the same color as the patch that +is shadowed. The default value, which earlier was fixed, is 0.7. diff --git a/galleries/examples/pie_and_polar_charts/pie_demo2.py b/galleries/examples/pie_and_polar_charts/pie_demo2.py deleted file mode 100644 index 61f88a15d8c8..000000000000 --- a/galleries/examples/pie_and_polar_charts/pie_demo2.py +++ /dev/null @@ -1,55 +0,0 @@ -""" -========= -Pie Demo2 -========= - -Make a pie charts using `~.axes.Axes.pie`. - -This example demonstrates some pie chart features like labels, varying size, -autolabeling the percentage, offsetting a slice and adding a shadow. -""" - -import matplotlib.pyplot as plt - -# Some data -labels = 'Frogs', 'Hogs', 'Dogs', 'Logs' -fracs = [15, 30, 45, 10] - -# Make figure and axes -fig, axs = plt.subplots(2, 2) - -# A standard pie plot -axs[0, 0].pie(fracs, labels=labels, autopct='%1.1f%%', shadow=True) - -# Shift the second slice using explode -axs[0, 1].pie(fracs, labels=labels, autopct='%.0f%%', shadow=True, - explode=(0, 0.1, 0, 0)) - -# Adapt radius and text size for a smaller pie -patches, texts, autotexts = axs[1, 0].pie(fracs, labels=labels, - autopct='%.0f%%', - textprops={'size': 'smaller'}, - shadow=True, radius=0.5) -# Make percent texts even smaller -plt.setp(autotexts, size='x-small') -autotexts[0].set_color('white') - -# Use a smaller explode and turn of the shadow for better visibility -patches, texts, autotexts = axs[1, 1].pie(fracs, labels=labels, - autopct='%.0f%%', - textprops={'size': 'smaller'}, - shadow=False, radius=0.5, - explode=(0, 0.05, 0, 0)) -plt.setp(autotexts, size='x-small') -autotexts[0].set_color('white') - -plt.show() - -# %% -# -# .. admonition:: References -# -# The use of the following functions, methods, classes and modules is shown -# in this example: -# -# - `matplotlib.axes.Axes.pie` / `matplotlib.pyplot.pie` diff --git a/galleries/examples/pie_and_polar_charts/pie_features.py b/galleries/examples/pie_and_polar_charts/pie_features.py index cb6ab51c0eac..7794a3d22a7e 100644 --- a/galleries/examples/pie_and_polar_charts/pie_features.py +++ b/galleries/examples/pie_and_polar_charts/pie_features.py @@ -1,4 +1,6 @@ """ +.. redirect-from:: gallery/pie_and_polar_charts/pie_demo2 + ========== Pie charts ========== @@ -88,7 +90,7 @@ fig, ax = plt.subplots() ax.pie(sizes, explode=explode, labels=labels, autopct='%1.1f%%', - shadow=True, startangle=90) + shadow=True, startangle=90) plt.show() # %% @@ -97,6 +99,31 @@ # slices are rotated counter-clockwise by 90 degrees, and the frog slice starts # on the positive y-axis. # +# Controlling the size +# -------------------- +# +# By changing the *radius* parameter, and often the text size for better visual +# appearance, the pie chart can be scaled. + +fig, ax = plt.subplots() + +ax.pie(sizes, labels=labels, autopct='%.0f%%', + textprops={'size': 'smaller'}, radius=0.5) +plt.show() + +# %% +# Modifying the shadow +# -------------------- +# +# The *shadow* parameter may optionally take a dictionary with arguments to +# the `.Shadow` patch. This can be used to modify the default shadow. + +fig, ax = plt.subplots() +ax.pie(sizes, explode=explode, labels=labels, autopct='%1.1f%%', + shadow={'ox': -0.04, 'edgecolor': 'none', 'shade': 0.9}, startangle=90) +plt.show() + +# %% # .. admonition:: References # # The use of the following functions, methods, classes and modules is shown diff --git a/lib/matplotlib/axes/_axes.py b/lib/matplotlib/axes/_axes.py index 99a8a9f6fc51..e59b31a6055d 100644 --- a/lib/matplotlib/axes/_axes.py +++ b/lib/matplotlib/axes/_axes.py @@ -3102,8 +3102,12 @@ def pie(self, x, explode=None, labels=None, colors=None, If set to ``None``, labels are not drawn but are still stored for use in `.legend`. - shadow : bool, default: False - Draw a shadow beneath the pie. + shadow : bool or dict, default: False + If bool, whether to draw a shadow beneath the pie. If dict, draw a shadow + passing the properties in the dict to `.Shadow`. + + .. versionadded:: 3.8 + *shadow* can be a dict. startangle : float, default: 0 degrees The angle by which the start of the pie is rotated, @@ -3231,8 +3235,10 @@ def get_next_color(): if shadow: # Make sure to add a shadow after the call to add_patch so the # figure and transform props will be set. - shad = mpatches.Shadow(w, -0.02, -0.02, label='_nolegend_') - self.add_patch(shad) + shadow_dict = {'ox': -0.02, 'oy': -0.02, 'label': '_nolegend_'} + if isinstance(shadow, dict): + shadow_dict.update(shadow) + self.add_patch(mpatches.Shadow(w, **shadow_dict)) if labeldistance is not None: xt = x + labeldistance * radius * math.cos(thetam) diff --git a/lib/matplotlib/patches.py b/lib/matplotlib/patches.py index 3b370521ed17..bd18f0a79e0e 100644 --- a/lib/matplotlib/patches.py +++ b/lib/matplotlib/patches.py @@ -613,12 +613,12 @@ def __str__(self): return f"Shadow({self.patch})" @_docstring.dedent_interpd - def __init__(self, patch, ox, oy, **kwargs): + def __init__(self, patch, ox, oy, *, shade=0.7, **kwargs): """ Create a shadow of the given *patch*. By default, the shadow will have the same face color as the *patch*, - but darkened. + but darkened. The darkness can be controlled by *shade*. Parameters ---------- @@ -627,6 +627,12 @@ def __init__(self, patch, ox, oy, **kwargs): ox, oy : float The shift of the shadow in data coordinates, scaled by a factor of dpi/72. + shade : float, default: 0.7 + How the darkness of the shadow relates to the original color. If 1, the + shadow is black, if 0, the shadow has the same color as the *patch*. + + .. versionadded:: 3.8 + **kwargs Properties of the shadow patch. Supported keys are: @@ -638,7 +644,9 @@ def __init__(self, patch, ox, oy, **kwargs): self._shadow_transform = transforms.Affine2D() self.update_from(self.patch) - color = .3 * np.asarray(colors.to_rgb(self.patch.get_facecolor())) + if not 0 <= shade <= 1: + raise ValueError("shade must be between 0 and 1.") + color = (1 - shade) * np.asarray(colors.to_rgb(self.patch.get_facecolor())) self.update({'facecolor': color, 'edgecolor': color, 'alpha': 0.5, # Place shadow patch directly behind the inherited patch. 'zorder': np.nextafter(self.patch.zorder, -np.inf), diff --git a/lib/matplotlib/tests/baseline_images/test_axes/pie_shadow.png b/lib/matplotlib/tests/baseline_images/test_axes/pie_shadow.png new file mode 100644 index 0000000000000000000000000000000000000000..fc8076486661213426eaf6371996bec3351d3776 GIT binary patch literal 29950 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 Ve+s@{0-qa&$Vn-^DSmAb@IPQ@FFgPN literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/test_axes.py b/lib/matplotlib/tests/test_axes.py index b68ebcf57ba7..f1b7d7281c45 100644 --- a/lib/matplotlib/tests/test_axes.py +++ b/lib/matplotlib/tests/test_axes.py @@ -5697,6 +5697,30 @@ def test_pie_nolabel_but_legend(): plt.legend() +@image_comparison(['pie_shadow.png'], style='mpl20') +def test_pie_shadow(): + # Also acts as a test for the shade argument of Shadow + sizes = [15, 30, 45, 10] + colors = ['yellowgreen', 'gold', 'lightskyblue', 'lightcoral'] + explode = (0, 0.1, 0, 0) # only "explode" the 2nd slice + _, axes = plt.subplots(2, 2) + axes[0][0].pie(sizes, explode=explode, colors=colors, + shadow=True, startangle=90, + wedgeprops={'linewidth': 0}) + + axes[0][1].pie(sizes, explode=explode, colors=colors, + shadow=False, startangle=90, + wedgeprops={'linewidth': 0}) + + axes[1][0].pie(sizes, explode=explode, colors=colors, + shadow={'ox': -0.05, 'oy': -0.05, 'shade': 0.9, 'edgecolor': 'none'}, + startangle=90, wedgeprops={'linewidth': 0}) + + axes[1][1].pie(sizes, explode=explode, colors=colors, + shadow={'ox': 0.05, 'linewidth': 2, 'shade': 0.2}, + startangle=90, wedgeprops={'linewidth': 0}) + + def test_pie_textprops(): data = [23, 34, 45] labels = ["Long name 1", "Long name 2", "Long name 3"] diff --git a/lib/matplotlib/tests/test_legend.py b/lib/matplotlib/tests/test_legend.py index 74d054af6b05..2f488e44ecc7 100644 --- a/lib/matplotlib/tests/test_legend.py +++ b/lib/matplotlib/tests/test_legend.py @@ -196,8 +196,10 @@ def test_alpha_rcparam(): leg.legendPatch.set_facecolor([1, 0, 0, 0.5]) -@image_comparison(['fancy'], remove_text=True) +@image_comparison(['fancy'], remove_text=True, tol=0.05) def test_fancy(): + # Tolerance caused by changing default shadow "shade" from 0.3 to 1 - 0.7 = + # 0.30000000000000004 # using subplot triggers some offsetbox functionality untested elsewhere plt.subplot(121) plt.plot([5] * 10, 'o--', label='XX')