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'])
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 usarpd.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áticamenteplot
como se desea conmatplotlib
: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 unmatplotlib
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