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é!)
Le déplacement matplotlib la légende en dehors de l'axe rend de coupure par la figure de la boîte de

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.
InformationsquelleAutor jbbiomed | 2012-04-11