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

