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

Skip to content

Commit 855e25b

Browse files
committed
feat: improve StepPatch baseline handling
1 parent bbcb982 commit 855e25b

File tree

3 files changed

+31
-26
lines changed

3 files changed

+31
-26
lines changed

examples/lines_bars_and_markers/stairs_demo.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@
4646
#############################################################################
4747
# ``baseline`` can take an array to allow for stacked histogram plots
4848

49-
A = np.tile([1,2,3], (3,1)) * np.arange(1, 4).reshape(-1, 1)
49+
A = np.tile([1, 2, 3], (3, 1)) * np.arange(1, 4).reshape(-1, 1)
5050
A = np.vstack([np.zeros(3), A])
5151

5252
for i in range(3):

lib/matplotlib/patches.py

Lines changed: 21 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -996,6 +996,7 @@ class StepPatch(PathPatch):
996996
The path is unclosed. It starts and stops at baseline.
997997
"""
998998

999+
@docstring.dedent_interpd
9991000
def __init__(self, values, edges, *,
10001001
orientation='vertical', baseline=0, **kwargs):
10011002
"""
@@ -1020,11 +1021,10 @@ def __init__(self, values, edges, *,
10201021
10211022
%(Patch)s
10221023
"""
1023-
self._edge_default = False
10241024
self.orientation = orientation
10251025
self._edges = np.asarray(edges)
10261026
self._values = np.asarray(values)
1027-
self.baseline = baseline
1027+
self._baseline = np.asarray(baseline) if baseline is not None else None
10281028
self._update_path()
10291029
super().__init__(self._path, **kwargs)
10301030

@@ -1039,34 +1039,35 @@ def _update_path(self):
10391039
verts, codes = [], []
10401040

10411041
_nan_vals = ~np.isnan(self._values)
1042-
if self.baseline is not None:
1043-
_nan_vals = _nan_vals & ~np.isnan(self.baseline)
1042+
if self._baseline is not None:
1043+
_nan_vals = _nan_vals & ~np.isnan(self._baseline)
10441044
for idx0, idx1 in cbook.contiguous_regions(_nan_vals):
10451045
x = np.repeat(self._edges[idx0:idx1+1], 2)
1046-
y = np.repeat(self._values[idx0:idx1], 2)
1047-
if np.isscalar(self.baseline): # baseline values
1048-
y = np.hstack((self.baseline, y, self.baseline))
1049-
elif hasattr(self.baseline, '__len__'): # baseline array
1050-
base = np.repeat(self.baseline[idx0:idx1], 2)[::-1]
1046+
y = np.repeat(self._values[idx0:idx1], 2)
1047+
if self._baseline is None:
1048+
y = np.hstack((y[0], y, y[-1]))
1049+
elif self._baseline.ndim == 0: # baseline values
1050+
y = np.hstack((self._baseline, y, self._baseline))
1051+
elif self._baseline.ndim == 1: # baseline array
1052+
base = np.repeat(self._baseline[idx0:idx1], 2)[::-1]
10511053
x = np.concatenate([x, x[::-1]])
10521054
y = np.concatenate([np.hstack((base[-1], y, base[0],
10531055
base[0], base, base[-1]))])
10541056
else: # no baseline
1055-
y = np.hstack((y[0], y, y[-1]))
1057+
raise ValueError('Invalid `baseline` specified')
10561058
if self.orientation == 'vertical':
10571059
xy = np.column_stack([x, y])
10581060
else:
10591061
xy = np.column_stack([y, x])
10601062
verts.append(xy)
10611063
codes.append(np.array([Path.MOVETO] + [Path.LINETO]*(len(xy)-1)))
10621064
self._path = Path(np.vstack(verts), np.hstack(codes))
1063-
10641065

10651066
def get_data(self):
10661067
"""Get `.StepPatch` values and edges."""
1067-
return self._values, self._edges
1068+
return self._values, self._edges, self._baseline
10681069

1069-
def set_data(self, values, edges=None):
1070+
def set_data(self, values, edges=None, baseline=None):
10701071
"""
10711072
Set `.StepPatch` values and optionally edges.
10721073
@@ -1075,11 +1076,14 @@ def set_data(self, values, edges=None):
10751076
values : 1D array-like or None
10761077
Will not update values, if passing None
10771078
edges : 1D array-like, optional
1079+
baseline : 1D array-like, optional
10781080
"""
10791081
if values is not None:
10801082
self._values = np.asarray(values)
10811083
if edges is not None:
10821084
self._edges = np.asarray(edges)
1085+
if baseline is not None:
1086+
self._baseline = np.asarray(baseline)
10831087
self._update_path()
10841088
self.stale = True
10851089

@@ -1104,20 +1108,18 @@ def set_edges(self, edges):
11041108
self.set_data(None, edges=edges)
11051109

11061110
def get_baseline(self):
1107-
"""Get `.StepPatch` baseline value."""
1108-
return self.baseline
1111+
"""Get `.StepPatch` baseline."""
1112+
return self._baseline
11091113

11101114
def set_baseline(self, baseline):
11111115
"""
1112-
Set `.StepPatch` baseline value.
1116+
Set `.StepPatch` baseline.
11131117
11141118
Parameters
11151119
----------
11161120
baseline : float or None
11171121
"""
1118-
self.baseline = baseline
1119-
self._update_path()
1120-
self.stale = True
1122+
self.set_data(None, baseline=baseline)
11211123

11221124

11231125
class Polygon(Patch):

lib/matplotlib/tests/test_axes.py

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1891,6 +1891,9 @@ def test_stairs_update(fig_test, fig_ref):
18911891
assert np.allclose(h.get_data()[1], np.arange(4))
18921892
h.set_baseline(-2)
18931893
assert h.get_baseline() == -2
1894+
h.set_baseline([-2, -2, -2])
1895+
assert np.array_equal(h.get_baseline(), np.array([-2, -2, -2]))
1896+
h.set_baseline(-2)
18941897

18951898
# # Ref
18961899
fig_ref, ref_ax = plt.subplots()
@@ -1928,18 +1931,18 @@ def test_stairs_options():
19281931
fig, ax = plt.subplots()
19291932
ax.stairs(y*3, x, color='green', fill=True, label="A")
19301933
ax.stairs(y, x*3-3, color='red', fill=True,
1931-
orientation='horizontal', label="B")
1934+
orientation='horizontal', label="B")
19321935
ax.stairs(yn, x, color='orange', ls='--', lw=2, label="C")
19331936
ax.stairs(yn/3, x*3-2, ls='--', lw=2, baseline=0.5,
1934-
orientation='horizontal', label="D")
1937+
orientation='horizontal', label="D")
19351938
ax.stairs(y[::-1]*3+13, x-1, color='red', ls='--', lw=2, baseline=None,
1936-
label="E")
1939+
label="E")
19371940
ax.stairs(y[::-1]*3+14, x, baseline=26,
1938-
color='purple', ls='--', lw=2, label="F")
1941+
color='purple', ls='--', lw=2, label="F")
19391942
ax.stairs(yn[::-1]*3+15, x+1, baseline=np.linspace(27, 25, len(y)),
1940-
color='blue', ls='--', lw=2, label="G", fill=True)
1943+
color='blue', ls='--', lw=2, label="G", fill=True)
19411944
ax.stairs(y[:-1][::-1]*2+11, x[:-1]+0.5, color='black', ls='--', lw=2,
1942-
baseline=12, hatch='//', label="H")
1945+
baseline=12, hatch='//', label="H")
19431946
ax.legend(loc=0)
19441947

19451948

0 commit comments

Comments
 (0)