【问题标题】:plotting interactive Dendrogram with an unequal Heatmap using plotly python in jupyter notebook在 jupyter notebook 中使用 plotly python 绘制具有不等热图的交互式树状图
【发布时间】: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 文件。

  1. dataHeat_arr.csv - numpy.ndarray 75*100
  2. name_molec.csv - 名为 M0、M1、... 直到 M99 的代谢物列表
  3. 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()

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

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

【问题讨论】:

    标签: jupyter-notebook heatmap plotly-python dendrogram


    【解决方案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': ""
                            })
    
    

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

    【讨论】:

      猜你喜欢
      • 2018-11-18
      • 2016-11-16
      • 1970-01-01
      • 2019-11-14
      • 2017-11-03
      • 2022-08-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多