pythonic生物人

matplotlib heatmap自由~

本次分享Python matplotlib实现Heatmap(热图)的效果。

普通heatmap图

普通热图严格来说不属于热图,而是颜色图(Color Image)。其生成过程不涉及数据转换计算,而是将数据简单映射到一个网格矩阵中,然后根据预先指定的颜色序列为网格矩阵中的数据赋予不同的颜色,从而利用颜色深浅来表示数据的大小。

使用上文章节“3.2.6 gene数据集”的数据,利用matplotlib Axes.imshow实现普通热图,下图展示多种colormap效果(参考上文章节“6.11 精讲配色(colors/colormaps)”)


# 数据准备
gene1 = gene.iloc[:15, :]
gene_names = gene1.index
sample_names = gene1.columns
heatmap_data = gene1.values

# 绘制热图(核心代码)
for ax, cmap, title in zip(axes.ravel(), cmaps, titles):
    im = ax.imshow(heatmap_data, cmap=cmap, aspect='auto')  # imshow绘制热图
    ax.set_title(title, fontsize=20)

    ax.set_xticks(np.arange(len(sample_names)))
    ax.set_xticklabels(sample_names, rotation=45, ha="right",
                       fontsize=20)  # 设置x轴标签
    ax.set_yticks(np.arange(len(gene_names)))
    ax.set_yticklabels(gene_names, fontsize=20)  # 设置y轴标签
for i in range(len(gene_names)):
for j in range(len(sample_names)):
            ax.text(j,
                    i,
f'{heatmap_data[i, j]:.2f}',
                    ha="center",
                    va="center",
                    fontsize=18,
                    color="black")  # 在每个格子中添加数值

    cbar = plt.colorbar(im, ax=ax, shrink=0.9)  # 添加colorbar
    cbar.ax.tick_params(labelsize=20)
Image

共享Colorbar Heatmap图

共享Colorbar的Heatmap图是将多个热图中的数据映射到同一个颜色条(Colorbar)上,确保颜色值具有一致性,从而方便直接比较不同热图之间的数值差异和分布,该图通过统一的颜色映射增强了数据的可比性,是分析和展示多组数据的重要工具。

matplotlib通过Figure.colorbar和Axes.imshow绘制共享Colorbar的Heatmap图。


# 绘制热图 (核心代码)

for ax, data in zip(axs.flat, data_subsets):
    im = ax.imshow(data, norm=norm, aspect='auto',
                   cmap='Spectral')  # imshow绘制热图
    images.append(im)
    rows, cols = data.shape
for i in range(rows):
for j in range(cols):
            ax.text(  # 热图每个格子中显示数值
                j,
                i,
f'{data.iloc[i, j]:.2f}',
                ha='center',
                va='center',
                fontsize=20,
                color='black')
    ax.set_title(f"{data.index[0]}-{data.index[-1]}",
                 fontsize=25,
                 color='black')
    ax.set_xticks(np.arange(data.shape[1]))
    ax.set_xticklabels(data.columns, rotation=45, ha="right",
                       fontsize=20)  # 设置x轴标签
    ax.set_yticks(np.arange(data.shape[0]))
    ax.set_yticklabels(data.index, fontsize=20)  # 设置y轴标签

# 添加共享colorbar
cbar_ax = fig.add_axes([0.1, -0.03, 0.8,
0.04])  #设置共享colorbar的left、bottom、width和height
cbar_ax.tick_params(labelsize=20)
fig.colorbar(
    images[0],
    cax=cbar_ax,
    orientation='horizontal'#colorbar方向设置为水平
)  #共享colorbar添加到figure中
Image

多子图Heatmap图

matplotlib通过ImageGrid和Axes.imshow绘制多子图的热图。ImageGrid来自mpl_toolkits.axes_grid1模块,是一个专门用于创建多个子图的工具,常用于展示多个热图等图像。通过灵活设置参数,ImageGrid可以帮助控制子图的排列方式、Colorbar是否共享、xy轴刻度标签的共享以及子图之间的间距,从而简化了多子图热图的绘制过程。


# 绘制热图(核心代码)
grid = axes_grid.ImageGrid(  # ImageGrid替代plt.subplots设置多子图
    fig,
111,  # 设置一个figure
    nrows_ncols=(2, 2),  # 子图的行列数
    axes_pad=0.1,  # 子图间的间隙距离
    cbar_mode=
'single',  # Colorbar共享模式,可设置为 'single'(共享一个Colorbar)或 'each'(每个子图有独立Colorbar)
    cbar_location=
'right',  # Colorbar开启,可设置为'each'(每个子图都开启), 'single'(所有子图共享一个),'edge'(每行共享一个)
    label_mode='L',  # 坐标轴标签开启,可设置为 'L'(左侧和底部)、'1'(仅左侧)或 'all'(每个子图的左侧和底部)
    cbar_size="4%",  # Colorbar大小,按百分比设置
)

vmin = min(data.values.min()
for data in data_subsets)  # 设置数据的最小值,保证所有子图共享相同的颜色映射
vmax = max(data.values.max()
for data in data_subsets)  # 设置数据的最大值,保证所有子图共享相同的颜色映射
norm = colors.Normalize(vmin=vmin, vmax=vmax)

for ax, data in zip(grid, data_subsets):
    im = ax.imshow(data, norm=norm, aspect='auto',
                   cmap='Spectral')  # 在ImageGrid创建的子图中,使用imshow绘制热图
    rows, cols = data.shape
for i in range(rows):
for j in range(cols):
            ax.text(j,
                    i,
f'{data.iloc[i, j]:.2f}',
                    ha='center',
                    va='center',
                    fontsize=6,
                    color='black')  # 每个格子添加数值
    ax.set_xticks(np.arange(data.shape[1]))
    ax.set_xticklabels(data.columns, rotation=45, ha="right",
                       fontsize=6)  # 设置x轴刻度标签
    ax.set_yticks(np.arange(data.shape[0]))
    ax.set_yticklabels(data.index, fontsize=6)  # 设置x轴刻度标签

cbar = grid.cbar_axes[0].colorbar(im)
cbar.ax.set_position([0.8, 0.1, 0.1, 0.8])  # 调整Colorbar的位置
cbar.ax.tick_params(labelsize=5)
Image

-END-

节选自:👉保姆级matplotlib教程—详细目录

交流学习(备注399)

图片