Je connais les questions suivantes:
Matplotlib savefig avec une légende en dehors de l'intrigue
Comment sortir la légende de l'intrigue
Il semble que les réponses à ces questions aient le luxe de pouvoir jouer avec le rétrécissement exact de l'axe pour que la légende rentre.
Réduire les axes, cependant, n'est pas une solution idéale car il rend les données plus petites, ce qui les rend en fait plus difficiles à interpréter; surtout quand c'est complexe et qu'il y a beaucoup de choses qui se passent ... donc besoin d'une grande légende
L'exemple d'une légende complexe dans la documentation en démontre la nécessité car la légende de leur tracé masque en réalité complètement plusieurs points de données.
http://matplotlib.sourceforge.net/users/legend_guide.html#legend-of-complex-plots
Ce que j'aimerais pouvoir faire, c'est agrandir dynamiquement la taille de la boîte de figurine pour accueillir la légende de la figure en expansion.
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 en dehors de la boîte à chiffres (et semble mal coupée - pas la qualité de la publication!)
Enfin, on m'a dit que c'est un comportement normal dans R et LaTeX, donc je suis un peu confus pourquoi c'est si difficile en python ... Y a-t-il une raison historique? Matlab est-il également pauvre à ce sujet?
J'ai la version (seulement légèrement) plus longue de ce code sur pastebin http://pastebin.com/grVjc007
la source
tight_layout()
il faudrait le modifier pour tenir compte des légendes.Réponses:
Désolé EMS, mais je viens de recevoir une autre réponse de la liste de distribution de matplotlib (merci à Benjamin Root).
Le code que je recherche ajuste l'appel savefig à:
Ceci est apparemment similaire à l'appel de tight_layout, mais à la place, vous autorisez savefig à prendre en compte des artistes supplémentaires dans le calcul. Cela a en fait redimensionné la boîte de chiffres comme souhaité.
Cela produit:
[modifier] Le but de cette question était d'éviter complètement l'utilisation de placements de coordonnées arbitraires de texte arbitraire comme c'était la solution traditionnelle à ces problèmes. Malgré cela, de nombreuses modifications ont récemment insisté pour les insérer, souvent de manière à ce que le code génère une erreur. J'ai maintenant corrigé les problèmes et rangé le texte arbitraire pour montrer comment ceux-ci sont également pris en compte dans l'algorithme bbox_extra_artists.
la source
plt.show()
. Une solution pour ça?fig.legend()
méthode , vraiment bizarre.Ajouté: J'ai trouvé quelque chose qui devrait faire l'affaire immédiatement, mais le reste du code ci-dessous propose également une alternative.
Utilisez la
subplots_adjust()
fonction pour déplacer le bas de la sous-intrigue vers le haut:Jouez ensuite avec le décalage dans la
bbox_to_anchor
partie légende de la commande légende, pour obtenir la boîte de légende où vous le souhaitez. Une combinaison de la définitionfigsize
et de l'utilisation desubplots_adjust(bottom=...)
devrait produire un tracé de qualité pour vous.Alternative: j'ai simplement changé de ligne:
à:
et changé
à
et il apparaît très bien sur mon écran (un moniteur CRT de 24 pouces).
Ici
figsize=(M,N)
, la fenêtre de la figure doit être M pouces par N pouces. Jouez avec ceci jusqu'à ce qu'il vous convienne. Convertissez-le en un format d'image plus évolutif et utilisez GIMP pour le modifier si nécessaire, ou recadrez simplement avec l'viewport
option LaTeX lorsque vous incluez des graphiques.la source
Voici une autre solution très 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 utile à quelqu'un.
Exemple (la taille des axes est la même!):
Code:
la source
plt.draw()
enax.figure.canvas.draw()
. Je ne sais pas pourquoi, mais avant ce changement, la taille de la légende n'était pas mise à jour.fig.set_size_inches(widthTot,heightTot)
àfig.set_size_inches(widthTot,heightTot, forward=True)
.