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)
DarkAnt
la source

Réponses:

557

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

plt.gca().invert_xaxis()

et / ou

plt.gca().invert_yaxis()
Demitri
la source
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.

Tim Whitcomb
la source
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.

DéplacéAustralie
la source
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.

charles.fox
la source
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()
ShikharDua
la source
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

Mortsde
la source
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

Farzad Vertigo
la source
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]))
Luis DG
la source
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.

Andy Turner
la source