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

Skip to content

Commit 40c2435

Browse files
committed
feat: improve StepPatch baseline handling
1 parent 378ac3d commit 40c2435

File tree

3 files changed

+32
-26
lines changed

3 files changed

+32
-26
lines changed

lib/matplotlib/axes/_axes.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6787,7 +6787,8 @@ def stairs(self, values, edges=None, *,
67876787
if edges is None:
67886788
edges = np.arange(len(values) + 1)
67896789

6790-
self._process_unit_info(xdata=edges, ydata=[values, baseline], kwargs=kwargs)
6790+
self._process_unit_info(xdata=edges, ydata=[values, baseline],
6791+
kwargs=kwargs)
67916792
edges = self.convert_xunits(edges)
67926793
values = self.convert_yunits(values)
67936794
baseline = self.convert_yunits(baseline)

lib/matplotlib/patches.py

Lines changed: 21 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -992,6 +992,7 @@ def set_path(self, path):
992992
class StepPatch(PathPatch):
993993
"""An unclosed step path patch."""
994994

995+
@docstring.dedent_interpd
995996
def __init__(self, values, edges, *,
996997
orientation='vertical', baseline=0, **kwargs):
997998
"""
@@ -1014,11 +1015,10 @@ def __init__(self, values, edges, *,
10141015
10151016
%(Patch)s
10161017
"""
1017-
self._edge_default = False
10181018
self.orientation = orientation
10191019
self._edges = np.asarray(edges)
10201020
self._values = np.asarray(values)
1021-
self.baseline = baseline
1021+
self._baseline = np.asarray(baseline) if baseline is not None else None
10221022
self._update_path()
10231023
super().__init__(self._path, **kwargs)
10241024

@@ -1033,34 +1033,35 @@ def _update_path(self):
10331033
verts, codes = [], []
10341034

10351035
_nan_vals = ~np.isnan(self._values)
1036-
if self.baseline is not None:
1037-
_nan_vals = _nan_vals & ~np.isnan(self.baseline)
1036+
if self._baseline is not None:
1037+
_nan_vals = _nan_vals & ~np.isnan(self._baseline)
10381038
for idx0, idx1 in cbook.contiguous_regions(_nan_vals):
10391039
x = np.repeat(self._edges[idx0:idx1+1], 2)
1040-
y = np.repeat(self._values[idx0:idx1], 2)
1041-
if np.isscalar(self.baseline): # baseline values
1042-
y = np.hstack((self.baseline, y, self.baseline))
1043-
elif hasattr(self.baseline, '__len__'): # baseline array
1044-
base = np.repeat(self.baseline[idx0:idx1], 2)[::-1]
1040+
y = np.repeat(self._values[idx0:idx1], 2)
1041+
if self._baseline is None:
1042+
y = np.hstack((y[0], y, y[-1]))
1043+
elif self._baseline.ndim == 0: # baseline values
1044+
y = np.hstack((self._baseline, y, self._baseline))
1045+
elif self._baseline.ndim == 1: # baseline array
1046+
base = np.repeat(self._baseline[idx0:idx1], 2)[::-1]
10451047
x = np.concatenate([x, x[::-1]])
10461048
y = np.concatenate([np.hstack((base[-1], y, base[0],
10471049
base[0], base, base[-1]))])
10481050
else: # no baseline
1049-
y = np.hstack((y[0], y, y[-1]))
1051+
raise ValueError('Invalid `baseline` specified')
10501052
if self.orientation == 'vertical':
10511053
xy = np.column_stack([x, y])
10521054
else:
10531055
xy = np.column_stack([y, x])
10541056
verts.append(xy)
10551057
codes.append(np.array([Path.MOVETO] + [Path.LINETO]*(len(xy)-1)))
10561058
self._path = Path(np.vstack(verts), np.hstack(codes))
1057-
10581059

10591060
def get_data(self):
10601061
"""Get `.StepPatch` values and edges."""
1061-
return self._values, self._edges
1062+
return self._values, self._edges, self._baseline
10621063

1063-
def set_data(self, values, edges=None):
1064+
def set_data(self, values, edges=None, baseline=None):
10641065
"""
10651066
Set `.StepPatch` values and optionally edges.
10661067
@@ -1069,11 +1070,14 @@ def set_data(self, values, edges=None):
10691070
values : 1D array-like or None
10701071
Will not update values, if passing None
10711072
edges : 1D array-like, optional
1073+
baseline : 1D array-like, optional
10721074
"""
10731075
if values is not None:
10741076
self._values = np.asarray(values)
10751077
if edges is not None:
10761078
self._edges = np.asarray(edges)
1079+
if baseline is not None:
1080+
self._baseline = np.asarray(baseline)
10771081
self._update_path()
10781082
self.stale = True
10791083

@@ -1098,20 +1102,18 @@ def set_edges(self, edges):
10981102
self.set_data(None, edges=edges)
10991103

11001104
def get_baseline(self):
1101-
"""Get `.StepPatch` baseline value."""
1102-
return self.baseline
1105+
"""Get `.StepPatch` baseline."""
1106+
return self._baseline
11031107

11041108
def set_baseline(self, baseline):
11051109
"""
1106-
Set `.StepPatch` baseline value.
1110+
Set `.StepPatch` baseline.
11071111
11081112
Parameters
11091113
----------
11101114
baseline : float or None
11111115
"""
1112-
self.baseline = baseline
1113-
self._update_path()
1114-
self.stale = True
1116+
self.set_data(None, baseline=baseline)
11151117

11161118

11171119
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)