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

如何使用Matplotlib绘制带多组时间标记茎的时间轴?

你代码中stem1绘制不全的核心原因是使用zip(stem1, stem2)拼接两组数据时,zip()会自动以长度更短的stem2为准截断长数组,导致stem1的后半部分数据完全丢失。同时原有代码还存在茎线颜色无法区分两组、标签重叠、茎线与时间点不对齐的问题,以下是完整修复方案和可运行代码:

修复要点

  • 拆分处理两组茎线数据:stem1统一显示在时间轴上方,stem2统一显示在下方,两组茎线分别设置不同颜色,避免混淆
  • 分别为两组数据生成错开的高度等级,避免相邻标签重叠
  • 自动适配时间范围,x轴保持1分钟间隔均匀分布
  • 标签自动适配对齐方式,不会出现偏移错位

可运行完整代码

import datetime
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.dates as mdates

# 测试数据
stem1 = ['0:08:08', '0:08:52', '0:09:42', '0:10:20', '0:10:55', '0:11:24', '0:12:31', '0:13:07', '0:13:45', '0:14:16', '0:14:49', '0:15:20', '0:15:51', '0:16:21', '0:16:53', '0:17:28', '0:19:01', '0:19:22', '0:20:19', '0:20:48', '0:21:19', '0:22:05', '0:23:06', '0:23:34', '0:24:03', '0:24:30', '0:24:51', '0:25:18', '0:25:54', '0:26:25', '0:27:07', '0:28:05', '0:29:04', '0:29:30', '0:30:34', '0:32:57', '0:33:28', '0:33:57', '0:34:35', '0:35:01', '0:35:41', '0:36:06', '0:36:30', '0:37:01', '0:37:33', '0:38:06', '0:38:40', '0:39:21', '0:40:02', '0:40:22', '0:40:42', '0:41:32', '0:41:56', '0:43:20', '0:43:39', '0:44:02', '0:44:26', '0:45:04', '0:45:32', '0:46:02', '0:47:00', '0:47:42', '0:48:05', '0:48:35', '0:49:02', '0:49:25', '0:49:56', '0:50:43', '0:51:25', '0:51:43', '0:52:18', '0:52:49', '0:53:08']
stem2 = ['0:09:49', '0:10:24', '0:14:27', '0:24:31', '0:26:03']

# 时间字符串转datetime格式
stem1_dt = [datetime.datetime.strptime(t, '%H:%M:%S') for t in stem1]
stem2_dt = [datetime.datetime.strptime(t, '%H:%M:%S') for t in stem2]

# 创建画布
fig, ax = plt.subplots(figsize=(120, 8), constrained_layout=True)
ax.set(title='时间轴茎线图')

# 生成错开的高度等级,避免标签重叠
# stem1用正高度(轴上方),高度交替为4、6,错开显示
levels1 = np.tile([4, 6], int(np.ceil(len(stem1_dt)/2)))[:len(stem1_dt)]
# stem2用负高度(轴下方),高度交替为-4、-6,错开显示
levels2 = np.tile([-4, -6], int(np.ceil(len(stem2_dt)/2)))[:len(stem2_dt)]

# 绘制茎线:stem1红色,stem2蓝色
ax.vlines(stem1_dt, 0, levels1, color='tab:red', linewidth=1.5)
ax.vlines(stem2_dt, 0, levels2, color='tab:blue', linewidth=1.5)

# 绘制时间轴基线
all_dt = stem1_dt + stem2_dt
ax.plot(all_dt, np.zeros_like(all_dt), "-o", color="k", markerfacecolor="w", markersize=4)

# 绘制stem1标签(绿色)
for dt, level, t_str in zip(stem1_dt, levels1, stem1):
    ax.annotate(t_str, xy=(dt, level),
                xytext=(0, np.sign(level)*5),
                textcoords='offset points',
                horizontalalignment='center',
                verticalalignment='bottom',
                color='tab:green',
                fontsize=9)

# 绘制stem2标签(蓝色)
for dt, level, t_str in zip(stem2_dt, levels2, stem2):
    ax.annotate(t_str, xy=(dt, level),
                xytext=(0, np.sign(level)*5),
                textcoords='offset points',
                horizontalalignment='center',
                verticalalignment='top',
                color='tab:blue',
                fontsize=9)

# 隐藏多余轴元素
ax.yaxis.set_visible(False)
ax.spines[["left", "top", "right"]].set_visible(False)

# 设置x轴刻度:1分钟间隔,格式为分:秒
ax.xaxis.set_major_locator(mdates.MinuteLocator(interval=1))
ax.xaxis.set_major_formatter(mdates.DateFormatter('%M:%S'))

# 旋转x轴刻度避免重叠
plt.setp(ax.get_xticklabels(), rotation=45, ha="right", fontsize=9)

# 自动适配x轴范围
min_dt = min(all_dt) - datetime.timedelta(seconds=30)
max_dt = max(all_dt) + datetime.timedelta(seconds=30)
ax.set_xlim(min_dt, max_dt)

# 保存图片
plt.savefig('timeline_result.png', bbox_inches='tight', dpi=150)

效果说明

  • 两组茎线数据全部完整绘制,无丢失
  • x轴按1分钟间隔均匀分布,时间格式清晰
  • stem1茎线为红色、标签为绿色,显示在时间轴上方;stem2茎线为蓝色、标签为蓝色,显示在时间轴下方,两组区分明确
  • 相邻标签自动错开高度,不会出现重叠
  • 茎线与对应时间点完全对齐,无偏移

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 22:27:04