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

如何解决Matplotlib垂直时间轴图表中的标签重叠问题

解决Matplotlib垂直时间轴标签重叠问题

我常用的防止数据标签重叠的方法(比如autofmt_xdate)在Matplotlib垂直时间轴上不起作用。我不关心图表需要多高,也不在意项目间垂直距离是否完全保留日期间隔比例,只要求文本标签不重叠。

控制文本标签的核心代码如下:

_ = ax.text(label_offsets[i], d, l, ha=align, fontfamily='serif', fontweight='bold', color='royalblue',fontsize=12)

其中d是作为y轴坐标的时间戳。我尝试过创建循环计数器并存储每次循环的d值,对比当前与前一个日期,若间距过近则给当前d增加固定值(如15天),但未奏效。

完整绘图代码:

chartdata = pd.read_csv(
    "data/Events.csv"
)

chartdata = chartdata.query('Year > 1939')

dates = pd.to_datetime(chartdata['Date_Clean_Approx'])
min_date = date(np.min(dates).year - 2, np.min(dates).month, np.min(dates).day)
max_date = date(np.max(dates).year + 2, np.max(dates).month, np.max(dates).day)

labels = chartdata['Name']

# labels with associated dates
labels = ['{0:%d %b %Y}:\n{1}'.format(d, l) for l, d in zip (labels, dates)]

fig, ax = plt.subplots(figsize=(6, 32), constrained_layout=True)
_ = ax.set_xlim(-20, 20)
_ = ax.set_ylim(min_date, max_date)
_ = ax.axvline(0, ymin=0.05, ymax=0.95, c='deeppink', zorder=1)

_ = ax.scatter(np.zeros(len(dates)), dates, s=120, c='palevioletred', zorder=2)
_ = ax.scatter(np.zeros(len(dates)), dates, s=30, c='darkmagenta', zorder=3)

label_offsets = np.repeat(2.0, len(dates))
label_offsets[1::2] = -2.0

for i, (l, d) in enumerate(zip(labels, dates)):
    d = d - timedelta(days=90)
    align = 'right'
    if i % 2 == 0:
        align = 'left'
    _ = ax.text(label_offsets[i], d, l, ha=align, fontfamily='serif', fontweight='bold', color='royalblue',fontsize=12)

stems = np.repeat(2.0, len(dates))
stems[1::2] *= -1.0    
x = ax.hlines(dates, 0, stems, color='darkmagenta')

# hide lines around chart
for spine in ["left", "top", "right", "bottom"]:
    _ = ax.spines[spine].set_visible(False)

# hide tick labels
_ = ax.set_xticks([])
_ = ax.set_yticks([])
_ = ax.set_title('UAP (UFO) Milestones, 1940 - Present', 
                 fontweight="bold", 
                 fontfamily='serif', 
                 fontsize=16, 
                 color='royalblue')

pyplot(fig)

我已经增大图表高度以减少标签重叠,但图表变得很长仍存在文本重叠问题。如果能将“根据需要调整相对间距和图表高度以避免文本标签重叠”的逻辑嵌入Matplotlib的便捷绘图函数中,会是一个很实用的功能。

内容的提问来源于stack exchange,提问作者Hack-R

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 15:36:18