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.

Curious2learn
la source
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])
Hima
la source
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))

thetarro
la source
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)
Birat Bose
la source
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])
Reza Keshavarz
la source
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.

Antti A
la source
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.

Steven C. Howell
la source
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.

Eric O Lebigot
la source
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

aimé.par.Jésus
la source
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.

Rainald62
la source