2017-08-14 3 views
1

Selon le documentation, ax.autoscale(tight=True) devraitaxe matplotlib ('serré') ne fonctionne pas?

Si cela est vrai, vue fixer des limites aux limites de données;

Avec ax.axis('tight') étant similaire:

'serré'           Les limites fixées de telle sorte que toutes les données sont affichées

(sic)

Et nous voyons même que cela fonctionne dans les captures d'écran de this question. Mais peu importe ce que j'essaie, il ne semble pas fonctionner avec l'exemple simple suivant. Voici ce que je tapais dans jupyter-qtconsole:

In [27]: f, ax = plt.subplots(1) 

In [28]: ax.plot([0, 1], [1, 0]) 
Out[28]: [<matplotlib.lines.Line2D at 0x825abf0>] 

In [29]: ax.axis('tight') 
Out[29]: (-0.050000000000000003, 1.05, -0.050000000000000003, 1.05) 

In [30]: ax.autoscale(tight=True) 

In [31]: plt.axis('tight') 
Out[31]: (-0.050000000000000003, 1.05, -0.050000000000000003, 1.05) 

In [32]: plt.autoscale(tight=True) 

In [33]: ax.plot([0, 1], [1, 0]) 
Out[33]: [<matplotlib.lines.Line2D at 0x825a4d0>] 

In [34]: ax.autoscale(enable=True, axis='x', tight=True) 

Tout au long de ces commandes, les limites de l'intrigue ne changent pas:

margins visible

Qu'est-ce que je pourrais faire mal?

Répondre

1

Vous ne faites pas nécessairement quelque chose de mal. Vous utilisez matplotlib version 2 (ou supérieure). Dans cette version, la disposition de tracé par défaut a été modifiée de telle sorte que l'axe ait ajouté un remplissage de 5% à chaque extrémité. Voici un lien décrivant la mise en page du terrain: https://matplotlib.org/users/dflt_style_changes.html#plot-layout

À partir du lien, pour le faire revenir au style « classique », utilisez:

mpl.rcParams['axes.autolimit_mode'] = 'round_numbers' 
mpl.rcParams['axes.xmargin'] = 0 
mpl.rcParams['axes.ymargin'] = 0 
+0

Cela fonctionne. J'ai quitté 'mpl.rcParams ['axes.autolimit_mode']' à sa valeur par défaut de ''data'', qui correspond au cadre aux limites des données, plutôt qu'au prochain tick (c'est-à-dire' 'round_numbers' '). En outre, je dirais que cela va un peu à l'encontre du bon sens que demander spécifiquement 'axis ('tight')' ne réduit pas ces marges, ce qui [semble possible sur une base par plot] (https: //stackoverflow.com/a/41748745/1143274).

1

En définissant la autoscale vous devriez voir la différence souhaitée entre tight=True et tight=False.

f, (ax, ax2) = plt.subplots(ncols=2) 

ax.plot([0, 1], [1, 0], label="tight=True") 
ax.autoscale(enable=True, axis='both', tight=True) 

ax2.plot([0, 1], [1, 0], label="tight=False") 
ax2.autoscale(enable=True, axis='both', tight=False) 

ax.legend() 
ax2.legend() 

enter image description here

Vous peut noter que ax.axis("tight") n'est pas lié; il ne dit dans la documentation

limites « serré » mis en sorte que toutes les données sont montré

qui est effectivement le cas, toutes les données sont affichées (il ne dit rien sur la définition du voir les limites à exactement les données).

+0

Maintenant que c'est intéressant, parce que quand je copypaste ce code, je reçois deux parcelles qui ressemblent toutes deux à votre intrigue de droite.Et pourtant, à partir de la couleur de la ligne, je déduis que vous utilisez aussi Matplotlib 2+ (sauf si vous avez changé la couleur de Matplotlib 1.3?) Quelle est votre valeur de 'matplotlib.rcParams ['axes.xmargin']' ? –

+1

J'utilise matplotlib 2.0.2 et la marge est la valeur par défaut 'print matplotlib.rcParams ['axes.xmargin'] # donne 0,05'. – ImportanceOfBeingErnest

+0

Cela résout! Je n'ai pas mis à jour les bibliothèques Python depuis mars; 'matplotlib .__ version__' est' '2.0.0b3''. Il doit avoir été réparé depuis lors. –