绘制聚类热图(带树状图)/Python
Posted
技术标签:
【中文标题】绘制聚类热图(带树状图)/Python【英文标题】:Plotly clustered heatmap (with dendrogram)/Python 【发布时间】:2021-06-07 09:11:21 【问题描述】:我正在尝试在 Python 中使用 plotly 创建一个聚集的热图(带有树状图)。他们在他们的网站上制作的那个不能很好地扩展,我已经找到了各种解决方案,但其中大多数都是用 R 或 javascript 编写的。我正在尝试仅从热图的左侧创建一个带有树状图的热图,显示 y 轴上的集群(来自层次聚类)。一个非常好看的例子是这个:https://chart-studio.plotly.com/~jackp/6748。我的目的是创建这样的东西,但仅限于左侧的树状图。如果有人可以在 Python 中实现这样的东西,我将非常感激!
设数据为X = np.random.randint(0, 10, size=(120, 10))
【问题讨论】:
有时看起来像,但 ***不是 一个代码排序服务。相反,您展示您尝试过的东西,而我们其他人会帮助您解决遇到的任何挑战。不过,由于您是游戏中的新手,而且我们在这里都很好,我会看看我是否可以共同努力至少让您入门。 【参考方案1】:以下建议借鉴了Dendrograms in Python 和chart-studio.plotly.com/~jackp 中的元素。这个特定的情节使用您的数据X = np.random.randint(0, 10, size=(120, 10))
。在我看来,链接方法的一个共同点是,数据集和数据处理过程有点混乱。所以我决定用df = pd.DataFrame(X)
在pandas数据框上构建下图,希望能让一切更清晰
情节
完整代码
import plotly.graph_objects as go
import plotly.figure_factory as ff
import numpy as np
import pandas as pd
from scipy.spatial.distance import pdist, squareform
import random
import string
X = np.random.randint(0, 10, size=(120, 10))
df = pd.DataFrame(X)
# Initialize figure by creating upper dendrogram
fig = ff.create_dendrogram(df.values, orientation='bottom')
fig.for_each_trace(lambda trace: trace.update(visible=False))
for i in range(len(fig['data'])):
fig['data'][i]['yaxis'] = 'y2'
# Create Side Dendrogram
# dendro_side = ff.create_dendrogram(X, orientation='right', labels = labels)
dendro_side = ff.create_dendrogram(X, orientation='right')
for i in range(len(dendro_side['data'])):
dendro_side['data'][i]['xaxis'] = 'x2'
# Add Side Dendrogram Data to Figure
for data in dendro_side['data']:
fig.add_trace(data)
# Create Heatmap
dendro_leaves = dendro_side['layout']['yaxis']['ticktext']
dendro_leaves = list(map(int, dendro_leaves))
data_dist = pdist(df.values)
heat_data = squareform(data_dist)
heat_data = heat_data[dendro_leaves,:]
heat_data = heat_data[:,dendro_leaves]
heatmap = [
go.Heatmap(
x = dendro_leaves,
y = dendro_leaves,
z = heat_data,
colorscale = 'Blues'
)
]
heatmap[0]['x'] = fig['layout']['xaxis']['tickvals']
heatmap[0]['y'] = dendro_side['layout']['yaxis']['tickvals']
# Add Heatmap Data to Figure
for data in heatmap:
fig.add_trace(data)
# Edit Layout
fig.update_layout('width':800, 'height':800,
'showlegend':False, 'hovermode': 'closest',
)
# Edit xaxis
fig.update_layout(xaxis='domain': [.15, 1],
'mirror': False,
'showgrid': False,
'showline': False,
'zeroline': False,
'ticks':"")
# Edit xaxis2
fig.update_layout(xaxis2='domain': [0, .15],
'mirror': False,
'showgrid': False,
'showline': False,
'zeroline': False,
'showticklabels': False,
'ticks':"")
# Edit yaxis
fig.update_layout(yaxis='domain': [0, 1],
'mirror': False,
'showgrid': False,
'showline': False,
'zeroline': False,
'showticklabels': False,
'ticks': ""
)
# # Edit yaxis2
fig.update_layout(yaxis2='domain':[.825, .975],
'mirror': False,
'showgrid': False,
'showline': False,
'zeroline': False,
'showticklabels': False,
'ticks':"")
fig.update_layout(paper_bgcolor="rgba(0,0,0,0)",
plot_bgcolor="rgba(0,0,0,0)",
xaxis_tickfont = dict(color = 'rgba(0,0,0,0)'))
fig.show()
【讨论】:
非常广泛和明确的答案,谢谢!顺便说一下, pape_bgcolor 改变了选项菜单的颜色。你知道我怎样才能保留旧颜色(基本上没有颜色)吗?因为如果我删除 paper_bgcolor,图表会发生一些变化。 @Petar 感谢您接受我的回答。不过那个颜色的东西真的很奇怪。我认为可以通过设置plot_bgcolor='#E5ECF6'
来修复它。但是不……我得等有时间再详细检查一下。
好的。与我在互联网上找到的许多东西不同,这是一个非常好的答案。感谢您花时间去做!关于颜色的东西,我明天也去看看,肯定是小东西要修!晚安! :)以上是关于绘制聚类热图(带树状图)/Python的主要内容,如果未能解决你的问题,请参考以下文章
在 jupyter notebook 中使用 plotly python 绘制具有不等热图的交互式树状图
MATLAB | 绘图复刻 | 分层聚类分析图:树状图+热图