Eje x invertido inesperadamente por pandas.plot (…)

El eje X se invirtió automática e inesperadamente al trazar una serie de datos contra otra serie de datos usando pandas. Por favor mira mi código a continuación. ¿Cómo puedo asegurar que el eje x siempre apunte hacia la derecha? ¿Es esta inversión automática del eje x un comportamiento intencionado de los pandas? ¿Se puede desactivar?

Déjame explicarte mi ejemplo a continuación. Se crean tres plots. Espero que cada una muestre una línea de casi 45 grados que sube a la derecha. Sin embargo, algunos de ellos tienen una línea de 45 grados que cae hacia la derecha porque su eje x se invierte automáticamente. Parece que si el eje x está invertido o no depende de los valores que se van a trazar.

import pandas as pd import numpy as np import matplotlib.pyplot as plt df2 = pd.DataFrame(np.random.randn(10, 3), columns=["a", "b", "c"]) df3 = df2*1.1 df3.rename(columns={"a": "a*1.1", "b": "b*1.1", "c": "c*1.1"}, inplace=True) df23 = df2.join(df3) fig, ax_list = plt.subplots(1,3) ax=ax_list[0] df23[["a", "a*1.1"]].plot(ax=ax, x="a") ax.axis('equal') ax.set_title("(x,y)=(a,a*1.1)") print ax.get_xlim() ## Added for clarity ax=ax_list[1] df23[["b", "b*1.1"]].plot(ax=ax, x="b") ax.axis('equal') ax.set_title("(x,y)=(b,b*1.1)") print ax.get_xlim() ## Added for clarity ax=ax_list[2] df23[["c", "c*1.1"]].plot(ax=ax, x="c") ax.axis('equal') ax.set_title("(x,y)=(c,c*1.1)") print ax.get_xlim() ## Added for clarity 

Parcela creada

Puede imponer una dirección para cada plot:

 (t,b)= ax.get_xlim() ## Added for clarity if t > b: ax.set_xlim((b,t)) 

o

 if ax.xaxis_inverted(): ax.invert_xaxis() 

(Sin embargo, este último solo hace la versión explícita de tres líneas).

Hice esta pregunta sobre el rastreador de problemas de los pandas y obtuve una respuesta.

daraframe.plot (..) está diseñado para que

  • La coordenada x de puntos se determina en función del índice (es decir, el número de fila) de la columna especificada por el parámetro x.
  • La coordenada y de puntos es el valor de la columna especificada por el parámetro y.

Para un diagtwig de dispersión, creo que el diseño anterior no es adecuado. La única solución que se me ocurre es usar plt.plot direclty.

La solución de cphlewis también es útil.