在 jupyter notebook 中使用 plotly python 绘制具有不等热图的交互式树状图

Posted

技术标签:

【中文标题】在 jupyter notebook 中使用 plotly python 绘制具有不等热图的交互式树状图【英文标题】:plotting interactive Dendrogram with an unequal Heatmap using plotly python in jupyter notebook 【发布时间】:2021-09-16 06:43:23 【问题描述】:

我正在尝试使用 look like this one 的 Plotly 包在 jupyter 笔记本上绘制带有 不等热图交互式 树状图

我的示例数据名为 dataHeat_arr 是 numpy.ndarray,它有 75 行(样本称为 S0 到 S74)和 100 列(代谢物称为 M0 到 M99),可在 link 中找到。

link 中有 3 个 csv 文件。

    dataHeat_arr.csv - numpy.ndarray 75*100 name_molec.csv - 名为 M0、M1、... 直到 M99 的代谢物列表 Samplenum.csv - 名为 S0、S1、... 直到 S74 的样本列表

我的代码基于her 中的示例并进行了一些更改,因为我的热垫不相等。

也试过questoins Plotly clustered heatmap (with dendrogram)/Python

我不知道我在做什么,最后的图是错过热图。 只有在使用等号热图进行绘图时,我才能使用树状图绘制热图。

她是我的密码。

导入包:

import plotly.figure_factory as ff
import numpy as np
np.random.seed(1)
import pandas as pd
import numpy as np
import string 
from itables import init_notebook_mode
from itables import show
import cimcb_lite as cb
import plotly.graph_objects as go
init_notebook_mode(all_interactive=True)

通过创建上部树状图来初始化图形:

# name the samples S0 till S74

# Samplenum & name_molec are csv files in the link of Github and should be treated as lists
labels = Samplenum
dataHeat_arr_t= np.transpose(dataHeat_arr)

# Initialize figure by creating upper dendrogram
fig = ff.create_dendrogram(dataHeat_arr, orientation='bottom', labels=labels)

# fig = ff.create_dendrogram(dataHeat_arr_t, orientation='bottom', labels=name_molec[:100] ) ,labels=name_molec[:100]

for i in range(len(fig['data'])):
    fig['data'][i]['yaxis'] = 'y2'

然后创建侧树状图:

# Create Side Dendrogram

dendro_side = ff.create_dendrogram(dataHeat_arr_t, orientation='right' ,labels=name_molec[:100])
# dendro_side = ff.create_dendrogram(dataHeat_arr, orientation='right', labels=labels)
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)

创建热图:

heatmap = [
    go.Heatmap(
        x = name_molec[:100],
        y =labels ,
        z = dataHeat_arr,
        colorscale = 'Cividis'
    )
]

将热图数据添加到图:

for data in heatmap:
    fig.add_trace(data)

现在布局:

# Edit Layout
fig.update_layout('width':1500, 'height':750,
                         '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, .85],
                                  'mirror': False,
                                  'showgrid': False,
                                  'showline': False,
                                  'zeroline': False,
                                  'showticklabels': False,
                                  'ticks': ""
                        )

# Edit yaxis2
fig.update_layout(yaxis2='domain':[0.852, 0.975],
                                   'mirror': False,
                                   'showgrid': False,
                                   'showline': False,
                                   'zeroline': False,
                                   'showticklabels': False,
                                   'ticks':"")

fig.show()

由于某种原因,情节看起来像这样:

任何想法/提示都会被我们充分利用!

【问题讨论】:

【参考方案1】:

在 y 轴和 x 轴上使用树状图绘制热图的正确代码:

通过创建上部树状图来初始化图形:

Samplenum = ["S" + str(x) for x in idx]
labels = Samplenum
dataHeat_arr_t= np.transpose(dataHeat_arr)
# Initialize figure by creating upper dendrogram

# The line below was changed comparing to my question 
fig = ff.create_dendrogram(dataHeat_arr_t, orientation='bottom', labels=name_molec[:99] )


for i in range(len(fig['data'])):
    fig['data'][i]['yaxis'] = 'y2'

创建侧树状图


# The line below was changed as well comparing to my question 
dendro_side = ff.create_dendrogram(dataHeat_arr, orientation='right', labels=["S" + str(x) for x in idx])
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)

创建热图:

heatmap = [
    go.Heatmap(
        x = name_molec[:99],
        y =labels ,
        z = dataHeat_arr,
        colorscale = 'Cividis'
    )
]

这 4 行是新的(不是我的问题):

heatmap[0]['x'] = fig['layout']['xaxis']['tickvals']
heatmap[0]['y'] = dendro_side['layout']['yaxis']['tickvals']


# to tickes text on y-axis as well
fig['layout']['yaxis']['ticktext'] = np.asarray(labels)
fig['layout']['yaxis']['tickvals'] = np.asarray(dendro_side['layout']['yaxis']['tickvals'])

大部分布局代码保持不变,但 :showticklabels': True

# Edit yaxis
fig.update_layout(yaxis='domain': [0, .7],
                                  'mirror': False,
                                  'showgrid': False,
                                  'showline': False,
                                  'zeroline': False,
                                  'showticklabels': True,
                                  'ticks': ""
                        )

输出看起来更像我问题开头的图片。

【讨论】:

以上是关于在 jupyter notebook 中使用 plotly python 绘制具有不等热图的交互式树状图的主要内容,如果未能解决你的问题,请参考以下文章

Jupyter Lab 在错误的路径中打开,与 Jupyter Notebook 不同,两者在“jupyter_notebook_config.py”中具有相同的映射。

如何在Jupyter Notebook中使用Python虚拟环境?

在 jupyter notebook 中使用 joblib 时不显示打印输出

解决不能再jupyter notebook中使用tensorflow

Jupyter Lab 中的 Jupyter Notebook 扩展

Jupyter notebook 中 从url中load 数据集, 会存在哪里?