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

如何在Seaborn heatmap刻度标签中心绘制折线展示viterbi路径

问题原因

你遇到的绘制偏移、过渡不符合预期的问题,核心有两个原因:

  1. Seaborn热力图的每个单元格的中心坐标为(列索引+0.5, 行索引+0.5),直接使用整数索引绘制折线,会默认对齐单元格边界,而非中心。
  2. matplotlib默认折线使用线性插值,两个点之间为斜线过渡,不符合状态跳转的阶梯特性。

解决代码

针对你提供的可复现代码,修改后如下:

import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

uniform_data = np.random.rand(10, 15)
ax = sns.heatmap(uniform_data)
viterbi_path = [0, 0, 1, 1, 2, 3, 4,4,4,4,5,6,7,8,9]

# 生成每个时间步对应的单元格中心x坐标
x_coords = np.arange(len(viterbi_path)) + 0.5
# 生成每个状态对应的单元格中心y坐标
y_coords = np.array(viterbi_path) + 0.5

# 绘制阶梯式折线,steps-mid保证折线在单元格中心处跳转,可按需添加marker参数显示节点
plt.plot(x_coords, y_coords, color='red', linewidth=2, drawstyle='steps-mid', marker='o', markersize=4)

ax.set_title("State probabilities")
ax.set_xlabel("Time step")
ax.set_ylabel("Hidden states")
plt.show()

效果说明

修改后折线会自动对齐每个单元格的中心,且两个相邻时间步之间为水平+垂直的阶梯跳转,不会出现斜线过渡,完全符合你期望的效果。如果你的状态索引是从下往上递增的,只需要将y坐标计算逻辑修改为y_coords = uniform_data.shape[0] - np.array(viterbi_path) - 0.5即可适配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 08:48:03