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)
共享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中
多子图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)
-END-
节选自:👉保姆级matplotlib教程—详细目录
交流学习(备注399)