@@ -1013,18 +1013,18 @@ def __init__(self, values, edges, *,
1013
1013
The direction of the steps. Vertical means that *values* are along
1014
1014
the y-axis, and edges are along the x-axis.
1015
1015
1016
- baseline : float or None, default: 0
1017
- Determines starting value of the bounding edges or when
1016
+ baseline : float, 1D array-like or None, default: 0
1017
+ Determines bottom value of the bounding edges or when
1018
1018
``fill=True``, position of lower edge.
1019
1019
1020
1020
Other valid keyword arguments are:
1021
1021
1022
1022
%(Patch)s
1023
1023
"""
1024
- self .baseline = baseline
1025
1024
self .orientation = orientation
1026
1025
self ._edges = np .asarray (edges )
1027
1026
self ._values = np .asarray (values )
1027
+ self ._baseline = np .asarray (baseline ) if baseline is not None else None
1028
1028
self ._update_path ()
1029
1029
super ().__init__ (self ._path , ** kwargs )
1030
1030
@@ -1037,13 +1037,24 @@ def _update_path(self):
1037
1037
f"`len(values) = { self ._values .size } ` and "
1038
1038
f"`len(edges) = { self ._edges .size } `." )
1039
1039
verts , codes = [], []
1040
- for idx0 , idx1 in cbook .contiguous_regions (~ np .isnan (self ._values )):
1040
+
1041
+ _nan_mask = np .isnan (self ._values )
1042
+ if self ._baseline is not None :
1043
+ _nan_mask |= np .isnan (self ._baseline )
1044
+ for idx0 , idx1 in cbook .contiguous_regions (~ _nan_mask ):
1041
1045
x = np .repeat (self ._edges [idx0 :idx1 + 1 ], 2 )
1042
1046
y = np .repeat (self ._values [idx0 :idx1 ], 2 )
1043
- if self .baseline is not None :
1044
- y = np .hstack ((self .baseline , y , self .baseline ))
1045
- else :
1047
+ if self ._baseline is None :
1046
1048
y = np .hstack ((y [0 ], y , y [- 1 ]))
1049
+ elif self ._baseline .ndim == 0 : # single baseline value
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 ]
1053
+ x = np .concatenate ([x , x [::- 1 ]])
1054
+ y = np .concatenate ([np .hstack ((base [- 1 ], y , base [0 ],
1055
+ base [0 ], base , base [- 1 ]))])
1056
+ else : # no baseline
1057
+ raise ValueError ('Invalid `baseline` specified' )
1047
1058
if self .orientation == 'vertical' :
1048
1059
xy = np .column_stack ([x , y ])
1049
1060
else :
@@ -1053,23 +1064,26 @@ def _update_path(self):
1053
1064
self ._path = Path (np .vstack (verts ), np .hstack (codes ))
1054
1065
1055
1066
def get_data (self ):
1056
- """Get `.StepPatch` values and edges ."""
1057
- return self ._values , self ._edges
1067
+ """Get `.StepPatch` values, edges and baseline ."""
1068
+ return self ._values , self ._edges , self . _baseline
1058
1069
1059
- def set_data (self , values , edges = None ):
1070
+ def set_data (self , values , edges = None , baseline = None ):
1060
1071
"""
1061
- Set `.StepPatch` values and optionally edges.
1072
+ Set `.StepPatch` values and optionally edges and baseline .
1062
1073
1063
1074
Parameters
1064
1075
----------
1065
1076
values : 1D array-like or None
1066
1077
Will not update values, if passing None
1067
1078
edges : 1D array-like, optional
1079
+ baseline : float, 1D array-like or None
1068
1080
"""
1069
1081
if values is not None :
1070
1082
self ._values = np .asarray (values )
1071
1083
if edges is not None :
1072
1084
self ._edges = np .asarray (edges )
1085
+ if baseline is not None :
1086
+ self ._baseline = np .asarray (baseline )
1073
1087
self ._update_path ()
1074
1088
self .stale = True
1075
1089
@@ -1081,7 +1095,7 @@ def set_values(self, values):
1081
1095
----------
1082
1096
values : 1D array-like
1083
1097
"""
1084
- self .set_data (values , edges = None )
1098
+ self .set_data (values , edges = None , baseline = None )
1085
1099
1086
1100
def set_edges (self , edges ):
1087
1101
"""
@@ -1091,23 +1105,21 @@ def set_edges(self, edges):
1091
1105
----------
1092
1106
edges : 1D array-like
1093
1107
"""
1094
- self .set_data (None , edges = edges )
1108
+ self .set_data (None , edges = edges , baseline = None )
1095
1109
1096
1110
def get_baseline (self ):
1097
- """Get `.StepPatch` baseline value ."""
1098
- return self .baseline
1111
+ """Get `.StepPatch` baseline."""
1112
+ return self ._baseline
1099
1113
1100
1114
def set_baseline (self , baseline ):
1101
1115
"""
1102
- Set `.StepPatch` baseline value .
1116
+ Set `.StepPatch` baseline.
1103
1117
1104
1118
Parameters
1105
1119
----------
1106
- baseline : float or None
1120
+ baseline : float, array-like or None, default: 0
1107
1121
"""
1108
- self .baseline = baseline
1109
- self ._update_path ()
1110
- self .stale = True
1122
+ self .set_data (None , edges = None , baseline = baseline )
1111
1123
1112
1124
1113
1125
class Polygon (Patch ):
0 commit comments