How to insert scale bar in a map in matplotlib

Behnam picture Behnam · Sep 30, 2016 · Viewed 15.1k times · Source

Any ideas on how can I insert a scale bar in a map in matplotlib that shows the length scale? something like the one I have attached.

Or maybe any ideas on measuring and showing distances automatically (not drawing an arrow and writing the distance manually!)?

Thanks :)enter image description here

Answer

idahj picture idahj · Aug 25, 2017

There is a an already existing class for scalebars in matplotlib called AnchoredSizeBar. In the below example AnchoredSizeBar is used to add a scalebar to an image (or map over a 100x100 meter area of randomness).

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1.anchored_artists import AnchoredSizeBar
import matplotlib.font_manager as fm
fontprops = fm.FontProperties(size=18)
fig, ax = plt.subplots()
ax.imshow(np.random.random((10,10)),extent=[0,100,0,100]) 

Extent defines the images max and min of the horizontal and vertical values.

scalebar = AnchoredSizeBar(ax.transData,
                           20, '20 m', 'lower center', 
                           pad=0.1,
                           color='white',
                           frameon=False,
                           size_vertical=1,
                           fontproperties=fontprops)

ax.add_artist(scalebar)

The four first arguments to AnchoredSizeBar are the transformation object of the coordinate system, scalebar length, label and location. Further optional arguments change the layout. These are explained in the documentation.

ax.set_yticks([])
ax.set_xticks([])

This gives Scalebar on an image / a map over a 100x100 meter area of random