16
16
import numpy as np
17
17
18
18
import matplotlib as mpl
19
- from . import cbook
19
+ from . import cbook , ticker
20
20
from .lines import Line2D
21
21
from .patches import Circle , Rectangle , Ellipse
22
22
from .transforms import blended_transform_factory
@@ -256,7 +256,8 @@ class Slider(AxesWidget):
256
256
val : float
257
257
Slider value.
258
258
"""
259
- def __init__ (self , ax , label , valmin , valmax , valinit = 0.5 , valfmt = '%1.2f' ,
259
+
260
+ def __init__ (self , ax , label , valmin , valmax , valinit = 0.5 , valfmt = None ,
260
261
closedmin = True , closedmax = True , slidermin = None ,
261
262
slidermax = None , dragging = True , valstep = None ,
262
263
orientation = 'horizontal' , ** kwargs ):
@@ -278,8 +279,9 @@ def __init__(self, ax, label, valmin, valmax, valinit=0.5, valfmt='%1.2f',
278
279
valinit : float, default: 0.5
279
280
The slider initial position.
280
281
281
- valfmt : str, default: "%1.2f"
282
- Used to format the slider value, fprint format string.
282
+ valfmt : str, default: None
283
+ %-format string used to format the slider value. If None, a
284
+ `.ScalarFormatter` is used instead.
283
285
284
286
closedmin : bool, default: True
285
287
Whether the slider interval is closed on the bottom.
@@ -347,13 +349,22 @@ def __init__(self, ax, label, valmin, valmax, valinit=0.5, valfmt='%1.2f',
347
349
self .poly = ax .axvspan (valmin , valinit , 0 , 1 , ** kwargs )
348
350
self .vline = ax .axvline (valinit , 0 , 1 , color = 'r' , lw = 1 )
349
351
350
- self .valfmt = valfmt
351
- ax .set_yticks ([])
352
352
if orientation == 'vertical' :
353
353
ax .set_ylim ((valmin , valmax ))
354
+ axis = ax .yaxis
354
355
else :
355
356
ax .set_xlim ((valmin , valmax ))
357
+ axis = ax .xaxis
358
+
359
+ self .valfmt = valfmt
360
+ self ._fmt = axis .get_major_formatter ()
361
+ if not isinstance (self ._fmt , ticker .ScalarFormatter ):
362
+ self ._fmt = ticker .ScalarFormatter ()
363
+ self ._fmt .set_axis (axis )
364
+ self ._fmt .set_useOffset (False ) # No additive offset.
365
+
356
366
ax .set_xticks ([])
367
+ ax .set_yticks ([])
357
368
ax .set_navigate (False )
358
369
359
370
self .connect_event ('button_press_event' , self ._update )
@@ -365,7 +376,7 @@ def __init__(self, ax, label, valmin, valmax, valinit=0.5, valfmt='%1.2f',
365
376
verticalalignment = 'bottom' ,
366
377
horizontalalignment = 'center' )
367
378
368
- self .valtext = ax .text (0.5 , - 0.02 , valfmt % valinit ,
379
+ self .valtext = ax .text (0.5 , - 0.02 , self . _format ( valinit ) ,
369
380
transform = ax .transAxes ,
370
381
verticalalignment = 'top' ,
371
382
horizontalalignment = 'center' )
@@ -374,7 +385,7 @@ def __init__(self, ax, label, valmin, valmax, valinit=0.5, valfmt='%1.2f',
374
385
verticalalignment = 'center' ,
375
386
horizontalalignment = 'right' )
376
387
377
- self .valtext = ax .text (1.02 , 0.5 , valfmt % valinit ,
388
+ self .valtext = ax .text (1.02 , 0.5 , self . _format ( valinit ) ,
378
389
transform = ax .transAxes ,
379
390
verticalalignment = 'center' ,
380
391
horizontalalignment = 'left' )
@@ -435,6 +446,15 @@ def _update(self, event):
435
446
if val not in [None , self .val ]:
436
447
self .set_val (val )
437
448
449
+ def _format (self , val ):
450
+ """Pretty-print *val*."""
451
+ if self .valfmt is not None :
452
+ return self .valfmt % val
453
+ else :
454
+ _ , s , _ = self ._fmt .format_ticks ([self .valmin , val , self .valmax ])
455
+ # fmt.get_offset is actually the multiplicative factor, if any.
456
+ return s + self ._fmt .get_offset ()
457
+
438
458
def set_val (self , val ):
439
459
"""
440
460
Set slider value to *val*
@@ -451,7 +471,7 @@ def set_val(self, val):
451
471
xy [2 ] = val , 1
452
472
xy [3 ] = val , 0
453
473
self .poly .xy = xy
454
- self .valtext .set_text (self .valfmt % val )
474
+ self .valtext .set_text (self ._format ( val ) )
455
475
if self .drawon :
456
476
self .ax .figure .canvas .draw_idle ()
457
477
self .val = val
0 commit comments