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

Matplotlib子图X轴仅显示首尾刻度异常:折线图问题排查

问题分析与修正方案

问题现象

  • 折线图的最新月份(2023-01)错误显示在X轴左侧,不符合时间从左到右递增的逻辑
  • 折线图设置仅显示首尾刻度后,右侧刻度标签缺失

问题根源

  1. 时间列类型错误:Year - Month是字符串类型,虽然字符串排序能勉强按字典序排列,但matplotlib对字符串类别轴的处理逻辑与时间轴不同,导致折线图的X轴顺序异常,且刻度设置失效。
  2. 折线图与柱状图的刻度处理差异:
    • 柱状图的get_xticks()返回柱子的索引位置(0,1,...,n-1),设置首尾索引后可自动匹配对应标签。
    • 折线图的get_xticks()返回matplotlib自动分配的数值坐标,直接设置这些坐标但未同步指定标签时,会导致标签缺失;同时字符串轴无法体现时间连续性,进一步加剧显示异常。

修正方案

  1. 将Year - Month转换为datetime类型,确保严格按时间顺序排序,同时让matplotlib正确处理时间轴。
  2. 针对折线图,直接基于时间值设置首尾刻度及对应标签,避免依赖自动分配的坐标值。

修正后的代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 00:12:13