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()
解决方案
核心问题
- 手动设置
set_xticks强制显示所有日期,数据量过大时标签重叠挤压导致无法显示; - 未配置日期专用的刻度定位器和格式化器,上下子图X轴刻度存在重叠冲突。
修改步骤
- 移除手动设置
set_xticks的代码,让Matplotlib自动适配刻度间隔; - 引入
matplotlib.dates模块,配置日期格式化器和自动定位器; - 隐藏上方子图的X轴标签,避免与下方子图重叠;
- 统一日期显示格式为
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
相关产品推荐
相关产品推荐

