sns.heatmap详解

发布时间:2023-05-21

sns.heatmap 参数详解

一、sns.heatmap参数

sns.heatmap 是一个数据可视化函数,用于绘制矩阵数据的热图。它有很多参数可以用于调整图形样式和呈现方式。这里介绍几个常用的参数:

import seaborn as sns
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(10, 10))
sns.heatmap(df, cmap='coolwarm', annot=True, fmt='.2f', linewidths=.5)
  1. data: 需要展示的数据,可以是 DataFrame 或 numpy 数组
  2. cmap: 颜色映射表,设置热图的颜色主题。它可以是内置颜色映射表(如 'coolwarm''viridis''mako''rocket''copper' 等),也可以是自定义的颜色列表
  3. annot: 是否显示每个单元格的数值
  4. fmt: 数值格式,用于控制 annot 参数输出数值的格式
  5. linewidths: 热图中每个矩形之间的间隔线宽度

二、sns.heatmap 合并颜色带

热图中的颜色带用于表示数据值的大小,不同的颜色带代表不同的数据范围。有时候,可能需要将两个热图的颜色带合并为一个颜色带,以便进行比较。sns.heatmap 提供了 vminvmax 参数,用于将不同数据范围内的颜色值映射到相同的颜色带上。

df1 = pd.DataFrame(np.random.randn(10, 10))
df2 = pd.DataFrame(np.random.randn(10, 10))
plt.figure(figsize=(8, 6))
plt.subplot(1, 2, 1)
sns.heatmap(df1, cmap='coolwarm', annot=True, fmt='.2f', linewidths=.5)
plt.subplot(1, 2, 2)
sns.heatmap(df2, cmap='coolwarm', annot=True, fmt='.2f', linewidths=.5, vmin=-1, vmax=1)
plt.show()

2 个热图颜色带合并之前: 2 个热图颜色带合并之后:

三、sns.heatmap 函数

sns.heatmap 函数可以接收一些关键字参数,用于控制热图的外观和响应式。例如,我们可以使用 xticklabelsyticklabels 参数来更改 X 和 Y 轴上的标签。

df = pd.DataFrame(np.random.randn(10, 10), columns=[f'col{i}' for i in range(10)], 
                  index=[f'row{i}' for i in range(10)])
sns.heatmap(df, cmap='coolwarm', annot=True, fmt='.2f', linewidths=.5, xticklabels=[f'col{i}' for i in range(10)],
           yticklabels=[f'row{i}' for i in range(10)])
plt.show()

热图外观控制示例图:

四、sns.heatmap 作用

sns.heatmap 函数主要用于可视化矩阵数据的热图,用不同的颜色表示数据的大小,颜色越亮则表示数据越大,颜色越暗则表示数据越小。 例如,设置颜色映射表为 'coolwarm',则大于 0 的数值显示为红色,小于 0 的数值显示为蓝色,0 的数值显示为中间的白色。

df = pd.DataFrame(np.random.randn(10, 10))
sns.heatmap(df, cmap='coolwarm', annot=True, fmt='.2f', linewidths=.5)
plt.show()

热图应用示例图:

五、sns.heatmap 字体大小

sns.heatmap 函数可以设置字体的大小,通过修改字体的大小,我们可以让热图更加美观,易于阅读。

df = pd.DataFrame(np.random.randn(10, 10))
sns.heatmap(df, cmap='coolwarm', annot=True, fmt='.2f', linewidths=.5, annot_kws={'size': 12})
plt.show()

热图字体大小示例图:

六、sns.heatmap 中文列名

sns.heatmap 函数默认使用英文字母作为列名,但是有时候我们需要使用中文作为列名,这时候需要更改列名并设置 xticklabels 参数。

df = pd.DataFrame(np.random.randn(10, 10), columns=[f'列{i}' for i in range(10)])
sns.heatmap(df, cmap='coolwarm', annot=True, fmt='.2f', linewidths=.5, 
            xticklabels=df.columns, yticklabels=[f'行{i}' for i in range(10)],)
plt.show()

热图中文列名示例图:

七、sns.heatmap 中文标题

sns.heatmap 函数可以设置热图的标题,根据热图的应用场景,设置对应的标题显得更为严谨。

df = pd.DataFrame(np.random.randn(10, 10), columns=[f'col{i}' for i in range(10)], 
                  index=[f'row{i}' for i in range(10)])
plt.figure(figsize=(8, 6))
sns.heatmap(df, cmap='coolwarm', annot=True, fmt='.2f', linewidths=.5, xticklabels=[f'col{i}' for i in range(10)],
           yticklabels=[f'row{i}' for i in range(10)])
plt.title('热图示例', fontsize=16)
plt.show()

热图中文标题示例图:

八、sns.heatmap 共用颜色条

如果在同一画布上绘制多个热图,可能需要共用相同的颜色条。sns.heatmap 函数提供了 cbar 参数来实现。

df1 = pd.DataFrame(np.random.randn(10, 10))
df2 = pd.DataFrame(np.random.randn(10, 10))
plt.figure(figsize=(8, 6))
plt.subplot(1, 2, 1)
sns.heatmap(df1, cmap='coolwarm', annot=True, fmt='.2f', linewidths=.5)
plt.subplot(1, 2, 2)
sns.heatmap(df2, cmap='coolwarm', annot=True, fmt='.2f', linewidths=.5, cbar=False)
plt.subplots_adjust(wspace=0.5)
plt.show()

多个热图共用颜色条示例图:

九、sns.heatmap 标记目标值

我们可以使用 mask 参数来标记矩阵的某些区域。例如,标记所有小于 0 的值为红色,大于等于 0 的值为绿色。

df = pd.DataFrame(np.random.randn(10, 10))
mask = np.zeros_like(df)
mask[df < 0] = True
sns.heatmap(df, cmap='coolwarm', annot=True, fmt='.2f', linewidths=.5, mask=mask)
plt.show()

热图标记目标值示例图:

十、sns.heatmap cmap 选取

cmapsns.heatmap 函数中的一个参数,用于指定颜色映射表。不同的颜色映射表可以反映不同的数据特征,选择合适的颜色映射表非常重要。Matplotlib 提供了一些内置的颜色映射表,包括 'viridis''plasma''inferno''magma' 等,可以根据数据特点来选取合适的颜色映射表。

df = pd.DataFrame(np.random.randn(10, 10))
plt.figure(figsize=(8, 6))
plt.subplot(2, 2, 1)
sns.heatmap(df, cmap='viridis', annot=True, fmt='.2f', linewidths=.5)
plt.subplot(2, 2, 2)
sns.heatmap(df, cmap='plasma', annot=True, fmt='.2f', linewidths=.5)
plt.subplot(2, 2, 3)
sns.heatmap(df, cmap='inferno', annot=True, fmt='.2f', linewidths=.5)
plt.subplot(2, 2, 4)
sns.heatmap(df, cmap='magma', annot=True, fmt='.2f', linewidths=.5)
plt.subplots_adjust(wspace=0.5, hspace=0.5)
plt.show()

不同颜色映射表的示例图: