Inverser l'axe Y dans PyPlot


266

J'ai un graphique en nuage de points avec un tas de coordonnées aléatoires x, y. Actuellement, l'axe Y commence à 0 et monte à la valeur maximale. J'aimerais que l'axe Y commence à la valeur maximale et monte à 0.

points = [(10,5), (5,11), (24,13), (7,8)]    
x_arr = []
y_arr = []
for x,y in points:
    x_arr.append(x)
    y_arr.append(y)
plt.scatter(x_arr,y_arr)

Réponses:


557

Il existe une nouvelle API qui rend cela encore plus simple.

plt.gca().invert_xaxis()

et / ou

plt.gca().invert_yaxis()

49
N'oubliez pas que vous devez définir les limites de l'axe avant d'inverser l'axe, sinon il le réinvertira.
— TheBigH

55

La réponse de DisplacedAussie est correcte, mais généralement une méthode plus courte consiste simplement à inverser le seul axe en question:

plt.scatter(x_arr, y_arr)
ax = plt.gca()
ax.set_ylim(ax.get_ylim()[::-1])

où la gca()fonction renvoie l'instance Axes actuelle et [::-1]inverse la liste.


3
Cela me semble être une meilleure réponse. :)
— DisplacedAussie

18

Utilisez matplotlib.pyplot.axis ()

axis([xmin, xmax, ymin, ymax])

Vous pouvez donc ajouter quelque chose comme ceci à la fin:

plt.axis([min(x_arr), max(x_arr), max(y_arr), 0])

Bien que vous souhaitiez peut-être un rembourrage à chaque extrémité afin que les points extrêmes ne se trouvent pas sur la bordure.


Cela a un avantage sur les deux premières réponses, car cela corrige l'orientation, pas de la retourner à chaque fois (ce qui est un problème si vous devez l'appeler en boucle).
— Bas Swinckels

16

Si vous êtes en pylabmode ipython , alors

plt.gca().invert_yaxis()
show()

l' show()est tenu de le faire mettre à jour le chiffre actuel.


9

Vous pouvez également utiliser la fonction exposée par l'objet axes du nuage de points

scatter = plt.scatter(x, y)
ax = scatter.axes
ax.invert_xaxis()
ax.invert_yaxis()

8

Une autre méthode similaire à celles décrites ci-dessus consiste à utiliser plt.ylimpar exemple:

plt.ylim(max(y_array), min(y_array))

Cette méthode fonctionne pour moi lorsque j'essaie de composer plusieurs ensembles de données sur Y1 et / ou Y2


3

utiliser ylim () peut être la meilleure approche pour votre objectif:

xValues = list(range(10))
quads = [x** 2 for x in xValues]
plt.ylim(max(quads), 0)
plt.plot(xValues, quads)

résultera:entrez la description de l'image ici


2

Vous pouvez également utiliser la fonction matplotlib.pyplot.axis () , qui vous permet d'inverser l'un des axes du tracé

ax = matplotlib.pyplot.axis()
matplotlib.pyplot.axis((ax[0],ax[1],ax[3],ax[2]))

Ou si vous préférez inverser uniquement l'axe X, alors

matplotlib.pyplot.axis((ax[1],ax[0],ax[2],ax[3]))

En effet, vous pouvez inverser les deux axes:

matplotlib.pyplot.axis((ax[1],ax[0],ax[3],ax[2]))

0

Si vous utilisez matplotlib, vous pouvez essayer: matplotlib.pyplot.xlim(l, r) matplotlib.pyplot.ylim(b, t)

Ces deux lignes fixent respectivement les limites des axes x et y. Pour l'axe des x, le premier argument l définit la valeur la plus à gauche et le deuxième argument r la valeur la plus à droite. Pour l'axe des y, le premier argument b définit la valeur la plus basse et le deuxième argument t définit la valeur la plus élevée.

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.