
接着上一节的介绍(【拿捏热图/详细注释】pyComplexHeatmap系列(一)之基础绘制之差异基因聚类热图并标注关键基因【拿捏热图/详细注释】pyComplexHeatmap系列(二)之大型复杂注释热图绘制)。气泡热图算是热图形状的一个变形而已,但是却很实用,可以用到很多地方,首先就是我们熟悉的单细胞marker基因图,或者仅仅就是基因表达量展示,或者是相关性热图,基本都是使用ggplot2实现,再者就是富集分析结果的展示。pyComplexHeatmap中实现气泡热图的函数是DotClustermapPlotter,并不是ClusterMapPlotter改变形状后的结果,DotClustermapPlotter的输入数据形式与热图也是不一样的,正常的heatmap需要的是宽数据,而点图需要的长数据,形式与ggplot2/seaborn是一致的。接下来我们从多个方面演示其功能!
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import PyComplexHeatmap
from PyComplexHeatmap import * #导入所有类与函数#加载数据:这个数据基因有点多,选择部分进行演示
df = pd.read_csv('./df_heat.csv',index_col=0)
df = df.iloc[:20]
df#如果是关于基因表达的,或者要类似heatmap那样进行scale展示的数据
#在做点图之前需要先进行scale计算Z-score,因为DotClustermapPlotter没有z-score选项
import pandas as pd
from scipy.stats import zscore
df_exp = df.apply(lambda x: zscore(x, nan_policy='omit'), axis=1)
df_exp = pd.DataFrame(df_exp.tolist(), index=df.index, columns=df.columns)
df_exp#宽数据转化为长数据,
df_plt = df_exp.reset_index().melt(
id_vars='Gene_name',
var_name='sample',
value_name='exp'
)
df_plt = df_plt.rename(columns={'Gene_name': 'gene'})
df_plt.head()#通过基础plot看看参数
plt.figure(figsize=(3, 6))
DotClustermapPlotter(data=df_plt, #需要plot的data数据,长数据格式
x='sample',#x轴
y='gene',#y轴
value='exp',#value
s='exp',#点的大小设置,如果在data数据列有控制点大小的数值,就使用它,如果不需要,则点可以设置为数值统一大小,比如这里
#点的大小可以直接展示表达量高低,如果是单细胞基因表达数据,那么点的大小可以表示为表达比例!
cmap='RedYellowBlue_r',#连续密度颜色
vmax=3,#设置颜色最大值
vmin=-3,#设置颜色最小值
c='exp',#data中用于对点着色的数据列,也可以是单个颜色。
spines=True,#热图添加外边框
marker='o',#用于控制热图内部形状,默认是点图,可以修改Such as '.',',','o','v','^','<','>'
edgecolor='black',#气泡点边框颜色
row_cluster=True,#行列聚类
col_cluster=True,#行列聚类
row_dendrogram=True, #是否展示行聚类树
col_dendrogram=True,#是否展示列聚类树
show_rownames=True,#是否显示行名
show_colnames=True,#是否显示列名
row_names_side='right',#行名位置
col_names_side='bottom',#列名位置
grid=None#不设置背景边线
) 
#添加注释,构建注释文件
sample_group = {
"sample": df.columns.to_list(),
"group": ["HC"] * 6 + ["TL"] * 6,
"age":[20,40,45,29,30,33,35,38,39,50,25,47]
}
sample_group = pd.DataFrame(sample_group)
sample_group = sample_group.set_index(sample_group.columns[0])
sample_group#顶部注释,多层注释
col_ha = HeatmapAnnotation(group=anno_simple(sample_group.group,#分组信息
colors={'HC': 'red', 'TL': 'green'},
legend=True,add_text=False),
age=anno_simple(sample_group.age,#分组信息
legend=True,add_text=False),
verbose=0,label_side='right',label_kws={'horizontalalignment':'left'})#通过基础plot看看参数
plt.figure(figsize=(3, 6))
DotClustermapPlotter(data=df_plt, #需要plot的data数据,长数据格式
x='sample',#x轴
y='gene',#y轴
value='exp',#value
s='exp',#点的大小设置,如果在data数据列有控制点大小的数值,就使用它,如果不需要,则点可以设置为数值统一大小,比如这里
#点的大小可以直接展示表达量高低,如果是单细胞基因表达数据,那么点的大小可以表示为表达比例!
cmap='RedYellowBlue_r',#连续密度颜色
vmax=3,#设置颜色最大值
vmin=-3,#设置颜色最小值
c='exp',#data中用于对点着色的数据列,也可以是单个颜色。
spines=True,#热图添加外边框
marker='o',#用于控制热图内部形状,默认是点图,可以修改Such as '.',',','o','v','^','<','>'
edgecolor='black',#气泡点边框颜色
row_cluster=True,#行列聚类
col_cluster=True,#行列聚类
row_dendrogram=True, #是否展示行聚类树
col_dendrogram=True,#是否展示列聚类树
show_rownames=True,#是否显示行名
show_colnames=True,#是否显示列名
row_names_side='right',#行名位置
col_names_side='bottom',#列名位置
grid=None,#不设置背景边线
top_annotation=col_ha,#顶部注释
legend_gap=7,#legend之间的间距
) 
使用官网教程提供的数据演示
df_corr = pd.read_csv("./kycg_modules_correlations.csv",sep='\t',index_col=0)
df_ann = pd.read_csv("./kycg_modules_annotations.csv",sep='\t',index_col=1)
df_ann=df_ann.loc[df_ann.Module.isin([4,1,3,9,2,39])]
df_ann['Modules']='Module'+df_ann['Module'].astype(str)
df_ann.head()#筛选data
df_corr = df_corr.loc[df_ann.index.to_list(), df_ann.index.to_list()]
df_corr.shape#转化为宽数据
data=df_corr.stack().reset_index()
data.columns=['X','Y','Correlation']
dataplt.figure(figsize=(10, 9))
DotClustermapPlotter(data=data, x='X',y='Y',value='Correlation',c='Correlation',s='Correlation',
cmap='RedYellowBlue_r',
row_dendrogram=True,#聚类
col_split=df_ann.Module,row_split=df_ann.Module, #split热图,按照module
col_split_gap=1,row_split_gap=1,
vmax=1,vmin=-1,#legend 最大最小值
tree_kws=dict(row_cmap='Dark2'),
spines=True
)
#添加注释,添加框选
col_ha = HeatmapAnnotation(
Module=anno_simple(df_ann.Modules,cmap='Dark2',legend=False,height=5,
add_text=True,text_kws={'color':'black','fontsize':10}),
verbose=0,label_side='right',label_kws={'horizontalalignment':'left'})#plot
plt.figure(figsize=(9, 8))
cm = DotClustermapPlotter(data=data, x='X',y='Y',value='Correlation',c='Correlation',
cmap='RedYellowBlue_r',
marker='s',#正常热图形式
row_dendrogram=True,#聚类
col_split=df_ann.Module,row_split=df_ann.Module, #split热图,按照module
col_split_gap=0.2,row_split_gap=0.2,
vmax=1,vmin=-1,#legend 最大最小值
tree_kws=dict(row_cmap='Dark2'),
spines=False,
grid=None,#不设置背景边线
top_annotation=col_ha
)
# plot custom spines
for i in range(cm.heatmap_axes.shape[0]):
for j in range(cm.heatmap_axes.shape[1]):
if i != j:
continue
ax = cm.heatmap_axes[i][j]
for side in ["top", "right", "left", "bottom"]:
ax.spines[side].set_visible(True)
ax.spines[side].set_color('black')
ax.spines[side].set_linewidth(1.5)
plt.show()
觉得我们分享有些用的,点个赞再走呗!