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

Posted

技术标签:

【中文标题】Python绘图强制按字母顺序而不是按时间顺序排序日期【英文标题】:Python plot forced sorting dates alphabetically instead of chronologically 【发布时间】:2021-03-27 16:22:01 【问题描述】:

我正在绘制我的数据集(英格兰和威尔士的死亡率与地区),X 轴上的日期按字母顺序排列。它将于 4 月 6 日、4 月 7 日、...、2 月 6 日、2 月 7 日、...、Sep-13、Sep-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'])

【问题讨论】:

在绘图之前将您的日期转换为日期时间类型。 您的日期可能实际上不是日期,而是字符串。此外,您应该融合您的数据并将生成的区域列作为您的“色调”传递给对lineplot 的单个调用 为什么不使用 Matplotlib?除非你强制它在幕后进行排序 如果您将日期输入ISO 8601 format,它们将正确排序。 【参考方案1】:

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

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

【讨论】:

谢谢你,通常我会使用色调,但我无法理解如何组织我的 CSV 以将区域作为标题。我目前已将日期作为行,将区域作为列,但没有区域标题。它看起来大致像这个日期,英格兰,东北,....威尔士一月 - 06, 300, 345, 654 二月 -06 .... 所以我所有的标题都是单独的区域 我看到 pandas.melt 为每个区域重复了 14 次日期。我最初确实考虑过这一点,但认为有一种更有效的方法,但我想不是,谢谢。【参考方案2】:

您也可以创建一个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 解决方案。

【讨论】:

以上是关于Python绘图强制按字母顺序而不是按时间顺序排序日期的主要内容,如果未能解决你的问题,请参考以下文章

使用插入排序算法按字母顺序排序 c#

按字母顺序排序时忽略变音符号

Python 如何对输出的词频结果按字母顺序排序(NLTK)

NSPredicate 在 CoreData 中按字母顺序获取记录

Python数据结构按字母顺序排序列表

表仅按字母顺序排序,不是数字排序[关闭]