définition de la limite de l'axe y dans matplotlib


418

J'ai besoin d'aide pour définir les limites de l'axe y sur matplotlib. Voici le code que j'ai essayé, sans succès.

import matplotlib.pyplot as plt

plt.figure(1, figsize = (8.5,11))
plt.suptitle('plot title')
ax = []
aPlot = plt.subplot(321, axisbg = 'w', title = "Year 1")
ax.append(aPlot)
plt.plot(paramValues,plotDataPrice[0], color = '#340B8C', 
     marker = 'o', ms = 5, mfc = '#EB1717')
plt.xticks(paramValues)
plt.ylabel('Average Price')
plt.xlabel('Mark-up')
plt.grid(True)
plt.ylim((25,250))

Avec les données que j'ai pour ce graphique, j'obtiens des limites d'axe y de 20 et 200. Cependant, je veux les limites 20 et 250.


1
Fonctionne pour moi avec Matplotlib 1.0.0 si j'ajoute plt.show()à la fin pour montrer l'intrigue. Quelle version et quel backend utilisez-vous?
Tamás

14
Travailler pour moi avec Matplotlib 0.98.5.2, Python 2.6.2. J'ai essayé les deux plt.ylim((25,250))et plt.ylim(ymax = 250, ymin = 25). J'utilise le Aggbackend.
Manoj Govindan

1
Merci à vous deux. Cela fonctionne-t-il avec le backend PDF pour vous?
Curious2learn

1
note: axisbgest désormais obsolète
SherylHohman

Réponses:


616

Essaye ça . Fonctionne également pour les sous-parcelles.

axes = plt.gca()
axes.set_xlim([xmin,xmax])
axes.set_ylim([ymin,ymax])

201
BTW, ceci est un moyen d'abréviation bête « g et le c dusyst un xes ».
Lenar Hoyt

33
vous pouvez également définir une valeur Nonequi laisse le calcul à matplotlib, par exempleaxes.set_ylim([ymin,None])
linqu

129

Votre code fonctionne aussi pour moi. Cependant, une autre solution de contournement peut être d'obtenir l'axe du tracé, puis de modifier uniquement les valeurs y:

x1,x2,y1,y2 = plt.axis()
plt.axis((x1,x2,25,250))


1
Vous pouvez simplement définir x1 et x2 Aucun.
Hielke Walinga

78

Une chose que vous pouvez faire est de définir vous-même la plage de votre axe en utilisant matplotlib.pyplot.axis.

matplotlib.pyplot.axis

from matplotlib import pyplot as plt
plt.axis([0, 10, 0, 20])

0,10 est pour la plage de l'axe x. 0,20 est pour la plage de l'axe y.

ou vous pouvez également utiliser matplotlib.pyplot.xlim ou matplotlib.pyplot.ylim

matplotlib.pyplot.ylim

plt.ylim(-2, 2)
plt.xlim(0,10)

24

Vous pouvez instancier un objet à partir de matplotlib.pyplot.axeset l'appeler set_ylim()dessus. Ce serait quelque chose comme ceci:

import matplotlib.pyplot as plt
axes = plt.axes()
axes.set_ylim([0, 1])

16

Cela fonctionnait au moins dans la version 2.2.2 de matplotlib:

plt.axis([None, None, 0, 100])

C'est probablement une bonne façon de configurer par exemple xmin et ymax uniquement, etc.


14

Pour ajouter à la réponse de @ Hima, si vous souhaitez modifier une limite x ou y actuelle, vous pouvez utiliser ce qui suit.

import numpy as np # you probably alredy do this so no extra overhead
fig, axes = plt.subplot()
axes.plot(data[:,0], data[:,1])
xlim = axes.get_xlim()
# example of how to zoomout by a factor of 0.1
factor = 0.1 
new_xlim = (xlim[0] + xlim[1])/2 + np.array((-0.5, 0.5)) * (xlim[1] - xlim[0]) * (1 + factor) 
axes.set_xlim(new_xlim)

Je trouve cela particulièrement utile lorsque je souhaite effectuer un zoom arrière ou un zoom avant juste à partir des paramètres de tracé par défaut.


7

Cela devrait fonctionner. Votre code fonctionne pour moi, comme pour Tamás et Manoj Govindan. Il semble que vous puissiez essayer de mettre à jour Matplotlib. Si vous ne pouvez pas mettre à jour Matplotlib (par exemple si vous n'avez pas les droits administratifs suffisants), peut-être que l'utilisation d'un backend différent avec matplotlib.use()pourrait aider.


Merci d'avoir vérifié! J'utilise le backend pdf ( matplotlib.use('PDF')). J'utilise la version fournie avec la dernière version de la distribution Enthought Python. Pouvez-vous s'il vous plaît voir si cela fonctionne avec le backend PDF. Merci!
Curious2learn

Il fonctionne avec le backend PDF, sur Mac OS X. Êtes-vous sûr que le fichier de sortie est bien mis à jour avec plt.savefig()?
Eric O Lebigot

J'ai réalisé le problème, je pense. Si je sors aPlot =dans la plt.subplotligne, ça marche aussi pour moi. Il semble que si l'on attribue le sous-tracé à une variable comme celle-ci, une autre méthode de définition des limites des axes doit être utilisée. Est-ce vrai?
Curious2learn

1
Pour autant que je sache, plt.ylim()applique les limites aux axes actuels, qui sont définis lorsque vous le faites plt.subplot(). Je ne peux pas non plus croire que je me plt.subplot()soucie de la façon dont les axes qu'il renvoie sont utilisés (mis dans une variable ou non, etc.). Je dirais donc que cela devrait fonctionner; cela fonctionne sur ma machine.
Eric O Lebigot

6

Juste pour un réglage fin. Si vous souhaitez définir une seule des limites de l'axe et laisser l'autre limite inchangée, vous pouvez choisir une ou plusieurs des instructions suivantes

plt.xlim(right=xmax) #xmax is your value
plt.xlim(left=xmin) #xmin is your value
plt.ylim(top=ymax) #ymax is your value
plt.ylim(bottom=ymin) #ymin is your value

Jetez un œil à la documentation de xlim et de ylim


0

Si un axe (généré par un code sous le code affiché dans la question) partage la plage avec les premiers axes, assurez-vous de définir la plage après le dernier tracé de ces axes.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.