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!)?
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
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()