Python绘图强制按字母顺序而不是按时间顺序排序日期

Python绘图强制按字母顺序而不是按时间顺序排序日期,python,pandas,matplotlib,time-series,seaborn,Python,Pandas,Matplotlib,Time Series,Seaborn,我正在绘制我的数据集(英格兰和威尔士地区的死亡率),X轴上的日期按字母顺序排序。4月6日,4月7日,…,2月6日,2月7日,…,9月13日,9月14日 我希望它们按时间顺序排列(就像在我的数据集中一样),有没有办法关闭强制排序?我使用matplot lib和seaborn进行此绘图 另外,如果有人知道一种不用重复代码13次就能写出这段代码的方法,我很乐意听到 我的代码如下 plt.figure(figsize=(48,12)) sns.lineplot(data=Regional,x='Dat

我正在绘制我的数据集(英格兰和威尔士地区的死亡率),X轴上的日期按字母顺序排序。4月6日,4月7日,…,2月6日,2月7日,…,9月13日,9月14日

我希望它们按时间顺序排列(就像在我的数据集中一样),有没有办法关闭强制排序?我使用matplot lib和seaborn进行此绘图

另外,如果有人知道一种不用重复代码13次就能写出这段代码的方法,我很乐意听到

我的代码如下

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'])

如前所述,使用和日期时间格式可能会解决您的问题。您可以使用
pd.to_datetime
将日期转换为datetime格式。假设字符串为
'Jul-06'
格式,则可以指定格式为
'%b-%y'
。否则,您可以检查此项以查找正确的格式说明符

pd.melt
可以使用一行代码重新格式化数据帧以进行绘图。假设您的数据框只包含日期和地区的列,您可以使用以下代码将所有内容组合在一起:

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')

您也可以创建一个
pd.MultiIndex
来自动
plot
,而不是熔化,使用
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])

seaborn
方法(参见其他答案)更简洁,但这只是一个
matplotlib
解决方案。

在打印之前将日期转换为日期时间类型。日期可能不是实际日期,而是字符串。此外,您应该融化数据,并将结果区域列作为“色调”传递给对
lineplot
的单个调用,为什么不使用Matplotlib?在幕后不会进行排序,除非你强制它,如果你将日期放入其中,它们将正确排序。谢谢你,通常我会使用色调,但我无法理解如何组织我的CSV以将区域作为标题。目前,我将日期作为行,区域作为列,但区域没有标题。它看起来大致像这个日期,英格兰,东北,。。。。威尔士1月-06300345654年2月-06。。。。等等,所以我所有的标题都是独立的区域。我看到熊猫。每个区域重复14次日期。我最初确实考虑过这一点,但认为有一种更有效的方法,但我想没有,谢谢。