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

使用Matplotlib与Pandas绘制多年月度数据时序图遇问题求助

解决Matplotlib/Pandas月度时序图的问题

作为Python新手,你遇到的这些问题其实是处理时序数据时的常见坑,咱们一步步来拆解解决:

1. 先搞定日期数据的正确处理(解决NaN和排序问题)

你手动映射月份时出现NaN,是因为样本数据里缺少了June,但其实不用自己写字典这么麻烦——Pandas的pd.to_datetime可以自动识别月份名称,直接帮你把年份和月份转换成标准的日期格式:

import pandas as pd
import matplotlib.pyplot as plt

# 你的样本数据
data = [
    [2014, 'January', 510], [2014, 'February', 542], [2014, 'March', 684],
    [2014, 'April', 700], [2014, 'May', 732], [2014, 'July', 603],
    [2014, 'August', 643], [2014, 'September', 680], [2014, 'October', 723],
    [2014, 'November', 760], [2014, 'December', 810], [2015, 'January', 920],
    [2015, 'February', 900], [2015, 'March', 780], [2015, 'April', 710],
    [2015, 'May', 810], [2015, 'July', 895], [2015, 'August', 906],
    [2015, 'September', 945], [2015, 'October', 980], [2015, 'November', 1000],
    [2015, 'December', 1123]
]

df = pd.DataFrame(data, columns=['Year', 'Month', 'Value'])

# 合并年份和月份,转成datetime类型(自动识别月份名称,不会出现NaN)
df['Date'] = pd.to_datetime(df['Year'].astype(str) + ' ' + df['Month'])
# 确保数据按时间顺序排序(好习惯,避免后续绘图乱序)
df = df.sort_values('Date')

这样处理后,Date列是标准的时间格式,天然有序,直接解决了之前X轴年份重叠的问题。

2. 绘制清晰的时序折线图(展示变化趋势)

如果你的核心需求是展示数值随时间的变化趋势,折线图是最优选择。用Pandas自带的plot方法,它会自动适配日期轴,比直接用Matplotlib更省心:

plt.figure(figsize=(12, 6))
# 以Date为X轴,Value为Y轴绘制折线图,添加标记点更清晰
df.plot(x='Date', y='Value', kind='line', marker='o', title='Monthly Value Trend (2014-2015)', ax=plt.gca())

# 优化X轴刻度:旋转标签避免拥挤,自动调整布局防止截断
plt.xticks(rotation=45)
plt.xlabel('Date')
plt.ylabel('Value')
plt.tight_layout()
plt.show()

生成的图会严格按时间顺序排列,X轴刻度会根据日期范围自动调整,旋转45度的标签也能保证可读性。

3. 柱状图的适用场景(跨年度同月份对比)

如果你更想对比两年同一月份的数值差异,柱状图会更直观。可以先把数据转成宽格式,再绘制分组柱状图:

# 把数据转成"月份为行,年份为列"的格式
pivot_df = df.pivot(index='Month', columns='Year', values='Value')
# 按自然月份顺序排序(避免月份乱序)
month_order = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']
pivot_df = pivot_df.reindex(month_order)

plt.figure(figsize=(12, 6))
pivot_df.plot(kind='bar', ax=plt.gca())
plt.title('Monthly Value Comparison (2014 vs 2015)')
plt.xlabel('Month')
plt.ylabel('Value')
plt.xticks(rotation=45)
plt.legend(title='Year')
plt.tight_layout()
plt.show()

这个图能清晰看到每个月份两年数值的对比,缺少June的月份会自动留空,符合你的数据情况。

小总结

  • 看时序变化趋势:选折线图,用datetime类型的X轴确保顺序正确,通过旋转刻度、调整布局解决拥挤问题。
  • 看跨年度同月份对比:选柱状图,用pivot转换数据格式后绘制更直观。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 13:07:34