跳过正文

Python作图-Heatmap

·2 分钟
目录

本文用于记录笔者在使用seaborn绘制heatmap中遇到的一些问题和解决方法。

完整的代码如下所示:

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
import matplotlib.ticker as ticker
sns.set_theme(style="white")

mat = np.random.rand(68*68)
mat = mat.reshape((68, 68))
labels = pd.DataFrame({'Name': range(1, 69)})


cmap = sns.color_palette('flare', as_cmap=True)

font = fm.FontProperties(fname='Resource/font/calibri.ttf')

p = sns.heatmap(
    mat,
    mask=(mat==0),
    cmap=cmap,
    square=True,
    xticklabels=True,
    yticklabels=True,
    center=0.75,
    vmin=0.5)

ax = p.figure.axes[0]
ax.axvline(34, color='k', alpha=0.8, linestyle='-', linewidth=0.8)
ax.axhline(34, color='k', alpha=0.8, linestyle='-', linewidth=0.8)
ax.set_title('Title of Heatmap', fontproperties=font, fontsize=14)
ax.set_xticklabels(labels['Name'], fontproperties=font, fontsize=4)
ax.set_yticklabels(labels['Name'], fontproperties=font, fontsize=4)

barax = p.figure.axes[1]
barax.set_ylabel('Mean Value', fontproperties=font, fontsize=12)
barticks = barax.get_yticks()
tickformat = '{:.1f}'
barax.yaxis.set_major_locator(ticker.FixedLocator(barticks))
barax.set_yticklabels([tickformat.format(x) for x in barticks], fontproperties=font, fontsize=10)
barax.tick_params(direction='in', width=0)

plt.savefig('demo.png', bbox_inches='tight', dpi=500)

图1. 示例结果

解释
#

导入相关包:

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
import matplotlib.ticker as ticker
# 设置显示主题
sns.set_theme(style="white")

数据准备:

# 生成68x68的随机数矩阵
mat = np.random.rand(68*68)
mat = mat.reshape((68, 68))
# 热图标签
labels = pd.DataFrame({'Name': range(1, 69)})

颜色映射:

cmap = sns.color_palette('flare', as_cmap=True)

选择matplotlib中的flare配色。如图2所示。


图2. flare配色

字体设置:

font = fm.FontProperties(fname='Resource/font/calibri.ttf')

fname为自定义字体存放位置。

绘图:

p = sns.heatmap(
    mat,
    mask=(mat==0),
    cmap=cmap,
    square=True,
    xticklabels=True,
    yticklabels=True,
    center=0.75,
    vmin=0.5)

mat为显示的矩阵;mask是和mat相同大小的0/1矩阵,其中1表示相应位置不在热图中显示;cmap为颜色映射;square为True表示设置热图中每个小格子为正方形;xticklabels和yticklabels为True表示显示热图横纵坐标轴标尺标签;center表示Colorbar中心处颜色对应的数值;vmin为Colorbar中最低颜色对应的数值。

热图区域设置:

# 获取矩形图对象
ax = p.figure.axes[0]
# 添加竖直线x=34
ax.axvline(34, color='k', alpha=0.8, linestyle='-', linewidth=0.8)
# 添加水平线y=34
ax.axhline(34, color='k', alpha=0.8, linestyle='-', linewidth=0.8)
# 设置标题,并应用自定义字体
ax.set_title('Title of Heatmap', fontproperties=font, fontsize=14)
# 设置横纵坐标轴标尺标签,并应用自定义字体
ax.set_xticklabels(labels['Name'], fontproperties=font, fontsize=4)
ax.set_yticklabels(labels['Name'], fontproperties=font, fontsize=4)

该figure中包含两个axes,第一个是矩形图本身,第二个axes是Colorbar的区域。

Colorbar设置:

# 获取Colorbar对象
barax = p.figure.axes[1]
# 设置Colorbar标题
barax.set_ylabel('Mean Value', fontproperties=font, fontsize=12)
# 获取Colorbar中y轴标尺
barticks = barax.get_yticks()
# 标尺显示数字格式为保留1位小数位的浮点数
tickformat = '{:.1f}'
# 设置y轴标尺,并设置其标签,字体自定义
barax.yaxis.set_major_locator(ticker.FixedLocator(barticks))
barax.set_yticklabels([tickformat.format(x) for x in barticks], fontproperties=font, fontsize=10)
# 设置标尺形状,即坐标轴数字对应的短线。这里为了美观,不显示标尺短线。
barax.tick_params(direction='in', width=0)

保存图片:

# 保存图片,并设为dpi为500
plt.savefig('demo.png', bbox_inches='tight', dpi=500)