编程学习网 > 编程语言 > Python > Python绘图——Seaborn绘制热图教程
2023
09-07

Python绘图——Seaborn绘制热图教程

之前我们已经学习过利用matplotlib绘制热图,这一节我们将主要学习利用Seaborn绘制热图并可以对样本进行聚类。并设置聚类标签。”


之前我们有学习过利用matplotlib绘制热图,比如:
import numpy as np
import matplotlib.pyplot as plt

# 创建模拟数据
data = np.random.rand(5, 5)

# 设置行和列标签
row_labels = ['Row 1', 'Row 2', 'Row 3', 'Row 4', 'Row 5']
col_labels = ['Col 1', 'Col 2', 'Col 3', 'Col 4', 'Col 5']

# 创建热图
plt.imshow(data, cmap='coolwarm', aspect='auto')

# 添加行和列标签
plt.xticks(range(len(col_labels)), col_labels)
plt.yticks(range(len(row_labels)), row_labels)

# 添加颜色条
plt.colorbar()

# 添加标题和标签
plt.title('Heatmap Example')
plt.xlabel('Columns')
plt.ylabel('Rows')

# 显示图像
plt.show()

输出:

但有时这种绘图方式满足不了我们的需求,比如我们在进行转录组数据分析时,希望将其聚类结果一并进行展示,这时候我们就需要使用Seaborn进行绘制。

Seaborn 是一个基于 Matplotlib 的数据可视化库,专注于为统计数据和信息可视化提供更高层次的界面。它提供了一些独特的绘图样式和功能,可以更轻松地创建各种统计图表、热图、分布图、回归图等。
import seaborn as sns
import matplotlib.pyplot as plt

expression_data = [
    [10, 15, 12, 18, 22],
    [5, 8, 9, 10, 12],
    [15, 20, 18, 22, 25],
    [8, 10, 14, 16, 20]
]

# 样本标签和基因名称
sample_labels = ['Sample 1', 'Sample 2', 'Sample 3', 'Sample 4', 'Sample 5']
gene_labels = ['Gene A', 'Gene B', 'Gene C', 'Gene D']

# 创建热图
sns.set()
plt.figure(figsize=(10, 6))
sns.heatmap(expression_data, annot=True, fmt="d", cmap="YlGnBu", xticklabels=sample_labels, yticklabels=gene_labels)
plt.title("Expression Heatmap")
plt.xlabel("Samples")
plt.ylabel("Genes")
plt.show()
输出:


在这里我们首先创建了一组数据,并为其设置行列名称,使用sns.heatmap()函数绘制热图,在sns.heatmap函数中有以下几个参数用于设置热图的一些属性:

sns.heatmap(data, annot=None, fmt=".2g", cmap="viridis", center=None, robust=False, square=False, linewidths=0.5, cbar=True, ax=None, **kwargs)

data: 要绘制的数据,可以是二维数组或类似于 Pandas DataFrame 的数据结构。
annot: 控制是否在热图上显示数据标签(数值),默认为 None。可以设置为 True(显示数值)、False(不显示数值)或传入一个与数据形状相同的二维数组,用于自定义标签。
fmt: 标签的格式字符串,用于格式化显示的数据标签。默认为 ".2g",表示以浮点数格式显示,保留小数点后两位。‘d’表示整数
cmap: 颜色映射,用于将数据的值映射到颜色。Seaborn 提供了多种预定义的颜色映射,如 "viridis"、"coolwarm"、"YlGnBu" 等。
center: 将颜色映射的中心值设置为指定值。默认为 None,表示使用数据的中间值作为中心。
robust: 控制是否使用数据的中位数和四分位数来计算颜色映射范围。默认为 False。
square: 是否将图形设置为正方形。默认为 False。
linewidths: 矩阵中单元格之间的分隔线的宽度。默认为 0.5。
cbar: 是否显示颜色条(颜色映射图例)。默认为 True。
ax: 用于绘制热图的 Matplotlib 坐标轴。如果不指定,将使用当前活动的坐标轴。
**kwargs: 其他关键字参数,用于进一步自定义热图的样式和属性。

了解了这些函数的意义我们就可以绘制出自己想要的热图了。

对热图进行聚类

在seaborn中支持将热图进行聚类,使用sns.clustermap()进行聚类:
import seaborn as sns
import matplotlib.pyplot as plt

expression_data = [
    [10, 15, 12, 18, 22],
    [5, 8, 9, 10, 12],
    [15, 20, 18, 22, 25],
    [8, 10, 14, 16, 20]
]

sample_labels = ['Sample 1', 'Sample 2', 'Sample 3', 'Sample 4', 'Sample 5']
gene_labels = ['Gene A', 'Gene B', 'Gene C', 'Gene D']

# 创建聚类热图
sns.set()
sns.clustermap(expression_data, cmap="viridis", annot=True, fmt="d", row_cluster=True, col_cluster=True,
               xticklabels=sample_labels, yticklabels=gene_labels)

plt.title("Expression Heatmap with Clustering")
plt.show()
输出:

在 sns.clustermap参数中除了可以向heatmap中设置图形的属性,还可以设置聚类相关的参数:
method: 用于计算层次聚类的方法。可以是 "single"、"complete"、"average" 等,默认为 "average"。
metric: 用于计算距离的度量方法。可以是 "euclidean"、"cosine"、"correlation" 等,默认为 "euclidean"。
z_score: 是否对数据进行 Z 分数标准化。默认为 None,表示不进行标准化。
standard_scale: 是否对数据进行标准化,使得每行的数据均值为 0,标准差为 1。默认为 None,表示不进行标准化。
figsize: 图形的大小,可以是元组 (width, height)。
cbar_kws: 颜色条(颜色映射图例)的关键字参数。
row_cluster 和 col_cluster: 是否对行和列进行聚类。默认都为 True。
row_colors 和 col_colors: 行和列的颜色,可以是 Pandas DataFrame 或类似的数据结构。
dendrogram_ratio: 控制行和列聚类树的宽度。默认为 (0.2, 0.2),分别表示行和列聚类树的宽度。
colors_ratio: 控制行和列的颜色标签的宽度。默认为 0.03。
cbar_pos: 颜色条的位置和大小。默认为 (0, 0.2, 0.03, 0.4),分别表示左边距、底边距、宽度和高度。
tree_kws: 层次聚类树的关键字参数。

这样我们就可以根据自己想要的聚类方式进行聚类了。

添加聚类标签


我们可以利用plt.setp设置热图的label,以及clustermap.ax_col_dendrogram.set_title函数用来设置聚类的标签:
import seaborn as sns
import matplotlib.pyplot as plt

expression_data = [
    [10, 15, 12, 18, 22],
    [5, 8, 9, 10, 12],
    [15, 20, 18, 22, 25],
    [8, 10, 14, 16, 20]
]

sample_labels = ['Sample 1', 'Sample 2', 'Sample 3', 'Sample 4', 'Sample 5']
gene_labels = ['Gene A', 'Gene B', 'Gene C', 'Gene D']

plt.figure(figsize=(10, 8))
sns.set(font_scale=1.2)
clustermap = sns.clustermap(expression_data, cmap="viridis", annot=True, fmt="d", row_cluster=True, col_cluster=True,
                            xticklabels=sample_labels, yticklabels=gene_labels)

plt.title("Expression Heatmap with Clustering")
plt.xlabel("Samples")
plt.ylabel("Genes")


# 调整行和列标签旋转
plt.setp(clustermap.ax_heatmap.get_xticklabels(), rotation=45, ha="right")
plt.setp(clustermap.ax_heatmap.get_yticklabels(), rotation=0)

# 添加聚类标签
clustermap.ax_col_dendrogram.set_title("Sample Clustering",fontdict={'fontsize': 14})
clustermap.ax_row_dendrogram.set_title("Gene Clustering",fontdict={'fontsize': 14},rotation="vertical")

plt.show()
输出:



这里就体现出一个问题,当我们使用clustermap.ax_col_dendrogram.set_title函数设置列聚类标题时是没有问题的,但是如果我们设置行聚类标题是会发现其会在列聚类图的侧边显示,并不是我们想要的位置,这时我们可以使用另一种方法进行实现:
import seaborn as sns
import matplotlib.pyplot as plt

expression_data = [
    [10, 15, 12, 18, 22],
    [5, 8, 9, 10, 12],
    [15, 20, 18, 22, 25],
    [8, 10, 14, 16, 20]
]

sample_labels = ['Sample 1', 'Sample 2', 'Sample 3', 'Sample 4', 'Sample 5']
gene_labels = ['Gene A', 'Gene B', 'Gene C', 'Gene D']

plt.figure(figsize=(10, 8))
sns.set(font_scale=1.2)
clustermap = sns.clustermap(expression_data, cmap="viridis", annot=True, fmt="d", row_cluster=True, col_cluster=True,
                            xticklabels=sample_labels, yticklabels=gene_labels)

plt.title("Expression Heatmap with Clustering")
plt.xlabel("Samples")
plt.ylabel("Genes")


# 调整行和列标签旋转
plt.setp(clustermap.ax_heatmap.get_xticklabels(), rotation=45, ha="right")
plt.setp(clustermap.ax_heatmap.get_yticklabels(), rotation=0)

# 添加聚类标签
clustermap.ax_col_dendrogram.set_title("Sample Clustering",fontdict={'fontsize': 14})

plt.figtext(0, 0.4, "Gene Clustering", fontsize=14, ha="center", rotation="vertical")

plt.show()

输出:


plt.figtext的前两个参数代表你添加的标签的位置(相对于整个图像的xy,第三个参数为添加的标签内容,fontsize设置字符大小,ha="center"设置处在中间位置,rotation="vertical"将其变为垂直格式。

以上就是Python绘图——Seaborn绘制热图教程的详细内容,想要了解更多Python教程欢迎持续关注编程学习网。

扫码二维码 获取免费视频学习资料

Python编程学习

查 看2022高级编程视频教程免费获取