如何用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
相关产品推荐
相关产品推荐

