如何在Seaborn heatmap刻度标签中心绘制折线展示viterbi路径
问题原因
你遇到的绘制偏移、过渡不符合预期的问题,核心有两个原因:
- Seaborn热力图的每个单元格的中心坐标为
(列索引+0.5, 行索引+0.5),直接使用整数索引绘制折线,会默认对齐单元格边界,而非中心。 - 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
相关产品推荐
相关产品推荐

