Seaborn lineplot X轴显示1970年错误日期,如何修正为正确日期?
解决Seaborn Lineplot X轴日期显示错误的问题
问题原因
你的Date列大概率是字符串类型,而非Python的datetime类型。Seaborn会将字符串列视为分类变量,用0、1、2这类索引值绘制X轴,而mdates.DateFormatter会把这些索引值解析为Unix时间戳(从1970-01-01开始的秒数),因此出现了错误的1970年日期。
修复步骤
1. 转换Date列为datetime类型
在绘图前先处理数据类型:
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt import matplotlib.dates as mdates # 将字符串格式的Date列转为datetime类型 df['Date'] = pd.to_datetime(df['Date'])
2. 明确指定X轴与Y轴,绘制正确的线图
原代码未指定x参数,Seaborn默认用DataFrame索引作为X轴,需要明确传入x='Date',同时可以通过两种方式处理多Y轴数据:
方法一:转为长格式绘制(推荐,适配多列Y轴)
# 把宽格式数据转为长格式,方便Seaborn识别分类 df_melted = df.melt(id_vars='Date', value_vars=['A', 'B'], var_name='类别', value_name='数值') # 绘制线图 plot = sns.lineplot(data=df_melted, x='Date', y='数值', hue='类别') # 设置日期显示格式 format_ymd = mdates.DateFormatter('%Y-%m-%d') plot.xaxis.set_major_formatter(format_ymd) plt.xticks(rotation=45) plt.tight_layout() # 防止日期标签被截断 plt.show()
方法二:分别绘制两条线
# 单独绘制A、B两条线,共享同一轴 plot = sns.lineplot(data=df, x='Date', y='A', label='A') sns.lineplot(data=df, x='Date', y='B', label='B', ax=plot) # 设置日期显示格式 format_ymd = mdates.DateFormatter('%Y-%m-%d') plot.xaxis.set_major_formatter(format_ymd) plt.xticks(rotation=45) plt.tight_layout() plt.show()
3. 验证类型转换结果
可以打印数据类型确认转换是否成功:
print(df.dtypes)
正确输出应类似:
Date datetime64[ns] A float64 B float64 dtype: object
核心注意点
- 日期列必须是
datetime类型,而非字符串 - 绘图时必须明确指定
x='Date',让Seaborn识别X轴为日期数据 plt.tight_layout()可以避免旋转后的日期标签被图表边缘遮挡
内容的提问来源于stack exchange,提问作者Chendo
相关产品推荐
相关产品推荐

