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

如何用Seaborn实现同色阶堆叠热力图?及Augmented suffix tree创建方法

两个问题的解决方案

一、用Seaborn堆叠多个热力图并保持统一颜色标度

要实现你想要的堆叠热力图效果,核心是统一所有子图的颜色映射范围,然后用Matplotlib的子图布局来排列。我给你整理了具体步骤和代码示例:

关键步骤

  • 先确定所有热力图数据的全局最小值和最大值,确保所有子图的颜色标度完全对齐
  • 使用Matplotlib的subplots创建垂直(或水平)堆叠的子图布局
  • 每个子图调用seaborn.heatmap时,指定vmin和vmax为全局的最小/最大值,若需要统一颜色条,可让最后一个子图单独显示颜色条

代码示例

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

# 模拟三组不同的热力图数据(替换成你的真实数据)
data1 = np.random.rand(24, 7) * 10
data2 = np.random.rand(24, 7) * 10 + 2
data3 = np.random.rand(24, 7) * 10 - 1

# 计算所有数据的全局min和max,确保颜色标度统一
global_min = min(data1.min(), data2.min(), data3.min())
global_max = max(data1.max(), data2.max(), data3.max())

# 创建垂直堆叠的子图,3行1列,共享x轴
fig, axes = plt.subplots(nrows=3, ncols=1, figsize=(8, 12), sharex=True)

# 绘制每个热力图,指定统一的vmin、vmax和颜色映射
sns.heatmap(data1, ax=axes[0], vmin=global_min, vmax=global_max, cmap="coolwarm", cbar=False)
axes[0].set_title("第一组热力图")
axes[0].set_ylabel("小时")

sns.heatmap(data2, ax=axes[1], vmin=global_min, vmax=global_max, cmap="coolwarm", cbar=False)
axes[1].set_title("第二组热力图")
axes[1].set_ylabel("小时")

# 最后一个子图显示颜色条,保证所有子图共用
sns.heatmap(data3, ax=axes[2], vmin=global_min, vmax=global_max, cmap="coolwarm", cbar=True)
axes[2].set_title("第三组热力图")
axes[2].set_ylabel("小时")
axes[2].set_xlabel("星期")

# 调整子图间距,避免标题和标签重叠
plt.tight_layout()
plt.show()

这样出来的效果就是所有热力图颜色深浅完全对应相同的数值,和你示例图里的堆叠效果一致。如果需要水平堆叠,把nrows=3, ncols=1改成nrows=1, ncols=3即可。

二、创建Augmented Suffix Tree(增强后缀树)

Augmented Suffix Tree是在普通后缀树的基础上,给节点添加额外元数据(比如子串出现次数、后缀起始位置、扩展后缀链接等)的结构,能更高效地解决字符串匹配、重复子串查找、序列比对等问题。

核心思路

  1. 构建基础后缀树:优先用Ukkonen算法构建(时间复杂度O(n),n为字符串长度),它能快速生成所有后缀的压缩表示,是目前最高效的后缀树构建方法。
  2. 添加增强信息:根据你的需求给节点补充元数据,常见的扩展方式包括:
    • 给每个节点标记其代表的子串在原字符串中出现的次数
    • 添加指向最长重复子串节点的扩展链接
    • 记录子树中包含的所有后缀的起始位置

实现建议

  • 若不想手动实现,可以借助现成的Python库(比如suffix-trees),再基于库的基础结构扩展增强信息
  • 手动实现的话,先完成Ukkonen算法的基础后缀树,再通过后序遍历统计子串出现次数,示例伪代码如下:
class AugmentedSuffixTreeNode:
    def __init__(self):
        self.children = {}  # 字符到子节点的映射
        self.suffix_link = None
        self.count = 0  # 增强信息:子串出现次数

def build_augmented_suffix_tree(s):
    # 先调用Ukkonen算法构建基础后缀树
    root = build_ukkonen_suffix_tree(s)
    # 后序遍历树,计算每个节点的count
    post_order_traversal(root)
    return root

def post_order_traversal(node):
    if not node.children:  # 叶子节点对应单个后缀,计数为1
        node.count = 1
    else:
        for child in node.children.values():
            post_order_traversal(child)
            node.count += child.count  # 内部节点计数为子节点计数之和

这样每个节点的count属性就代表了该节点对应的子串在原字符串中出现的次数,这是增强后缀树最常用的扩展形式。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 10:17:50