19
19
from . import (_api , _docstring , backend_tools , cbook , colors , ticker ,
20
20
transforms )
21
21
from .lines import Line2D
22
- from .patches import Circle , Rectangle , Ellipse
22
+ from .patches import Circle , Rectangle , Ellipse , Polygon
23
23
from .transforms import TransformedPatchPath , Affine2D
24
24
25
25
@@ -709,7 +709,7 @@ def __init__(
709
709
facecolor = track_color
710
710
)
711
711
ax .add_patch (self .track )
712
- self . poly = ax .axhspan ( valinit [ 0 ], valinit [ 1 ], 0 , 1 , ** kwargs )
712
+ poly_transform = self . ax .get_yaxis_transform ( which = "grid" )
713
713
handleXY_1 = [.5 , valinit [0 ]]
714
714
handleXY_2 = [.5 , valinit [1 ]]
715
715
else :
@@ -719,9 +719,15 @@ def __init__(
719
719
facecolor = track_color
720
720
)
721
721
ax .add_patch (self .track )
722
- self . poly = ax .axvspan ( valinit [ 0 ], valinit [ 1 ], 0 , 1 , ** kwargs )
722
+ poly_transform = self . ax .get_xaxis_transform ( which = "grid" )
723
723
handleXY_1 = [valinit [0 ], .5 ]
724
724
handleXY_2 = [valinit [1 ], .5 ]
725
+ self .poly = Polygon (np .zeros ([5 , 2 ]), ** kwargs )
726
+ self ._update_selection_poly (* valinit )
727
+ self .poly .set_transform (poly_transform )
728
+ self .poly .get_path ()._interpolation_steps = 100
729
+ self .ax .add_patch (self .poly )
730
+ self .ax ._request_autoscale_view ()
725
731
self ._handles = [
726
732
ax .plot (
727
733
* handleXY_1 ,
@@ -777,6 +783,27 @@ def __init__(
777
783
self ._active_handle = None
778
784
self .set_val (valinit )
779
785
786
+ def _update_selection_poly (self , vmin , vmax ):
787
+ """
788
+ Update the vertices of the *self.poly* slider in-place
789
+ to cover the data range *vmin*, *vmax*.
790
+ """
791
+ # The vertices are positioned
792
+ # 1 ------ 2
793
+ # | |
794
+ # 0, 4 ---- 3
795
+ verts = self .poly .xy
796
+ if self .orientation == "vertical" :
797
+ verts [0 ] = verts [4 ] = .25 , vmin
798
+ verts [1 ] = .25 , vmax
799
+ verts [2 ] = .75 , vmax
800
+ verts [3 ] = .75 , vmin
801
+ else :
802
+ verts [0 ] = verts [4 ] = vmin , .25
803
+ verts [1 ] = vmin , .75
804
+ verts [2 ] = vmax , .75
805
+ verts [3 ] = vmax , .25
806
+
780
807
def _min_in_bounds (self , min ):
781
808
"""Ensure the new min value is between valmin and self.val[1]."""
782
809
if min <= self .valmin :
@@ -903,36 +930,24 @@ def set_val(self, val):
903
930
"""
904
931
val = np .sort (val )
905
932
_api .check_shape ((2 ,), val = val )
906
- val [0 ] = self ._min_in_bounds (val [0 ])
907
- val [1 ] = self ._max_in_bounds (val [1 ])
908
- xy = self .poly .xy
933
+ vmin , vmax = val
934
+ vmin = self ._min_in_bounds (vmin )
935
+ vmax = self ._max_in_bounds (vmax )
936
+ self ._update_selection_poly (vmin , vmax )
909
937
if self .orientation == "vertical" :
910
- xy [0 ] = .25 , val [0 ]
911
- xy [1 ] = .25 , val [1 ]
912
- xy [2 ] = .75 , val [1 ]
913
- xy [3 ] = .75 , val [0 ]
914
- xy [4 ] = .25 , val [0 ]
915
-
916
- self ._handles [0 ].set_ydata ([val [0 ]])
917
- self ._handles [1 ].set_ydata ([val [1 ]])
938
+ self ._handles [0 ].set_ydata ([vmin ])
939
+ self ._handles [1 ].set_ydata ([vmax ])
918
940
else :
919
- xy [0 ] = val [0 ], .25
920
- xy [1 ] = val [0 ], .75
921
- xy [2 ] = val [1 ], .75
922
- xy [3 ] = val [1 ], .25
923
- xy [4 ] = val [0 ], .25
941
+ self ._handles [0 ].set_xdata ([vmin ])
942
+ self ._handles [1 ].set_xdata ([vmax ])
924
943
925
- self ._handles [0 ].set_xdata ([val [0 ]])
926
- self ._handles [1 ].set_xdata ([val [1 ]])
927
-
928
- self .poly .xy = xy
929
- self .valtext .set_text (self ._format (val ))
944
+ self .valtext .set_text (self ._format ((vmin , vmax )))
930
945
931
946
if self .drawon :
932
947
self .ax .figure .canvas .draw_idle ()
933
- self .val = val
948
+ self .val = ( vmin , vmax )
934
949
if self .eventson :
935
- self ._observers .process ("changed" , val )
950
+ self ._observers .process ("changed" , ( vmin , vmax ) )
936
951
937
952
def on_changed (self , func ):
938
953
"""
0 commit comments