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

如何用Pandas和Seaborn绘制x轴为月份、每年为单独折线的图表

问题原因

之前的Seaborn代码仅生成单条折线,是因为没有指定分组字段,Seaborn默认会将相同x值对应的y值做聚合后展示。而Pandas绘图无法完整展示月份标签,是因为未指定xticks的展示规则,且月份未按自然顺序排序。

解决步骤

步骤1:修正月份排序

原数据中的月份为字符串格式,默认会按照字母顺序排列,不符合常规浏览习惯,先将其转换为有序分类类型,指定1月到12月的自然排序规则:

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

# 定义1-12月的自然顺序
month_order = ['January', 'February', 'March', 'April', 'May', 'June', 
               'July', 'August', 'September', 'October', 'November', 'December']
# 将月份列转为有序分类
correct_omzet['maand'] = pd.Categorical(correct_omzet['maand'], categories=month_order, ordered=True)
# 按月份顺序重排数据
correct_omzet = correct_omzet.sort_values('maand')

步骤2:Seaborn方案(推荐)

绘制时新增hue参数指定按年份Jaar分组,即可自动生成每年对应的独立折线:

plt.figure(figsize=(20,8))
sns.set_style("darkgrid")
sns.lineplot(data=correct_omzet, x="maand", y="Bedrag", hue="Jaar", ci=None, marker='o', linewidth=2)
# 调整x轴标签角度避免重叠
plt.xticks(rotation=45, ha='right')
plt.title('Omzetpatroon 2019 - 2021', fontsize=14)
plt.xlabel('月份', fontsize=12)
plt.ylabel('销售额', fontsize=12)
plt.legend(title='年份', bbox_to_anchor=(1.01, 1), loc='upper left')
plt.tight_layout()
plt.show()

步骤2备选:Pandas绘图方案

如果要使用Pandas原生绘图接口,可先将数据转换为透视表格式,再手动指定x轴标签展示规则:

# 生成透视表:行为月份,列为年份,值为销售额
omzet_pivot = correct_omzet.pivot(index='maand', columns='Jaar', values='Bedrag')
# 绘图
ax = omzet_pivot.plot.line(rot=45, title='Omzetpatroon 2019 - 2021', colormap='Spectral', figsize=(20,8), marker='o')
# 强制显示所有x轴月份标签
ax.set_xticks(range(len(omzet_pivot.index)))
ax.set_xticklabels(omzet_pivot.index, ha='right')
plt.minorticks_on()
plt.tight_layout()
plt.show()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 15:27:03