@@ -181,6 +181,63 @@ def test_interactive_zoom():
181
181
assert not ax .get_autoscalex_on () and not ax .get_autoscaley_on ()
182
182
183
183
184
+ @pytest .mark .parametrize ("plot_func" , ["imshow" , "contourf" ])
185
+ @pytest .mark .parametrize ("orientation" , ["vertical" , "horizontal" ])
186
+ @pytest .mark .parametrize ("tool,button,expected" ,
187
+ [("zoom" , MouseButton .LEFT , (4 , 6 )), # zoom in
188
+ ("zoom" , MouseButton .RIGHT , (- 20 , 30 )), # zoom out
189
+ ("pan" , MouseButton .LEFT , (- 2 , 8 ))])
190
+ def test_interactive_colorbar (plot_func , orientation , tool , button , expected ):
191
+ fig , ax = plt .subplots ()
192
+ data = np .arange (12 ).reshape ((4 , 3 ))
193
+ vmin0 , vmax0 = 0 , 10
194
+ coll = getattr (ax , plot_func )(data , vmin = vmin0 , vmax = vmax0 )
195
+
196
+ cb = fig .colorbar (coll , ax = ax , orientation = orientation )
197
+ if plot_func == "contourf" :
198
+ # Just determine we can't navigate and exit out of the test
199
+ assert not cb .ax .get_navigate ()
200
+ return
201
+
202
+ assert cb .ax .get_navigate ()
203
+
204
+ # Mouse from 4 to 6 (data coordinates, "d").
205
+ # The y coordinate doesn't matter, just needs to be between 0 and 1
206
+ vmin , vmax = 4 , 6
207
+ d0 = (vmin , 0.1 )
208
+ d1 = (vmax , 0.9 )
209
+ # Swap them if the orientation is vertical
210
+ if orientation == "vertical" :
211
+ d0 = d0 [::- 1 ]
212
+ d1 = d1 [::- 1 ]
213
+ # Convert to screen coordinates ("s"). Events are defined only with pixel
214
+ # precision, so round the pixel values, and below, check against the
215
+ # corresponding xdata/ydata, which are close but not equal to d0/d1.
216
+ s0 = cb .ax .transData .transform (d0 ).astype (int )
217
+ s1 = cb .ax .transData .transform (d1 ).astype (int )
218
+
219
+ # Set up the mouse movements
220
+ start_event = MouseEvent (
221
+ "button_press_event" , fig .canvas , * s0 , button )
222
+ stop_event = MouseEvent (
223
+ "button_release_event" , fig .canvas , * s1 , button )
224
+
225
+ tb = NavigationToolbar2 (fig .canvas )
226
+ if tool == "zoom" :
227
+ tb .zoom ()
228
+ tb .press_zoom (start_event )
229
+ tb .drag_zoom (stop_event )
230
+ tb .release_zoom (stop_event )
231
+ else :
232
+ tb .pan ()
233
+ tb .press_pan (start_event )
234
+ tb .drag_pan (stop_event )
235
+ tb .release_pan (stop_event )
236
+
237
+ # Should be close, but won't be exact due to screen integer resolution
238
+ assert (cb .vmin , cb .vmax ) == pytest .approx (expected , abs = 0.15 )
239
+
240
+
184
241
def test_toolbar_zoompan ():
185
242
expected_warning_regex = (
186
243
r"Treat the new Tool classes introduced in "
0 commit comments