Le déplacement matplotlib la légende en dehors de l'axe rend de coupure par la figure de la boîte de
Je suis familier avec les questions suivantes:
Matplotlib savefig avec une légende en dehors de la parcelle
Comment mettre de la légende de l'intrigue
Il semble que les réponses à ces questions ont le luxe de pouvoir jouer avec exactement le rétrécissement de l'axe de sorte que la légende s'adapte.
Rétrécissement de la axes, cependant, n'est pas une solution idéale car elle rend les données plus petits rendre effectivement plus difficile à interpréter; en particulier lorsque ses complexes et il y a beaucoup de choses qui se passent ... et donc d'avoir besoin d'une grande légende
L'exemple d'un complexe de légende dans la documentation montre la nécessité de ce parce que la légende dans leur complot en réalité complètement occulte plusieurs points de données.
http://matplotlib.sourceforge.net/users/legend_guide.html#legend-of-complex-plots
Ce que je voudrais être en mesure de faire est de s'étendre dynamiquement la taille de la boîte de dialogue figure pour accommoder l'expansion de la figure de légende.
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(-2*np.pi, 2*np.pi, 0.1)
fig = plt.figure(1)
ax = fig.add_subplot(111)
ax.plot(x, np.sin(x), label='Sine')
ax.plot(x, np.cos(x), label='Cosine')
ax.plot(x, np.arctan(x), label='Inverse tan')
lgd = ax.legend(loc=9, bbox_to_anchor=(0.5,0))
ax.grid('on')
Remarquez comment l'étiquette finale "Inverse tan" est en fait à l'extérieur de la boîte de dialogue figure (et semble mal de coupure - pas de publication de qualité!)
Enfin, j'ai dit que ce comportement est normal dans la R et en LaTeX, donc je suis un peu confus pourquoi est-ce si difficile en python... Est-il une raison historique? Est Matlab aussi pauvre sur ce sujet?
J'ai l' (seulement un peu) plus de la version de ce code sur pastebin http://pastebin.com/grVjc007
- Aussi loin que le pourquoi, c'est parce que matplotlib est orientée vers interactive des parcelles, tout en R, etc, ne le sont pas. (Et oui, Matlab est "faible" dans ce cas particulier.) Pour le faire correctement, vous avez besoin de s'inquiéter à propos de redimensionnement de la axes à chaque fois que la figure est redimensionnée, zoom, ou la légende de la position est mise à jour. (Concrètement, cela signifie vérifier à chaque fois l'intrigue est établi, ce qui conduit à des ralentissements.) Ggplot, etc, sont statiques, c'est pourquoi ils ont tendance à le faire par défaut, alors que matplotlib et matlab ne le font pas. Cela dit,
tight_layout()
doit être modifié pour prendre des légendes en compte. - Je suis également en train de discuter de cette question sur la matplotlib liste de diffusion des utilisateurs. J'ai donc les suggestions de réglage de la savefig ligne: fig.savefig('samplefigure', bbox_extra_artists=(lgd,), bbox='serré')
- Je sais matplotlib aime tout que tout est sous le contrôle de l'utilisateur, mais cette chose entière avec les légendes, c'est trop d'une bonne chose. Si je mets de la légende à l'extérieur, évidemment je veux qu'il reste encore visible. La fenêtre doit juste lui-même pour s'adapter au lieu de la création de cette énorme mise à l'échelle de tracas. À tout le moins, il devrait y avoir un Vrai défaut d'option pour le contrôle de cette mise à l'échelle automatique de comportement. En forçant les utilisateurs à passer par un nombre ridicule de re-rend pour essayer et obtenir les chiffres de l'échelle à droite dans le nom de contrôle accomplit le contraire.
Vous devez vous connecter pour publier un commentaire.
Désolé EMS, mais en fait je viens de recevoir une autre réponse de la matplotlib mailling liste (nos Remerciements à Benjamin de la Racine).
Le code, je suis à la recherche est le réglage de la savefig appel à:
C'est apparemment similaire à l'appel tight_layout, mais plutôt de vous permettre savefig à considérer artistes supplémentaires dans le calcul. Ce sont en fait à redimensionner la boîte de dialogue figure comme souhaité.
Ce produit:
[modifier] Le but de cette question était d'éviter complètement l'utilisation de l'arbitraire de coordonner les stages de texte arbitraire comme c'était le traditionnel solution à ces problèmes. Malgré cela, de nombreuses modifications ont récemment insisté sur la mise ces dans, souvent dans des voies qui ont conduit à la code de générer une erreur. J'ai maintenant résolu les problèmes et rangé l'arbitraire du texte pour montrer comment elles sont également examinées dans le bbox_extra_artists algorithme.
plt.show()
il. Un correctif pour que?ax.grid('on')
faire?plt.tight_layout(pad=7)
fig.legend()
méthode , vraiment bizarre.plt.savefig('x.png', bbox_inches='tight')
était suffisant. Merci pour le partage.Ajouté: j'ai trouvé quelque chose qui devrait faire l'affaire tout de suite, mais le reste du code ci-dessous offre également une alternative.
Utiliser le
subplots_adjust()
fonction pour déplacer le fond de l'intrigue secondaire jusqu':Puis de jouer avec le décalage dans la légende
bbox_to_anchor
partie de la légende de commande, pour obtenir la boîte de la légende où vous le souhaitez. Une combinaison de réglage de lafigsize
et à l'aide de lasubplots_adjust(bottom=...)
doit produire un tracé de la qualité pour vous.Alternative:
J'ai simplement changé la ligne:
à:
et changé
à
et cela se voit très bien sur mon écran (un 24 pouces moniteur à tube CATHODIQUE).
Ici
figsize=(M,N)
jeux la figure de la fenêtre à M pouces par N po. Il suffit de jouer avec jusqu'à ce qu'il semble bon pour vous. Convertir plus évolutif format de l'image et utiliser GIMP pour modifier, si nécessaire, ou tout simplement de culture avec le LaTeXviewport
option lorsque y compris les graphiques.Ici en est une autre, très solution manuelle. Vous pouvez définir la taille de l'axe et les rembourrages sont considérés en conséquence (y compris la légende et les graduations). J'espère que c'est de l'utiliser pour quelqu'un.
Exemple (axes de la taille sont les mêmes!):
Code:
plt.draw()
àax.figure.canvas.draw()
. Je ne sais pas pourquoi, mais avant ce changement, la légende de la taille n'était pas mis à jour.fig.set_size_inches(widthTot,heightTot)
àfig.set_size_inches(widthTot,heightTot, forward=True)
.