2010-05-07 6 views
11

Je voudrais contrôler l'emplacement des clabels matplotlib sur un tracé de contour, mais sans utiliser le drapeau manuel = True dans clabel. Par exemple, je voudrais spécifier une coordonnée x, et avoir des étiquettes créées aux points qui traversent cette ligne. Je vois que vous pouvez obtenir l'emplacement des étiquettes individuelles en utilisant get_position(), mais je suis coincé à cela. Toute aide serait grandement appréciée. Merci!Matplotlib Contour Clabel Emplacement

Répondre

5

Non, il n'y a aucun moyen de le faire dans matplotlib. Vous êtes censé soit vivre avec les emplacements par défaut ou aller complètement interactif avec le manuel et en utilisant la souris. Vous voudrez peut-être classer cela comme un rapport de bogue en amont afin qu'ils puissent améliorer leurs algorithmes.

Il existe plusieurs options pour contourner ce problème. Le premier consiste à placer du texte par programme sur la figure de contour. Vous ne serez pas en mesure de supprimer de manière fiable les lignes sous le texte de cette façon. En supposant que vous avez un contour c, vous pouvez trouver les lignes de contour dans c.collections. Pour chaque ligne de contour, appelez get_paths et placez votre texte sur ce chemin.

L'autre option serait de remplacer le code pour le placement manuel (en matplotlib.contour.BlockingContourLabeler) ou de modifier le code qui trouve les positions d'étiquette (en matplotlib.contour.locate_label), mais les deux fonctions sont assez denses. Si vous pouvez trouver un remplacement à travailler pour locate_label remplacer simplement l'ancienne méthode dans votre traçage macro

def your_locate_label(self, linecontour, labelwidth): 
    # some magic 
    pass 

ar = np.array([[1,0], [0,1]] 
c = matplotlib.contour(ar) 
c.locate_label = your_locate_label 

c.clabel() 

BTW, si vous utilisez ipython, vous pouvez facilement voir la source de fonction de votre session interactive avec

%psource c.clabel 

ou directement invoquer votre $EDITOR sur le fichier ont été il est défini avec

%edit c.clabel 
+0

Je ne trouve pas cette question affichée, donc je fait une nouvelle: https://github.com/matplotlib/matplotlib/issues/613 – keflavich

9

Oui, maintenant est un moyen de contrôler les emplacements des étiquettes! https://github.com/matplotlib/matplotlib/pull/642

plt.figure() 
CS = plt.contour(X, Y, Z) 
manual_locations = [(-1, -1.4), (-0.62, -0.7), (-2, 0.5), (1.7, 1.2), (2.0, 1.4), (2.4, 1.7)] 
plt.clabel(CS, inline=1, fontsize=10, manual=manual_locations) 
+0

manuel peut être un objet itérable de x, y tuples. Les étiquettes de contour seront créées comme si vous cliquiez sur la souris à chaque position x, y. – Faber

+2

Y a-t-il un moyen d'autoriser l'étiquetage automatisé, puis de faire défiler les étiquettes pour supprimer (et peut-être améliorer) tout ce qui recoupe les axes? –