python - 聚类热图(带树状图)/Python

标签 python plotly heatmap plotly-python dendrogram

我正在尝试在 Python 中使用 plotly 创建聚类热图(带有树状图)。他们在他们的网站上制作的那个不能很好地扩展,我已经找到了各种解决方案,但大多数都是用 R 或 JavaScript 编写的。我正在尝试仅从热图的左侧创建一个带有树状图的热图,显示 y 轴上的聚类(来自层次聚类)。一个非常好看的例子是这个:https://chart-studio.plotly.com/~jackp/6748 .我的目的是创建类似这样的东西,但仅限于左侧树状图。如果有人能用 Python 实现这样的东西,我将不胜感激!

设数据为X = np.random.randint(0, 10, size=(120, 10))

最佳答案

以下建议借鉴了 Dendrograms in Python 中的元素和 chart-studio.plotly.com/~jackp .此特定图使用您的数据 X = np.random.randint(0, 10, size=(120, 10))。在我看来,链接方法的一个共同点是数据集和数据处理过程有点困惑。所以我决定用 df = pd.DataFrame(X) 在 pandas dataframe 上构建下图,希望能让一切更清晰

plotly

enter image description here

完整代码

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()

关于python - 聚类热图(带树状图)/Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66547583/

相关文章:

r - 使用 R 和眼动仪数据创建热图

python - 如何排序我的数据以在 Bokeh 中制作热图?

Python读取txt文件中的\n和\r

python - 在绘图中应用条件不透明度

python - mkvirtualenv 给出权限被拒绝错误

python - 在不使用 Plotly Express 的情况下向 Plotly 子图添加垂直矩形

Python:以正确且更简单的方式用plotly绘制交叉表?

matrix - 在 gnuplot 中生成热图表

python - 什么是 python 中的 * arguments (without suffix) 函数/方法?

python - 如何根据 if 语句的结果缩短附加到不同列表的时间