Matplotlib子图X轴仅显示首尾刻度异常:折线图问题排查
问题分析与修正方案
问题现象
- 折线图的最新月份(2023-01)错误显示在X轴左侧,不符合时间从左到右递增的逻辑
- 折线图设置仅显示首尾刻度后,右侧刻度标签缺失
问题根源
- 时间列类型错误:
Year - Month是字符串类型,虽然字符串排序能勉强按字典序排列,但matplotlib对字符串类别轴的处理逻辑与时间轴不同,导致折线图的X轴顺序异常,且刻度设置失效。 - 折线图与柱状图的刻度处理差异:
- 柱状图的
get_xticks()返回柱子的索引位置(0,1,...,n-1),设置首尾索引后可自动匹配对应标签。 - 折线图的
get_xticks()返回matplotlib自动分配的数值坐标,直接设置这些坐标但未同步指定标签时,会导致标签缺失;同时字符串轴无法体现时间连续性,进一步加剧显示异常。
- 柱状图的
修正方案
- 将
Year - Month转换为datetime类型,确保严格按时间顺序排序,同时让matplotlib正确处理时间轴。 - 针对折线图,直接基于时间值设置首尾刻度及对应标签,避免依赖自动分配的坐标值。
修正后的代码
import matplotlib.pyplot as plt import pandas as pd from io import StringIO csvfile = StringIO( """ Name;Year - Month;Score;Upvote Mike;2023-01;884.22;5 Mike;2022-12;5472.81;36 Mike;2022-11;2017.59;15 Mike;2022-10;1845.23;14 Mike;2022-08;1984.32;15 Mike;2022-07;1033.33;8 Mike;2022-06;1587.64;24 Mike;2022-05;1019.93;20 Mike;2022-04;2359.3;45 Mike;2022-03;7478.72;140 """) df = pd.read_csv(csvfile, sep=';', engine='python') # 将字符串时间转为datetime类型 df['Year - Month'] = pd.to_datetime(df['Year - Month'], format='%Y-%m') for group_name, sub_frame in df.groupby("Name"): fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(10,5)) # 按时间升序排序,确保从旧到新排列 sub_frame_sorted = sub_frame.sort_values('Year - Month') # 绘制折线图,使用datetime作为X轴 sub_frame_sorted.plot(ax=axes[1], x="Year - Month", y="Score") # 绘制柱状图 sub_frame_sorted.plot(ax=axes[0], kind='bar', x="Year - Month", y="Upvote") # 处理柱状图刻度:仅显示首尾 ax0_ticks = axes[0].get_xticks() axes[0].set_xticks([ax0_ticks[0], ax0_ticks[-1]]) plt.setp(axes[0].get_xticklabels(), rotation=0) # 处理折线图刻度:获取首尾时间值,设置刻度和对应标签 first_date = sub_frame_sorted['Year - Month'].iloc[0] last_date = sub_frame_sorted['Year - Month'].iloc[-1] axes[1].set_xticks([first_date, last_date]) # 将datetime格式转为原字符串格式显示 axes[1].set_xticklabels([first_date.strftime('%Y-%m'), last_date.strftime('%Y-%m')]) plt.setp(axes[1].get_xticklabels(), rotation=0) plt.tight_layout() plt.show()
关键修改说明
- 新增
pd.to_datetime()将时间列转为datetime类型,确保排序和轴处理逻辑正确。 - 折线图刻度设置改为直接使用首尾时间值,同步设置标签为原字符串格式,避免坐标匹配错误。
- 添加
plt.tight_layout()优化子图间距,避免标签重叠。
内容的提问来源于stack exchange,提问作者Mark K
相关产品推荐
相关产品推荐

