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

使用MonthLocator+ConciseDateFormatter如何将年份标签设置为粗体?

解决方法

可以通过遍历X轴主刻度标签,判断哪些对应年份标识,再单独设置其字体为粗体。由于ConciseDateFormatter没有直接指定特定标签样式的参数,我们可以通过两种方式实现:

方式一:通过标签文本判断(适用于年份显示为纯4位数字的情况)

在你现有的代码后添加以下逻辑:

# 遍历所有X轴主刻度标签
for label in ax.get_xticklabels():
    text = label.get_text()
    # 判断是否为4位数字的年份
    if text.isdigit() and len(text) == 4:
        label.set_fontweight('bold')

方式二:通过刻度对应的日期判断(更可靠,适配不同显示格式)

如果你的日期显示格式存在变体(比如带额外字符),可以通过刻度对应的实际日期来判断是否为新年起始,再设置粗体:

import matplotlib.dates as mdates

# 获取主刻度的位置和对应标签
ticks = ax.get_xticks()
labels = ax.get_xticklabels()

for tick, label in zip(ticks, labels):
    # 将刻度值转换为日期对象
    current_date = mdates.num2date(tick)
    # 判断是否为当年1月1日(对应ConciseDateFormatter显示年份的刻度)
    if current_date.month == 1 and current_date.day == 1:
        label.set_fontweight('bold')

完整代码示例

整合后你的代码会是这样:

import matplotlib.dates as mdates

# 原有设置代码
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())
)

ax.set_xlim(MIN_DATE, MAX_DATE)
ax.xaxis.remove_overlapping_locs = False

# 添加年份标签粗体设置
ticks = ax.get_xticks()
labels = ax.get_xticklabels()

for tick, label in zip(ticks, labels):
    current_date = mdates.num2date(tick)
    if current_date.month == 1 and current_date.day == 1:
        label.set_fontweight('bold')

这样设置后,所有对应新年起始的年份标签会以粗体显示,和月份标签形成明显区别。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 22:17:03