Matplotlib日期绘图不可见主网格线遮挡次网格线问题修复
问题根因
你遇到的11月网格缺失和网格遮挡无关,根源是Matplotlib默认的重合刻度自动清理逻辑:
- 配置的主刻度生成规则为每月1日落点,次刻度生成规则为每周一落点
- 2021年11月1日恰好为周一,该时间点同时命中主、次刻度的生成规则
- Matplotlib轴对象默认开启
remove_overlapping_locs=True配置,会自动删除位置与主刻度完全重合的次刻度,避免刻度标签、标记重叠 - 由于仅开启了次网格线渲染,被删除的重合次刻度对应的网格线不会被绘制,最终表现为11月对应位置的网格缺口。

修复方案
方案1:关闭重合刻度自动清理(推荐)
该方案完全保留原有刻度规则,仅需新增一行配置关闭自动清理逻辑即可,适配Matplotlib 2.2及以上绝大多数常用版本:
from datetime import datetime import matplotlib as mpl from matplotlib import pyplot as plt from matplotlib import dates as mdates fig, ax = plt.subplots() ax.xaxis.set_minor_locator(mdates.WeekdayLocator(byweekday=mdates.MO)) ax.xaxis.set_major_locator(mdates.MonthLocator()) ax.xaxis.set_major_formatter( mdates.ConciseDateFormatter(mdates.AutoDateLocator()) ) # 关闭x轴重合次刻度的自动移除逻辑 ax.xaxis.remove_overlapping_locs = False ax.set_xlim(datetime(2021, 9, 1), datetime(2022, 1, 1)) ax.xaxis.grid(color="gray", linestyle="dashed", alpha=0.2, which="minor") plt.show()
由于本身没有开启主网格、也没有显示次刻度标签,关闭该配置不会造成任何显示重叠问题,原本缺失的网格线会正常渲染。
方案2:手动绘制网格线(兼容所有版本)
如果使用极旧版本Matplotlib不支持remove_overlapping_locs配置,可以绕开内置的网格渲染逻辑,手动计算所有周一次刻度的位置后绘制竖线作为网格:
from datetime import datetime import matplotlib as mpl from matplotlib import pyplot as plt from matplotlib import dates as mdates fig, ax = plt.subplots() ax.xaxis.set_major_locator(mdates.MonthLocator()) ax.xaxis.set_major_formatter( mdates.ConciseDateFormatter(mdates.AutoDateLocator()) ) ax.set_xlim(datetime(2021, 9, 1), datetime(2022, 1, 1)) # 手动生成时间范围内所有周一的刻度点,直接绘制网格线 week_locator = mdates.WeekdayLocator(byweekday=mdates.MO) week_positions = week_locator.tick_values(*ax.get_xlim()) for x in week_positions: ax.axvline( x, color="gray", linestyle="dashed", alpha=0.2, linewidth=mpl.rcParams["grid.linewidth"] ) plt.show()
该方案完全不受主/次刻度重合清理逻辑影响,所有周一位置的网格线都会正常显示。
内容的提问来源于stack exchange,提问作者Bastian Venthur
相关产品推荐
相关产品推荐

