Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit d0e1236

Browse files
story645oscargussledziu32jklymak
committed
added hatch kwarg arg + tests + what's new (w/ alt)
reworded pctdistance and labeldistance b/c of #24789 Co-authored-by: Oscar Gustafsson <[email protected]> Co-authored-by: sledziu32 <[email protected]> Co-authored-by: Jody Klymak <[email protected]>
1 parent 0e3a261 commit d0e1236

File tree

4 files changed

+73
-24
lines changed

4 files changed

+73
-24
lines changed
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
``hatch`` parameter for pie
2+
-------------------------------------------
3+
4+
`~matplotlib.axes.Axes.pie` now accepts a *hatch* keyword that takes as input
5+
a hatch or list of hatches:
6+
7+
.. plot::
8+
:include-source: true
9+
:alt: Two pie charts, identified as ax1 and ax2, both have a small blue slice, a medium orange slice, and a large green slice. ax1 has a dot hatching on the small slice, a small open circle hatching on the medium slice, and a large open circle hatching on the large slice. ax2 has the same large open circle with a dot hatch on every slice.
10+
11+
fig, (ax1, ax2) = plt.subplots(ncols=2)
12+
x = [10, 30, 60]
13+
14+
ax1.pie(x, hatch=['.', 'o', 'O'])
15+
ax2.pie(x, hatch='.O')
16+
17+
ax1.set_title("hatch=['.', 'o', 'O']")
18+
ax2.set_title("hatch='.O'")

lib/matplotlib/axes/_axes.py

Lines changed: 35 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -3083,7 +3083,7 @@ def pie(self, x, explode=None, labels=None, colors=None,
30833083
autopct=None, pctdistance=0.6, shadow=False, labeldistance=1.1,
30843084
startangle=0, radius=1, counterclock=True,
30853085
wedgeprops=None, textprops=None, center=(0, 0),
3086-
frame=False, rotatelabels=False, *, normalize=True):
3086+
frame=False, rotatelabels=False, *, normalize=True, hatch=None):
30873087
"""
30883088
Plot a pie chart.
30893089
@@ -3109,29 +3109,34 @@ def pie(self, x, explode=None, labels=None, colors=None,
31093109
A sequence of colors through which the pie chart will cycle. If
31103110
*None*, will use the colors in the currently active cycle.
31113111
3112+
hatch : str or list, default: None
3113+
Hatching pattern applied to all pie wedges or sequence of patterns
3114+
through which the chart will cycle. For a list of valid patterns,
3115+
see :doc:`/gallery/shapes_and_collections/hatch_style_reference`.
3116+
3117+
.. versionadded:: 3.7
3118+
31123119
autopct : None or str or callable, default: None
3113-
If not *None*, is a string or function used to label the wedges
3114-
with their numeric value. The label will be placed inside the
3115-
wedge. If it is a format string, the label will be ``fmt % pct``.
3116-
If it is a function, it will be called.
3120+
If not *None*, *autopct* is a string or function used to label the
3121+
wedges with their numeric value. The label will be placed inside
3122+
the wedge. If *autopct* is a format string, the label will be
3123+
``fmt % pct``. If *autopct* is a function, then it will be called.
31173124
31183125
pctdistance : float, default: 0.6
3119-
The ratio between the center of each pie slice and the start of
3120-
the text generated by *autopct*. Ignored if *autopct* is *None*.
3126+
The relative distance along the radius at which the the text
3127+
generated by *autopct* is drawn. To draw the text outside the pie,
3128+
set *pctdistance* > 1. This parameter is ignored if *autopct* is
3129+
``None``.
3130+
3131+
labeldistance : float or None, default: 1.1
3132+
The relative distance along the radius at which the labels are
3133+
drawn. To draw the labels inside the pie, set *labeldistance* < 1.
3134+
If set to ``None``, labels are not drawn but are still stored for
3135+
use in `.legend`.
31213136
31223137
shadow : bool, default: False
31233138
Draw a shadow beneath the pie.
31243139
3125-
normalize : bool, default: True
3126-
When *True*, always make a full pie by normalizing x so that
3127-
``sum(x) == 1``. *False* makes a partial pie if ``sum(x) <= 1``
3128-
and raises a `ValueError` for ``sum(x) > 1``.
3129-
3130-
labeldistance : float or None, default: 1.1
3131-
The radial distance at which the pie labels are drawn.
3132-
If set to ``None``, label are not drawn, but are stored for use in
3133-
``legend()``
3134-
31353140
startangle : float, default: 0 degrees
31363141
The angle by which the start of the pie is rotated,
31373142
counterclockwise from the x-axis.
@@ -3143,11 +3148,11 @@ def pie(self, x, explode=None, labels=None, colors=None,
31433148
Specify fractions direction, clockwise or counterclockwise.
31443149
31453150
wedgeprops : dict, default: None
3146-
Dict of arguments passed to the wedge objects making the pie.
3147-
For example, you can pass in ``wedgeprops = {'linewidth': 3}``
3148-
to set the width of the wedge border lines equal to 3.
3149-
For more details, look at the doc/arguments of the wedge object.
3150-
By default, ``clip_on=False``.
3151+
Dict of arguments passed to each `.patches.Wedge` of the pie.
3152+
For example, ``wedgeprops = {'linewidth': 3}`` sets the width of
3153+
the wedge border lines equal to 3. By default, ``clip_on=False``.
3154+
When there is a conflict between these properties and other
3155+
keywords, properties passed to *wedgeprops* take precedence.
31513156
31523157
textprops : dict, default: None
31533158
Dict of arguments to pass to the text objects.
@@ -3161,6 +3166,11 @@ def pie(self, x, explode=None, labels=None, colors=None,
31613166
rotatelabels : bool, default: False
31623167
Rotate each label to the angle of the corresponding slice if true.
31633168
3169+
normalize : bool, default: True
3170+
When *True*, always make a full pie by normalizing x so that
3171+
``sum(x) == 1``. *False* makes a partial pie if ``sum(x) <= 1``
3172+
and raises a `ValueError` for ``sum(x) > 1``.
3173+
31643174
data : indexable object, optional
31653175
DATA_PARAMETER_PLACEHOLDER
31663176
@@ -3215,6 +3225,8 @@ def pie(self, x, explode=None, labels=None, colors=None,
32153225
def get_next_color():
32163226
return next(color_cycle)
32173227

3228+
hatch_cycle = itertools.cycle(np.atleast_1d(hatch))
3229+
32183230
_api.check_isinstance(Number, radius=radius, startangle=startangle)
32193231
if radius <= 0:
32203232
raise ValueError(f'radius must be a positive number, not {radius}')
@@ -3241,6 +3253,7 @@ def get_next_color():
32413253
w = mpatches.Wedge((x, y), radius, 360. * min(theta1, theta2),
32423254
360. * max(theta1, theta2),
32433255
facecolor=get_next_color(),
3256+
hatch=next(hatch_cycle),
32443257
clip_on=False,
32453258
label=label)
32463259
w.set(**wedgeprops)

lib/matplotlib/pyplot.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2784,15 +2784,15 @@ def pie(
27842784
pctdistance=0.6, shadow=False, labeldistance=1.1,
27852785
startangle=0, radius=1, counterclock=True, wedgeprops=None,
27862786
textprops=None, center=(0, 0), frame=False,
2787-
rotatelabels=False, *, normalize=True, data=None):
2787+
rotatelabels=False, *, normalize=True, hatch=None, data=None):
27882788
return gca().pie(
27892789
x, explode=explode, labels=labels, colors=colors,
27902790
autopct=autopct, pctdistance=pctdistance, shadow=shadow,
27912791
labeldistance=labeldistance, startangle=startangle,
27922792
radius=radius, counterclock=counterclock,
27932793
wedgeprops=wedgeprops, textprops=textprops, center=center,
27942794
frame=frame, rotatelabels=rotatelabels, normalize=normalize,
2795-
**({"data": data} if data is not None else {}))
2795+
hatch=hatch, **({"data": data} if data is not None else {}))
27962796

27972797

27982798
# Autogenerated by boilerplate.py. Do not edit as changes will be lost.

lib/matplotlib/tests/test_axes.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5744,6 +5744,24 @@ def test_normalize_kwarg_pie():
57445744
assert abs(t2[0][-1].theta2 - 360.) > 1e-3
57455745

57465746

5747+
@check_figures_equal()
5748+
def test_pie_hatch_single(fig_test, fig_ref):
5749+
x = [0.3, 0.3, 0.1]
5750+
hatch = '+'
5751+
fig_test.subplots().pie(x, hatch=hatch)
5752+
wedges, _ = fig_ref.subplots().pie(x)
5753+
[w.set_hatch(hatch) for w in wedges]
5754+
5755+
5756+
@check_figures_equal()
5757+
def test_pie_hatch_multi(fig_test, fig_ref):
5758+
x = [0.3, 0.3, 0.1]
5759+
hatch = ['/', '+', '.']
5760+
fig_test.subplots().pie(x, hatch=hatch)
5761+
wedges, _ = fig_ref.subplots().pie(x)
5762+
[w.set_hatch(hp) for w, hp in zip(wedges, hatch)]
5763+
5764+
57475765
@image_comparison(['set_get_ticklabels.png'])
57485766
def test_set_get_ticklabels():
57495767
# test issue 2246

0 commit comments

Comments
 (0)