使用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
相关产品推荐
相关产品推荐

