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

Matplotlib图表X轴刻度标签不显示问题求助

问题解决:Matplotlib子图X轴日期刻度不显示及格式化处理

问题描述

图表下方的X轴刻度标签不显示,需要将标签设置为2022-11-01这类日期格式,且当日期数组过大时能自动间隔显示(例如2022-11-01、2022-11-25)。当前使用的代码如下:

fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(16, 10), gridspec_kw={'height_ratios': [2, 1]})
ax1.grid()
ax2.grid()
dt_profits['res_5'].plot(ax=ax1, legend=True, marker='^', ylabel="Сумма в рублях",
                                    title='Прибыль/убытки')
dt_profits['res_6'].plot(ax=ax1, legend=True)
dt_profits['res_7'].plot(ax=ax1, legend=True)
dt_profits['res_5'].plot(ax=ax2, legend=True, grid=True, marker='^',
                                 ylabel="Сумма в рублях", linestyle='--')
dt_profits['res_6'].plot(ax=ax2, legend=True, linestyle='--')
dt_profits['res_7'].plot(ax=ax2, legend=True, linestyle='--', xlabel='Дата')
plt.subplots_adjust(wspace=0, hspace=0)
ax1.grid(which='major', color = 'k', linestyle = ':')
ax2.grid(which='major', color = 'k', linestyle = ':')
    
ax1.tick_params(axis = 'x',    #  Применяем параметры к обеим осям
           which = 'minor',    #  Применяем параметры к вспомогательным делениям
           direction = 'out',    #  Рисуем деления внутри и снаружи графика
           length = 3,    #  Длинна делений
           width = 2,     #  Ширина делений
           pad = 5,    #  Расстояние между черточкой и ее подписью
           labelsize = 10,    #  Размер подписи
           bottom = True)    #  Рисуем метки снизу
ax1.tick_params(axis = 'x',    #  Применяем параметры к обеим осям
           which = 'major',    #  Применяем параметры к вспомогательным делениям
           direction = 'out',    #  Рисуем деления внутри и снаружи графика
           length = 5,    #  Длинна делений
           width = 2,     #  Ширина делений
           pad = 5,    #  Расстояние между черточкой и ее подписью
           labelsize = 10,    #  Размер подписи
           bottom = True)    #  Рисуем метки снизу
ax2.tick_params(axis = 'x',    #  Применяем параметры к обеим осям
           which = 'minor',    #  Применяем параметры к вспомогательным делениям
           direction = 'out',    #  Рисуем деления внутри и снаружи графика
           length = 3,    #  Длинна делений
           width = 2,     #  Ширина делений
           pad = 5,    #  Расстояние между черточкой и ее подписью
           labelsize = 10,    #  Размер подписи
           bottom = True)    #  Рисуем метки снизу
ax2.tick_params(axis = 'x',    #  Применяем параметры к обеим осям
           which = 'major',    #  Применяем параметры к вспомогательным делениям
           direction = 'out',    #  Рисуем деления внутри и снаружи графика
           length = 5,    #  Длинна делений
           width = 2,     #  Ширина делений
           pad = 5,    #  Расстояние между черточкой и ее подписью
           labelsize = 10,    #  Размер подписи
           bottom = True)    #  Рисуем метки снизу
ax1.set_xticks(dt_profits.index)
ax2.set_xticks(dt_profits.index)
plt.show()

解决方案

核心问题

  1. 手动设置set_xticks强制显示所有日期,数据量过大时标签重叠挤压导致无法显示;
  2. 未配置日期专用的刻度定位器和格式化器,上下子图X轴刻度存在重叠冲突。

修改步骤

  1. 移除手动设置set_xticks的代码,让Matplotlib自动适配刻度间隔;
  2. 引入matplotlib.dates模块,配置日期格式化器和自动定位器;
  3. 隐藏上方子图的X轴标签,避免与下方子图重叠;
  4. 统一日期显示格式为YYYY-MM-DD。

修改后的完整代码

import matplotlib.pyplot as plt
import matplotlib.dates as mdates

fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(16, 10), gridspec_kw={'height_ratios': [2, 1]})
ax1.grid()
ax2.grid()

# 绘制子图1
dt_profits['res_5'].plot(ax=ax1, legend=True, marker='^', ylabel="Сумма в рублях", title='Прибыль/убытки')
dt_profits['res_6'].plot(ax=ax1, legend=True)
dt_profits['res_7'].plot(ax=ax1, legend=True)

# 绘制子图2
dt_profits['res_5'].plot(ax=ax2, legend=True, grid=True, marker='^', ylabel="Сумма в рублях", linestyle='--')
dt_profits['res_6'].plot(ax=ax2, legend=True, linestyle='--')
dt_profits['res_7'].plot(ax=ax2, legend=True, linestyle='--', xlabel='Дата')

# 调整子图间距
plt.subplots_adjust(wspace=0, hspace=0)

# 配置网格样式
ax1.grid(which='major', color='k', linestyle=':')
ax2.grid(which='major', color='k', linestyle=':')

# 配置刻度样式
# 子图1隐藏X轴标签,只保留刻度线
ax1.tick_params(axis='x', which='both', direction='out', length=3, width=2, pad=5, labelsize=10, bottom=True, labelbottom=False)
# 子图2显示X轴标签
ax2.tick_params(axis='x', which='both', direction='out', length=3, width=2, pad=5, labelsize=10, bottom=True)

# 配置日期格式化与自动间隔
# 设置日期显示格式为YYYY-MM-DD
date_format = mdates.DateFormatter('%Y-%m-%d')
ax2.xaxis.set_major_formatter(date_format)
# 使用AutoDateLocator自动选择合适的刻度间隔
ax2.xaxis.set_major_locator(mdates.AutoDateLocator())

# 自动旋转X轴标签避免重叠
fig.autofmt_xdate()

plt.show()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 10:10:35