首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【拿捏热图/详细注释】pyComplexHeatmap系列(三)之气泡热图绘制

【拿捏热图/详细注释】pyComplexHeatmap系列(三)之气泡热图绘制

作者头像
KS科研分享与服务-TS的美梦
发布2025-12-20 17:22:35
发布2025-12-20 17:22:35
1020
举报

接着上一节的介绍(【拿捏热图/详细注释】pyComplexHeatmap系列(一)之基础绘制之差异基因聚类热图并标注关键基因【拿捏热图/详细注释】pyComplexHeatmap系列(二)之大型复杂注释热图绘制)。气泡热图算是热图形状的一个变形而已,但是却很实用,可以用到很多地方,首先就是我们熟悉的单细胞marker基因图,或者仅仅就是基因表达量展示,或者是相关性热图,基本都是使用ggplot2实现,再者就是富集分析结果的展示。pyComplexHeatmap中实现气泡热图的函数是DotClustermapPlotter,并不是ClusterMapPlotter改变形状后的结果,DotClustermapPlotter的输入数据形式与热图也是不一样的,正常的heatmap需要的是宽数据,而点图需要的长数据,形式与ggplot2/seaborn是一致的。接下来我们从多个方面演示其功能!

基因表达气泡图:

代码语言:javascript
复制
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import PyComplexHeatmap
from PyComplexHeatmap import * #导入所有类与函数
代码语言:javascript
复制
#加载数据:这个数据基因有点多,选择部分进行演示
df = pd.read_csv('./df_heat.csv',index_col=0)
df = df.iloc[:20]
df
代码语言:javascript
复制
#如果是关于基因表达的,或者要类似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
代码语言:javascript
复制
#宽数据转化为长数据,
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()
代码语言:javascript
复制
#通过基础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#不设置背景边线

                    ) 
代码语言:javascript
复制
#添加注释,构建注释文件
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
代码语言:javascript
复制
#顶部注释,多层注释
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'})
代码语言:javascript
复制
#通过基础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之间的间距

                    ) 

相关性热图绘制:

使用官网教程提供的数据演示

代码语言:javascript
复制
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)
代码语言:javascript
复制
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()
代码语言:javascript
复制
#筛选data
df_corr = df_corr.loc[df_ann.index.to_list(), df_ann.index.to_list()]
df_corr.shape
代码语言:javascript
复制
#转化为宽数据
data=df_corr.stack().reset_index()
data.columns=['X','Y','Correlation']
data
代码语言:javascript
复制
plt.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
                    )
代码语言:javascript
复制
#添加注释,添加框选
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'})
代码语言:javascript
复制
#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()

觉得我们分享有些用的,点个赞再走呗!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-11-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 KS科研分享与服务 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 基因表达气泡图:
  • 相关性热图绘制:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档