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

如何在Matplotlib中绘制value与年月关联图(X轴仅显示年份)

解决方案

核心思路

你的数据已经按年月升序排列且无重复组合,无需用datetime类型作为x轴(会因时间间隔引入不合理空白)。直接用数据的行索引作为x轴坐标,再手动将x轴刻度替换为年份,并对齐到每年第一个月的位置即可。

具体代码实现

示例数据(模拟你的df结构)

import pandas as pd
df = pd.DataFrame({
    'year': [2020, 2020, 2021, 2021, 2022, 2022],
    'month': [11, 12, 1, 2, 3, 4],
    'val': [10, 15, 20, 22, 18, 25]
})

步骤1:定位年份刻度位置

先找出每个年份对应的第一个数据点的索引,用于设置x轴刻度:

# 获取所有唯一年份
unique_years = df['year'].unique()
# 找到每个年份第一个数据的行索引位置
tick_positions = [df[df['year'] == y].index[0] for y in unique_years]

步骤2:绘图并自定义x轴

import matplotlib.pyplot as plt

plt.figure(figsize=(10, 6))
# 用行索引做x轴,保证每个年月数据点间距均匀
plt.plot(df.index, df['val'], marker='o', linestyle='-', color='#1f77b4', label='val')

# 设置x轴:刻度位置对应每年第一个数据点,标签为年份
plt.xticks(ticks=tick_positions, labels=unique_years, fontsize=10)

# 可选:添加年份分隔线,增强可读性
for pos in tick_positions[1:]:
    plt.axvline(x=pos - 0.5, color='gray', linestyle='--', alpha=0.2)

# 完善图表元素
plt.xlabel('年份', fontsize=12)
plt.ylabel('val 值', fontsize=12)
plt.title('val 随年月变化趋势', fontsize=14)
plt.legend()
plt.grid(axis='y', alpha=0.3)
plt.tight_layout()
plt.show()

问题根源解释

你之前用datetime类型的问题在于:如果数据存在非连续的年月(比如2020年12月后直接跳到2022年1月),Matplotlib会严格按照实际时间差绘制,导致中间出现大片空白,数据点间距被不合理拉长。而用行索引作为x轴,能强制每个年月对应的数据点保持等距,再手动绑定年份标签,完全匹配你要的效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 02:00:23