@@ -942,18 +942,18 @@ def __init__(self, values, edges, *,
942
942
The direction of the steps. Vertical means that *values* are along
943
943
the y-axis, and edges are along the x-axis.
944
944
945
- baseline : float or None, default: 0
946
- Determines starting value of the bounding edges or when
945
+ baseline : float, 1D array-like or None, default: 0
946
+ Determines bottom value of the bounding edges or when
947
947
``fill=True``, position of lower edge.
948
948
949
949
Other valid keyword arguments are:
950
950
951
951
%(Patch)s
952
952
"""
953
- self .baseline = baseline
954
953
self .orientation = orientation
955
954
self ._edges = np .asarray (edges )
956
955
self ._values = np .asarray (values )
956
+ self ._baseline = np .asarray (baseline ) if baseline is not None else None
957
957
self ._update_path ()
958
958
super ().__init__ (self ._path , ** kwargs )
959
959
@@ -966,13 +966,24 @@ def _update_path(self):
966
966
f"`len(values) = { self ._values .size } ` and "
967
967
f"`len(edges) = { self ._edges .size } `." )
968
968
verts , codes = [], []
969
- for idx0 , idx1 in cbook .contiguous_regions (~ np .isnan (self ._values )):
969
+
970
+ _nan_mask = np .isnan (self ._values )
971
+ if self ._baseline is not None :
972
+ _nan_mask |= np .isnan (self ._baseline )
973
+ for idx0 , idx1 in cbook .contiguous_regions (~ _nan_mask ):
970
974
x = np .repeat (self ._edges [idx0 :idx1 + 1 ], 2 )
971
975
y = np .repeat (self ._values [idx0 :idx1 ], 2 )
972
- if self .baseline is not None :
973
- y = np .hstack ((self .baseline , y , self .baseline ))
974
- else :
976
+ if self ._baseline is None :
975
977
y = np .hstack ((y [0 ], y , y [- 1 ]))
978
+ elif self ._baseline .ndim == 0 : # single baseline value
979
+ y = np .hstack ((self ._baseline , y , self ._baseline ))
980
+ elif self ._baseline .ndim == 1 : # baseline array
981
+ base = np .repeat (self ._baseline [idx0 :idx1 ], 2 )[::- 1 ]
982
+ x = np .concatenate ([x , x [::- 1 ]])
983
+ y = np .concatenate ([np .hstack ((base [- 1 ], y , base [0 ],
984
+ base [0 ], base , base [- 1 ]))])
985
+ else : # no baseline
986
+ raise ValueError ('Invalid `baseline` specified' )
976
987
if self .orientation == 'vertical' :
977
988
xy = np .column_stack ([x , y ])
978
989
else :
@@ -982,23 +993,26 @@ def _update_path(self):
982
993
self ._path = Path (np .vstack (verts ), np .hstack (codes ))
983
994
984
995
def get_data (self ):
985
- """Get `.StepPatch` values and edges ."""
986
- return self ._values , self ._edges
996
+ """Get `.StepPatch` values, edges and baseline ."""
997
+ return self ._values , self ._edges , self . _baseline
987
998
988
- def set_data (self , values , edges = None ):
999
+ def set_data (self , values , edges = None , baseline = None ):
989
1000
"""
990
- Set `.StepPatch` values and optionally edges.
1001
+ Set `.StepPatch` values and optionally edges and baseline .
991
1002
992
1003
Parameters
993
1004
----------
994
1005
values : 1D array-like or None
995
1006
Will not update values, if passing None
996
1007
edges : 1D array-like, optional
1008
+ baseline : float, 1D array-like or None
997
1009
"""
998
1010
if values is not None :
999
1011
self ._values = np .asarray (values )
1000
1012
if edges is not None :
1001
1013
self ._edges = np .asarray (edges )
1014
+ if baseline is not None :
1015
+ self ._baseline = np .asarray (baseline )
1002
1016
self ._update_path ()
1003
1017
self .stale = True
1004
1018
@@ -1010,7 +1024,7 @@ def set_values(self, values):
1010
1024
----------
1011
1025
values : 1D array-like
1012
1026
"""
1013
- self .set_data (values , edges = None )
1027
+ self .set_data (values , edges = None , baseline = None )
1014
1028
1015
1029
def set_edges (self , edges ):
1016
1030
"""
@@ -1020,23 +1034,21 @@ def set_edges(self, edges):
1020
1034
----------
1021
1035
edges : 1D array-like
1022
1036
"""
1023
- self .set_data (None , edges = edges )
1037
+ self .set_data (None , edges = edges , baseline = None )
1024
1038
1025
1039
def get_baseline (self ):
1026
- """Get `.StepPatch` baseline value ."""
1027
- return self .baseline
1040
+ """Get `.StepPatch` baseline."""
1041
+ return self ._baseline
1028
1042
1029
1043
def set_baseline (self , baseline ):
1030
1044
"""
1031
- Set `.StepPatch` baseline value .
1045
+ Set `.StepPatch` baseline.
1032
1046
1033
1047
Parameters
1034
1048
----------
1035
- baseline : float or None
1049
+ baseline : float, array-like or None, default: 0
1036
1050
"""
1037
- self .baseline = baseline
1038
- self ._update_path ()
1039
- self .stale = True
1051
+ self .set_data (None , edges = None , baseline = baseline )
1040
1052
1041
1053
1042
1054
class Polygon (Patch ):
0 commit comments