2017-09-13 4 views
0

que je fais un tas de travail avec différentes parcelles de projection sphériques utilisant le paquet Astropy WCS, et se sont heurtées à certaines frustrations concernant les lignes de la grille. Comme les lignes de la grille ne se croisent pas toujours avec la boîte de délimitation de l'image ou l'intersection multiple au même endroit, elles peuvent ne pas être étiquetées ou avoir leurs étiquettes rendues illisibles. Je voudrais être capable d'insérer des étiquettes de ligne de grille dans chaque ligne, un peu semblable à la fonction matplotlib.pyplot.clabel() appliquée aux tracés de contour, comme dans ce matplotlib example. Je ne peux pas intégrer l'image car je suis un nouvel utilisateur; mes excuses. Je sais que je peux placer des étiquettes en utilisant text(), figtext(), ou annotate(), mais puisque clabel() fonctionne, je pense que la fonctionnalité existe déjà, même si elle n'a pas été appliquée aux lignes de la grille. Du point de vue de la mise en plan des projections, est-ce que quelqu'un sait comment les étiquettes de ligne de grille en ligne ressemblant à clabel() peuvent être appliquées aux lignes de la grille sur un tracé rectangulaire simple?Matplotlib: Les étiquettes sur les lignes de la grille de tracé de projection similaire à clabel()

+0

'clabel (cs, ** kwargs)' ajoute des étiquettes à la ligne des contours dans 'cs', où' cs' est un objet ContourSet renvoyé par 'contour'. Vous avez donc deux options: ** (a) ** Utilisez un tracé de contour pour tracer le quadrillage, puis utilisez clabel pour étiqueter les lignes ** (b) ** utilisez un quadrillage normal et écrivez votre fonction personnalisée pour les étiqueter. Lequel voulez-vous aider avec? – ImportanceOfBeingErnest

+0

btw, les nouveaux utilisateurs sont autorisés à poster des images, ceux-ci apparaîtront alors comme des liens au lieu de en ligne. – ImportanceOfBeingErnest

+0

@ImportanceOfBeingErnest Je ne pouvais pas inclure plus de deux liens, ou j'aurais inclus quelques images. Je n'avais pas pensé à l'option ** (a) **; J'aime l'idée, mais j'ai l'impression qu'il serait difficile à mettre en œuvre de manière à travailler pour de nombreuses parcelles différentes sans une mise à niveau gratuite. Ainsi, je voudrais aller avec ** (b) **; J'espère trouver une manière astucieuse de copier la fonctionnalité de clabel() et ne pas écrire une fonction d'étiquetage de grille personnalisée à partir de zéro. –

Répondre

0

Pour annoter les quadrillages, vous pouvez utiliser les positions des principales tiques (comme ce sont les positions auxquelles les quadrillages sont créés).

import matplotlib.pyplot as plt 
import numpy as np 

x = np.linspace(0,10) 
y = np.sin(x)*10 

fig, ax = plt.subplots() 
ax.plot(x,y) 
ax.grid() 

for xi in ax.xaxis.get_majorticklocs(): 
    ax.text(xi,0.8, "{:.2f}".format(xi), clip_on=True, ha="center", 
      transform=ax.get_xaxis_transform(), rotation=90, 
      bbox={'facecolor':'w', 'pad':1, "edgecolor":"None"}) 
for yi in ax.yaxis.get_majorticklocs(): 
    ax.text(0.86,yi, "{:.2f}".format(yi), clip_on=True, va="center", 
      transform=ax.get_yaxis_transform(), 
      bbox={'facecolor':'w', 'pad':1, "edgecolor":"None"}) 

plt.show() 

enter image description here

+0

Merci, ça aide beaucoup! Ce n'est pas tout à fait optimal, car chaque parcelle doit être codée en dur (pour éviter de masquer autant que possible les données, etc.), mais c'est un pas dans la bonne direction. J'ai l'impression qu'un tas de code pourrait être tiré de clabel() et appliqué aux lignes de la grille par opposition aux lignes de contour, mais je ne suis pas assez compétent avec matplotlib pour savoir comment faire cela. –

+0

Vous pouvez toujours rendre les choses plus compliquées qu'elles ne devraient l'être. Le [ 'code ContourLabeler'] (https://github.com/matplotlib/matplotlib/blob/e66b5d86743e11323d2bbc1b6eb2117d2ef535a3/lib/matplotlib/contour.py#L57) est de 500 lignes de long et destiné à être utilisé avec' ContourSet's. Pour l'utiliser, les lignes de la grille doivent également être un ContourSet. Mais il n'y a essentiellement aucun gain de cela par rapport au code de 4 lignes de la réponse ci-dessus. – ImportanceOfBeingErnest