Eje Y inverso en PyPlot

266

Tengo un gráfico de diagrama de dispersión con un montón de coordenadas aleatorias x, y. Actualmente, el eje Y comienza en 0 y sube al valor máximo. Me gustaría que el eje Y comience en el valor máximo y suba a 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
fuente

Respuestas:

557

Hay una nueva API que hace esto aún más simple.

plt.gca().invert_xaxis()

y / o

plt.gca().invert_yaxis()
Demitri
fuente
49
Tenga en cuenta que debe establecer los límites del eje antes de invertir el eje; de ​​lo contrario, se volverá a invertir.
TheBigH
55

La respuesta de DisplacedAussie es correcta, pero generalmente un método más corto es solo para invertir el eje único en cuestión:

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

donde la gca()función devuelve la instancia actual de Axes y [::-1]revierte la lista.

Tim Whitcomb
fuente
3
Esa parece una mejor respuesta para mí. :)
DisplacedAussie
18

Utilice matplotlib.pyplot.axis ()

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

Entonces podría agregar algo como esto al final:

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

Aunque es posible que desee relleno en cada extremo para que los puntos extremos no se asienten en el borde.

DesplazadoAussie
fuente
Esto tiene una ventaja sobre las dos primeras respuestas, ya que corrige la orientación, no la voltea cada vez (lo cual es un problema si necesita llamarlo en un bucle).
Bas Swinckels
16

Si estás en ipython en pylabmodo, entonces

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

el show()se requiere para hacer que actualizar la cifra actual.

charles.fox
fuente
9

También podría usar la función expuesta por el objeto de ejes del diagrama de dispersión

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

Otro método similar a los descritos anteriormente es usar, plt.ylimpor ejemplo:

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

Este método funciona para mí cuando intento componer múltiples conjuntos de datos en Y1 y / o Y2

Mortsde
fuente
3

El uso de ylim () podría ser el mejor enfoque para su propósito:

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

resultará:ingrese la descripción de la imagen aquí

Farzad Vértigo
fuente
2

Alternativamente, puede usar la función matplotlib.pyplot.axis () , que le permite invertir cualquiera de los ejes del diagrama

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

O si prefiere invertir solo el eje X, entonces

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

De hecho, puede invertir ambos ejes:

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

Si usa matplotlib puede probar: matplotlib.pyplot.xlim(l, r) matplotlib.pyplot.ylim(b, t)

Estas dos líneas establecen los límites de los ejes x e y respectivamente. Para el eje x, el primer argumento l establece el valor más a la izquierda, y el segundo argumento r establece el valor más a la derecha. Para el eje y, el primer argumento b establece el valor más bajo, y el segundo argumento t establece el valor más alto.

Andy Turner
fuente