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
相关产品推荐
相关产品推荐

