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

Plotly 5.16.1复现树状图热图报错,求更新实现方案

Plotly 5.16.1 实现交互式树状图热图的正确方式

旧版本Plotly代码中的zauto、opacity、zsmooth等参数在5.x版本中已被废弃或调整,导致语法错误。以下是适配Plotly 5.16.1的实现方案:

核心调整说明

  • zauto:颜色自动缩放默认启用,无需手动设置;如需自定义范围,使用zmin和zmax参数替代。
  • opacity:直接在热图trace的属性中设置,而非旧代码中的层级位置。
  • zsmooth:该参数已移除,若需平滑效果,提前用scipy.ndimage.gaussian_filter等工具处理数据后再传入热图。

方案一:使用figure_factory快速构建(推荐)

结合create_dendrogram和create_annotated_heatmap,自动处理聚类与布局:

import plotly.figure_factory as ff
import numpy as np

# 生成示例数据(替换为你的业务数据)
np.random.seed(123)
data = np.random.rand(10, 10)
item_labels = [f"样本 {i+1}" for i in range(10)]

# 创建行、列方向的树状图
dendro_row = ff.create_dendrogram(data, orientation="bottom", labels=item_labels)
dendro_col = ff.create_dendrogram(data, orientation="right", labels=item_labels)

# 获取聚类后的索引顺序
row_order = [item_labels.index(tick) for tick in dendro_row["layout"]["xaxis"]["ticktext"]]
col_order = [item_labels.index(tick) for tick in dendro_col["layout"]["yaxis"]["ticktext"]]
clustered_data = data[row_order][:, col_order]

# 创建带标注的热图
heatmap = ff.create_annotated_heatmap(
    clustered_data,
    x=[item_labels[i] for i in col_order],
    y=[item_labels[i] for i in row_order],
    colorscale="Viridis",
    showscale=True,
    opacity=0.8  # 直接设置透明度
)

# 合并树状图与热图到同一画布
fig = ff.create_dendrogram(data)
fig.add_trace(heatmap["data"][0])

# 添加行、列树状图的线条
for trace in dendro_row["data"]:
    fig.add_trace(trace)
for trace in dendro_col["data"]:
    fig.add_trace(trace)

# 调整整体布局,避免元素重叠
fig.update_layout(
    height=800,
    width=1000,
    xaxis={"domain": [0.15, 1]},
    yaxis={"domain": [0, 0.85]},
    margin={"l": 200, "t": 50}
)

fig.show()

方案二:手动结合scipy聚类与plotly.express(更灵活)

适合需要精细控制聚类算法或布局的场景:

import plotly.express as px
from scipy.cluster.hierarchy import linkage, leaves_list
import numpy as np

# 生成示例数据
data = np.random.rand(10, 10)
item_labels = [f"样本 {i+1}" for i in range(10)]

# 用ward法计算行、列的聚类链接
row_linkage = linkage(data, method="ward")
col_linkage = linkage(data.T, method="ward")

# 获取聚类后的索引顺序
row_order = leaves_list(row_linkage)
col_order = leaves_list(col_linkage)

# 重新排列数据
clustered_data = data[row_order][:, col_order]
row_labels = [item_labels[i] for i in row_order]
col_labels = [item_labels[i] for i in col_order]

# 创建热图
fig = px.imshow(
    clustered_data,
    x=col_labels,
    y=row_labels,
    color_continuous_scale="Viridis",
    opacity=0.8
)

# 若需添加树状图,可结合plotly.graph_objects手动绘制线条,或复用figure_factory的树状图trace
fig.show()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 00:30:10