如何按升序对我的 X 轴进行按月排序?

3

我有一个数据框,其中索引是日期时间对象。 Image1 我创建了一个新列来指示数据框中每个“骑行”所在的月份:

import numpy as np
import datetime as dt
from datetime import datetime    
months = df.index.to_series().apply(lambda x:dt.datetime.strftime(x, '%b %Y')).tolist()
df['months'] = months
df1 = df[['distance','months']]

这将得到:

image2

当我尝试使用Seaborn将其绘制为折线图时,以月份作为x轴,它会按字母顺序排序,从四月开始,然后是八月等。
l = sns.lineplot(x='months',y='distance',data=df1)
plt.xticks(rotation=45)

image3

我不太明白为什么会这样,因为我使用的数据框中,月份已按照月份升序排序。有没有办法让我的x轴从Jan2018开始,以July2019结束?

你尝试过 l = sns.lineplot(x='months',y='distance',data=df1, sort=True) 吗? - Anna Nevison
是的,我试过了,但它不起作用。很奇怪,因为当我使用sns.countplot(x='months',data=df1) plt.xticks(rotation=45)时,使用完全相同的数据框,它会自动排序。 - Daichi
你已经将日期转换为字符串了,我猜测seaborn正在对它们进行排序。相反,保留日期格式,并将定位器设置为月份定位器,将格式化程序设置为日期格式化程序。https://matplotlib.org/3.1.1/gallery/text_labels_and_annotations/date.html可以帮助您朝着正确的方向前进。 - Jody Klymak
1个回答

4

x坐标必须是数字。 当您提供一个字符串数组时,Seaborn会自动按字母顺序排序。 您可以通过sort=False实现您想要的效果(默认值为True):

# True or omitted
sns.lineplot(x='month', y='distance', data=df1, sort=True)

Sort = True

# Set to False to keep the original order in your DataFrame
sns.lineplot(x='month', y='distance', data=df1, sort=False)

Sort = False


非常感谢!简直不敢相信我没想到那个! - Daichi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接