You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何设置sns.lmplot()的x轴日期格式使其显示为日期而非整数

问题根源

  1. x轴显示为整数是因为聚合时直接将日期转为了整数类型,且你用的格式符存在错误:dt.strftime('%Y%M')里大写%M代表分钟,提取月份应该用小写%m,这个错误会导致你的聚合结果本身不符合月度统计的预期。
  2. sns.lmplot的拟合逻辑(尤其是你用到的lowess)要求x轴为数值类型,不能直接传入datetime类型作为x,所以需要保留数值型x用于拟合,再单独格式化x轴刻度为日期格式。

完整修正方案

步骤1:修正月度聚合代码

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

# 原始日期转datetime格式
df['date'] = pd.to_datetime(df['date'])
# 生成截断到月份的日期字段,用于后续刻度显示
df['date_month'] = df['date'].dt.to_period('M')
# 生成数值型x字段,用于lmplot拟合:格式为 年份*12 + 月份,保证数值连续
df['date_num'] = df['date_month'].dt.year * 12 + df['date_month'].dt.month

# 按月份、origin、group分组聚合均值
df = df.groupby(['date_month', 'origin', 'group'], as_index=False)['value'].mean()
# 把period类型转成datetime类型,方便后续格式化
df['date_month'] = df['date_month'].dt.to_timestamp()
# 补回数值型x字段
df['date_num'] = df['date_month'].dt.year * 12 + df['date_month'].dt.month

步骤2:绘图并格式化x轴刻度

# 绘图时x用数值型的date_num
sns.lmplot(data=df, x="date_num", y="value", hue="group",
           ci=None, truncate=False, scatter_kws={"s": 10}, lowess=True, height=6, aspect=1.25)
plt.title("Title.")
plt.ylabel("Value")

# 格式化x轴刻度
ax = plt.gca()
# 获取当前x轴的刻度位置
xticks = ax.get_xticks()
# 将数值型刻度转换为 年-月 格式的标签
xtick_labels = [pd.to_datetime(f"{int(x//12)}-{int(x%12)}-01").strftime("%Y-%m") for x in xticks]
ax.set_xticks(xticks)
ax.set_xticklabels(xtick_labels, rotation=45, ha='right')
# 自动调整布局避免标签被截断
plt.tight_layout()
plt.show()

报错原因说明

你之前调用plt.xticks(fake_dates)报错,是因为plt.xticks要求第一个参数传入刻度位置的数值列表,如果你直接传入了格式化对象(比如matplotlib.dates的FuncFormatter实例)就会触发类型错误。上述方案直接手动映射刻度值和日期标签,完全规避了这个问题。

内容的提问来源于stack exchange,提问作者Ivo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 12:45:04