在 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