Python plot forzada clasificación fechas alfabéticamente en lugar de cronológicamente

Estoy trazando mi conjunto de datos (Mortality in England and Wales against region) y las fechas del eje X siguen clasificando alfabéticamente. Va el 06 de abril, 07 de abril,..., 06 de febrero, 07 de febrero..., 13 de septiembre, 14 de septiembre.

Quiero que estén en orden cronológico (como en mi conjunto de datos) ¿Hay alguna manera de apagar la clasificación forzada? Estoy usando mateplot lib y marino para esta trama.

También si alguien sabe una manera de escribir este código sin repetir el código 13 veces estaría feliz de escucharlo.

Mi código es el siguiente

plt.figure(figsize=(48,12))

sns.lineplot(data=Regional,x='Date',y='England and Wales')
sns.lineplot(data=Regional,x='Date',y='England')
sns.lineplot(data=Regional,x='Date',y='North East')
sns.lineplot(data=Regional,x='Date',y='North West')
sns.lineplot(data=Regional,x='Date',y='Yorkshire and the Humber')
sns.lineplot(data=Regional,x='Date',y='East Midlands')
sns.lineplot(data=Regional,x='Date',y='West Midlands')
sns.lineplot(data=Regional,x='Date',y='East of England')
sns.lineplot(data=Regional,x='Date',y='Greater London')
sns.lineplot(data=Regional,x='Date',y='South East')
sns.lineplot(data=Regional,x='Date',y='South West')
sns.lineplot(data=Regional,x='Date',y='Wales')
sns.lineplot(data=Regional,x='Date',y='Non Residents')

plt.legend(['England and Wales','England','North East','North West','Yorkshire and the Humber','East Midlands','West Midlands','East of England','Greater London','South East','South West','Wales','Non Residents'])

Plot

Pregunta hecha hace 3 años, 4 meses, 29 días - Por debugdynamo


4 Respuestas:

  • Como se mencionó, utilizando pd.melt y el formato de fecha probablemente resolverá sus problemas. Puedes usar pd.to_datetime para convertir tus fechas en formato datetime. Suponiendo que tus cuerdas estén 'Jul-06' formato, puede especificar su formato es '%b-%y'. Si no, puedes comprobarlo. Cuadro para el especificador de formato correcto.

    pd.melt puede reformar su dataframe para trazar usando una sola línea de código. Asumiendo que su dataframe contiene columnas sólo para la fecha y regiones, puede utilizar el siguiente código para reunir todo:

    Regional['Date'] = pd.to_datetime(Regional['Date'], format='%b-%y')
    Regional = pd.melt(Regional, id_vars=['Date'], var_name='Region', value_name='Mortality')
    sns.lineplot(data=Regional, x='Date', y='Mortality', hue='Region')
    

    Respondida el Dec 17, 2020 a las 00:13 - por quantumcoder

    Votos positivos: 0 | Votos negativos: 0

  • En lugar de fundirse también puede crear un pd.MultiIndex a automáticamente plot como se desea con matplotlib:

    Regional['Date'] = pd.to_datetime(Regional['Date'])
    Regional = Regional.set_index('Date')
    Regional.columns = pd.MultiIndex.from_tuples([('Region', col) for col in Regional.columns])
    Regional.plot(ax=ax, title='Daily Mortality Rate by Region', ylabel='Mortality')
    plt.legend(title='Regions', labels=[col[1] for col in Regional.columns])
    

    El seaborn (Ver otra respuesta) es un poco más limpio, pero esto es sólo un matplotlib solución.

    Respondida el Dec 17, 2020 a las 00:19 - por algorithmwhiz

    Votos positivos: 0 | Votos negativos: 0

  • Para resolver tu problema, puedes convertir la columna de fechas en el tipo de dato datetime y luego ordenar tu DataFrame por esa columna antes de trazar el gráfico. Esto garantizará que las fechas se muestren en orden cronológico en el eje X.

    También puedes reducir la repetición de código utilizando un bucle para generar los gráficos y las etiquetas automáticamente. Aquí te dejo una forma de hacerlo:

    python
    import matplotlib.pyplot as plt
    import seaborn as sns
    import pandas as pd
    
    

    Convertir la columna de fechas al tipo datetime

    Regional['Date'] = pd.to_datetime(Regional['Date'])

    Ordenar el DataFrame por la columna de fechas

    Regional = Regional.sort_values('Date') plt.figure(figsize=(48, 12)) regiones = ['England and Wales', 'England', 'North East', 'North West', 'Yorkshire and the Humber', 'East Midlands', 'West Midlands', 'East of England', 'Greater London', 'South East', 'South West', 'Wales', 'Non Residents']

    Tramar cada región en un bucle

    for region in regiones: sns.lineplot(data=Regional, x='Date', y=region) plt.legend(regiones) plt.show()

    Con este código, las fechas se mostrarán en orden cronológico en el eje X y evitarás la repetición de código para trazar cada región por separado. Espero que esto te ayude a resolver tu problema.

    Respondida el Dec 18, 2020 a las 00:13 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Desactivación de la clasificación forzada

    Para forzar la clasificación cronológica de las fechas del eje X, debes desactivar la clasificación forzada de Matplotlib. Esto se puede lograr agregando el siguiente código antes de trazar:

    python
    plt.gca().xaxis.set_major_locator(matplotlib.dates.AutoDateLocator())
    plt.gca().xaxis.set_major_formatter(matplotlib.dates.AutoDateFormatter())
    

    Eliminación de la repetición de código

    Para eliminar la repetición de código, puedes utilizar un bucle para trazar cada región:

    python
    regions = ['England and Wales', 'England', 'North East', 'North West', 'Yorkshire and the Humber', 'East Midlands', 'West Midlands', 'East of England', 'Greater London', 'South East', 'South West', 'Wales', 'Non Residents']
    
    for region in regions:
        sns.lineplot(data=Regional, x='Date', y=region)
    

    Código completo

    El código completo modificado sería:

    python
    import matplotlib.pyplot as plt
    import seaborn as sns
    
    plt.figure(figsize=(48,12))
    
    plt.gca().xaxis.set_major_locator(matplotlib.dates.AutoDateLocator())
    plt.gca().xaxis.set_major_formatter(matplotlib.dates.AutoDateFormatter())
    
    regions = ['England and Wales', 'England', 'North East', 'North West', 'Yorkshire and the Humber', 'East Midlands', 'West Midlands', 'East of England', 'Greater London', 'South East', 'South West', 'Wales', 'Non Residents']
    
    for region in regions:
        sns.lineplot(data=Regional, x='Date', y=region)
    
    plt.legend(regions)
    

    Respondida el Dec 18, 2020 a las 00:13 - por Gemini

    Votos positivos: 0 | Votos negativos: 0