Alterar xticks matplotlib

Tengo un diagtwig de dispersión que tiene tiempo en el x-axis

 import pandas as pd import matplotlib.pyplot as plt from matplotlib import ticker d = ({ 'A' : ['08:00:00','08:10:00','08:12:00','08:26:00','08:29:00','08:31:00','10:10:00','10:25:00','10:29:00','10:31:00'], 'B' : ['1','1','1','2','2','2','7','7','7','7'], 'C' : ['X','Y','Z','X','Y','Z','A','X','Y','Z'], }) df = pd.DataFrame(data=d) fig,ax = plt.subplots() x = df['A'] y = df['B'] x_numbers = (pd.to_timedelta(df['A']).dt.total_seconds()) plt.scatter(x_numbers, y) plt.show() 

Salida 1: introduzca la descripción de la imagen aquí

Quería intercambiar el total de segundos por marcas de tiempo reales, así que incluí:

 plt.xticks(x_numbers, x) 

Esto da como resultado que las marcas X se superpongan entre sí.

Si uso:

     plt.locator_params(axis='x', nbins=10) 

    Los resultados son los mismos que los anteriores. Si cambio los nbins a algo más pequeño, las nbins no se superponen, pero no se alinean con sus respectivos puntos de dispersión. Como en los puntos de dispersión, no se alinean con la marca de tiempo correcta.

    Si uso:

     M = 10 xticks = ticker.MaxNLocator(M) ax.xaxis.set_major_locator(xticks) 

    Las ticks no se superponen, pero no se alinean con sus respectivos puntos de dispersión.

    ¿Es posible elegir el número de x-ticks que utiliza pero aún está alineado con el punto de datos respectivo?

    Por ejemplo, para la siguiente figure . ¿Puedo simplemente usar n número de ticks lugar de todos?

    Salida 2:

    introduzca la descripción de la imagen aquí

    Vamos a utilizar algunas manipulaciones xticklabel:

     d = ({ 'A' : ['08:00:00','08:10:00','08:12:00','08:26:00','08:29:00','08:31:00','10:10:00','10:25:00','10:29:00','10:31:00'], 'B' : ['1','1','1','2','2','2','7','7','7','7'], 'C' : ['X','Y','Z','X','Y','Z','A','X','Y','Z'], }) df = pd.DataFrame(data=d) fig,ax = plt.subplots() x = df['A'] y = df['B'] x_numbers = (pd.to_timedelta(df['A']).dt.total_seconds()) plt.scatter(x_numbers, y) loc, labels = plt.xticks() newlabels = [str(pd.Timedelta(str(i)+ ' seconds')).split()[2] for i in loc] plt.xticks(loc, newlabels) plt.show() 

    Salida: introduzca la descripción de la imagen aquí

    En primer lugar, el intervalo de tiempo no es consistente. En segundo lugar, es una serie de alta frecuencia.

    En un caso general, no se le pedirá que coincida con los xticks correspondientes a cada entrada. Y, en esos escenarios, puede explotar algo como plt.plot_date(x, y) junto con locators y formatters DayLocator() , DayLocator() y DateFormatter('%Y-%m-%d') .

    Aunque para este caso muy específico donde los datos están a nivel de minutos y pocos puntos están realmente cerca, el truco puede ser intentar jugar con la serie numérica que está utilizando para el eje x, x_numbers . Para boost la brecha entre dos puntos, probé con cumsum() y para eliminar la superposición hasta cierto punto, le di algo de rotation a xticks .

     fig, ax = plt.subplots(figsize=(10,6)) x = df['A'] y = df['B'] x_numbers = (pd.to_timedelta(df['A']).dt.total_seconds()).cumsum() plt.scatter(x_numbers, y) plt.xticks(x_numbers, x, rotation=50) plt.show() 

    introduzca la descripción de la imagen aquí