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
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
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)
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
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? –
Je ne trouve pas cette question affichée, donc je fait une nouvelle: https://github.com/matplotlib/matplotlib/issues/613 – keflavich