2017-04-14 1 views
0

J'utilise Matplotlib Basemap pour dessiner une carte et des points avec des étiquettes:Matplotlib Carte de base: éviter que le texte se chevauchent

map = Basemap(...) 

x, y = map(lons, lats)  
for label, xpt, ypt in zip(labels, x, y): 
    plt.text(xpt + 10, ypt + 10, label, size=2) 

Je reçois beaucoup d'étiquettes qui se chevauchent dans les zones denses. Existe-t-il un moyen d'empêcher le chevauchement des étiquettes?

+0

Je ne sais pas d'une sortie de la boîte pour le faire, je fais un hack manuel d'estimation des boîtes de sélection de texte, puis calculer le chevauchement sur une grille de pixels du texte précédent tracé, si aucun chevauchement n'est trouvé, je trace le texte et ajoute son rectangle de boîte englobante à la grille de pixels. – daryl

+0

Vous pouvez jeter un oeil à la réponse de [cette question] (https://stackoverflow.com/questions/19073683/matplotlib-overlapping-annotations-text). J'espère que cela aura du sens. – Boorn

Répondre

1

La seule façon que je peux penser est à

  1. Adjust la distance à partir de laquelle commence l'impression de texte (que vous avez spécifié comme 10)
  2. Zoom sur la carte tout en montrant des points marqués

Un exemple brut pour le point 2

Full view Map

further Zoom High Zoom

from mpl_toolkits.basemap import Basemap 
import matplotlib.pyplot as plt 
m = Basemap(width=120000,height=90000,projection='aeqd', 
      resolution=None,lat_0=30.,lon_0=80.) 
lats=[30.0,30.1,30.2,30.0,30.1,30.2] 
lons=[80.0,80.1,80.2,80.3,80.4,80.5] 
m.bluemarble() 
x, y = m(lons,lats) 
labels=['Point1','Point2','Point3','Point4','Point5','Point6'] 
m.scatter(x,y,10,marker='o',color='k') 
for label, xpt, ypt in zip(labels, x, y): 
    plt.text(xpt + 10, ypt + 10, label, size=20) 
plt.show()