43
43
# Standard library modules.
44
44
import bisect
45
45
import warnings
46
+ import dataclasses
46
47
47
48
# Third party modules.
48
49
import matplotlib
@@ -151,6 +152,15 @@ def _validate_legend_loc(loc):
151
152
}
152
153
153
154
155
+ @dataclasses .dataclass
156
+ class ScaleBarInfo :
157
+ length_px : int
158
+ value : float
159
+ units : str
160
+ scale_text : str
161
+ window_extent : matplotlib .transforms .Bbox
162
+
163
+
154
164
class ScaleBar (Artist ):
155
165
zorder = 6
156
166
@@ -379,6 +389,7 @@ def __init__(
379
389
self .rotation = rotation
380
390
self .bbox_to_anchor = bbox_to_anchor
381
391
self .bbox_transform = bbox_transform
392
+ self ._info = None
382
393
383
394
def _calculate_best_length (self , length_px ):
384
395
dx = self .dx
@@ -404,6 +415,8 @@ def _calculate_exact_length(self, value, units):
404
415
return newvalue / self .dx
405
416
406
417
def draw (self , renderer , * args , ** kwargs ):
418
+ self ._info = None
419
+
407
420
if not self .get_visible ():
408
421
return
409
422
if self .dx == 0 :
@@ -566,6 +579,10 @@ def _get_value(attr, default):
566
579
box .patch .set_alpha (box_alpha )
567
580
box .draw (renderer )
568
581
582
+ self ._info = ScaleBarInfo (
583
+ length_px , value , units , scale_text , box .get_window_extent (renderer )
584
+ )
585
+
569
586
def get_dx (self ):
570
587
return self ._dx
571
588
@@ -864,3 +881,9 @@ def set_bbox_transform(self, bbox_transform):
864
881
self ._bbox_transform = bbox_transform
865
882
866
883
bbox_transform = property (get_bbox_transform , set_bbox_transform )
884
+
885
+ @property
886
+ def info (self ):
887
+ if self ._info is None :
888
+ raise ValueError ("Scale bar has not been drawn. Call figure.canvas.draw()" )
889
+ return self ._info
0 commit comments