web-dev-qa-db-fra.com

Comment insérer une barre d'échelle dans une carte dans Matplotlib

Avez-vous des idées sur la façon d'insérer une barre d'échelle dans une carte dans matplotlib qui montre l'échelle de longueur? quelque chose comme celui que j'ai joint.

Ou peut-être des idées sur la mesure et l'affichage automatique des distances (ne pas dessiner une flèche et écrire la distance manuellement!)?

Merci :) enter image description here

16
Behnam

Il existe une classe déjà existante pour les barres d'échelle dans matplotlib appelée AnchoredSizeBar . Dans l'exemple ci-dessous, AnchoredSizeBar est utilisé pour ajouter une barre d'échelle à une image (ou une carte sur une zone aléatoire de 100 x 100 mètres).

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]) 

L'étendue définit les images max et min des valeurs horizontales et verticales.

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)

Les quatre premiers arguments de AnchoredSizeBar sont l'objet de transformation du système de coordonnées, la longueur de la barre d'échelle, l'étiquette et l'emplacement. D'autres arguments facultatifs modifient la disposition. Celles-ci sont bien expliquées dans la docstring.

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

Cela donne Scalebar sur une image/une carte sur une zone aléatoire de 100x100 mètres

12
idahj

J'essaierais le matplotlib-scalebar paquet. (Pour quelque chose comme votre exemple c.)

En supposant que vous tracez une image de carte avec imshow ou similaire, et que vous connaissez la largeur de pixel/taille de cellule (la taille équivalente dans le monde réel d'un pixel sur l'image de carte), vous pouvez créer automatiquement la barre d'échelle :

Cet exemple est directement issu de la page du package PyPi matplotlib-scalebar mais ici, il est complet:

import matplotlib.pyplot as plt
import matplotlib.cbook as cbook
from matplotlib_scalebar.scalebar import ScaleBar

plt.figure()
image = plt.imread(cbook.get_sample_data('grace_hopper.png'))
plt.imshow(image)
scalebar = ScaleBar(0.2) # 1 pixel = 0.2 meter
plt.gca().add_artist(scalebar)
plt.show()

enter image description here

6
decvalts