Seaborn 热力图函数
在 Seaborn 中,我们可以使用 heatmap() 函数来绘制一个热力图。热力图的主要作用是:以高亮的方式来显示区域的密度情况,以展示数据的差异性。
语法:
sns.heatmap(data)说明:
参数 data 是热力图的数据部分,它要求是一个二维数据,比如二维列表、二维数组、DataFrame 等。
示例 1:Seaborn 绘制热力图
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
# 设置
sns.set_theme(rc={'font.sans-serif': 'SimHei', 'axes.unicode_minus': False})
# 数据
arr = np.random.randint(0, 100, size=(10, 10))
# 绘图
sns.heatmap(data=arr)
# 显示
plt.show()运行之后,效果如下图所示。

分析:
np.random.randint(0, 100, size=(10, 10)) 用于生成一个 10 × 10 的二维数组,该数组的每一个元素都是 0 ~ 100 之间的随机数。对于 NumPy 的使用,它属于数据分析的内容,小伙伴们自行回去复习一下。
默认情况下,热力图的 x 轴和 y 轴的刻度表示第几个方块。比如 0 表示第 1 个方块,1 表示第 2 个方块,以此类推。当然了,如果数据部分是 DataFrame,那么 Seaborn 会自动添加对应的刻度。
对于热力图来说,颜色的深浅表示数据的大小。我们要特别注意,并非颜色越深,数据就越大。对于颜色深浅对应的数据大小,我们要严格参考右侧的颜色条。就拿上面这个例子来说,它其实是颜色越浅,数据越大。
另外需要说明的是,y 轴的第 1 个方块在上面,而不是在下面。换一句话来说,热力图的坐标系的 y 轴正方向是向下的,如下图所示。

Seaborn 热力图案例
Seaborn 内置了一个数据集 flights,该数据集保存的是某航空公司 1949 ~ 1960 这 12 年内每个月的乘客人数,部分数据如下图所示。其中,我们可以使用 sns.load_dataset('flights') 来加载并使用这个数据集。

示例 2:基本热力图
import matplotlib.pyplot as plt
import seaborn as sns
# 设置
sns.set_theme(rc={'font.sans-serif': 'SimHei', 'axes.unicode_minus': False})
# 加载数据
df = sns.load_dataset('flights')
# 重命名列
df.rename(columns={'year': '年份', 'month': '月份', 'passengers': '人数'}, inplace=True)
# 重构 DataFrame(透视表)
df = df.pivot_table(index='年份', columns='月份', values='人数', observed=True)
# 绘制图表
sns.heatmap(data=df)
# 显示
plt.show()运行之后,效果如下图所示。

分析:
df = df.pivot_table(index='年份', columns='月份', values='人数', observed=True)上面这一句代码表示使用透视表的方式(即 pivot_table() 方法)将 df 进行重构,此时使用 print(df) 打印,结果如下:
月份 Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
年份
1949 112.0 118.0 132.0 129.0 121.0 135.0 148.0 148.0 136.0 119.0 104.0 118.0
1950 115.0 126.0 141.0 135.0 125.0 149.0 170.0 170.0 158.0 133.0 114.0 140.0
1951 145.0 150.0 178.0 163.0 172.0 178.0 199.0 199.0 184.0 162.0 146.0 166.0
1952 171.0 180.0 193.0 181.0 183.0 218.0 230.0 242.0 209.0 191.0 172.0 194.0
1953 196.0 196.0 236.0 235.0 229.0 243.0 264.0 272.0 237.0 211.0 180.0 201.0
1954 204.0 188.0 235.0 227.0 234.0 264.0 302.0 293.0 259.0 229.0 203.0 229.0
1955 242.0 233.0 267.0 269.0 270.0 315.0 364.0 347.0 312.0 274.0 237.0 278.0
1956 284.0 277.0 317.0 313.0 318.0 374.0 413.0 405.0 355.0 306.0 271.0 306.0
1957 315.0 301.0 356.0 348.0 355.0 422.0 465.0 467.0 404.0 347.0 305.0 336.0
1958 340.0 318.0 362.0 348.0 363.0 435.0 491.0 505.0 404.0 359.0 310.0 337.0
1959 360.0 342.0 406.0 396.0 420.0 472.0 548.0 559.0 463.0 407.0 362.0 405.0
1960 417.0 391.0 419.0 461.0 472.0 535.0 622.0 606.0 508.0 461.0 390.0 432.0对于 heatmap() 函数来说,如果它的数据是一个 DataFrame,那么 index(行名)就会成为 x 轴坐标刻度,columns(列名)就会成为 y 轴坐标刻度,而 values 就会成为小方块部分。
示例 3:调换位置
import matplotlib.pyplot as plt
import seaborn as sns
# 设置
sns.set_theme(rc={'font.sans-serif': 'SimHei', 'axes.unicode_minus': False})
# 加载数据
df = sns.load_dataset('flights')
# 重命名列
df.rename(columns={'year': '年份', 'month': '月份', 'passengers': '人数'}, inplace=True)
# 重构 DataFrame(透视表)
df = df.pivot_table(index='年份', columns='月份', values='人数', observed=True)
# 行列转置
df = df.T
# 绘制图表
sns.heatmap(data=df)
# 显示
plt.show()运行之后,效果如下图所示。

分析:
如果想要调换 x 轴和 y 轴的位置,我们可以使用 DataFrame 中的行列转置(即 T 属性)来实现,非常的简单。
示例 4:添加注释(显示数据)
import matplotlib.pyplot as plt
import seaborn as sns
# 设置
sns.set_theme(rc={'font.sans-serif': 'SimHei', 'axes.unicode_minus': False})
# 加载数据
df = sns.load_dataset('flights')
# 重命名列
df.rename(columns={'year': '年份', 'month': '月份', 'passengers': '人数'}, inplace=True)
# 重构 DataFrame(透视表)
df = df.pivot_table(index='年份', columns='月份', values='人数', observed=True)
# 行列转置
df = df.T
# 绘制图表
sns.heatmap(data=df, annot=True, fmt='.0f')
# 显示
plt.show()运行之后,效果如下图所示。

分析:
如果想要给每一个单元格都写上对应的数据,我们可以使用 annot=True 这个参数来实现。其中,annot 是 “annotate(注释)” 的缩写。
此外,对于 sns.heatmap(data=df, annot=True, fmt='.0f') 这一句代码来说,fmt='.0f' 表示使用 “0 位小数” 的数据(即整数)。如果把 fmt='.0f' 删除,就会使用默认的浮点数来表示。小伙伴们可以自行测试一下。
示例 5:颜色风格
import matplotlib.pyplot as plt
import seaborn as sns
# 设置
sns.set_theme(rc={'font.sans-serif': 'SimHei', 'axes.unicode_minus': False})
# 加载数据
df = sns.load_dataset('flights')
# 重命名列
df.rename(columns={'year': '年份', 'month': '月份', 'passengers': '人数'}, inplace=True)
# 重构 DataFrame(透视表)
df = df.pivot_table(index='年份', columns='月份', values='人数', observed=True)
# 行列转置
df = df.T
# 绘制图表
sns.heatmap(data=df, cmap='YlGnBu')
# 显示
plt.show()运行之后,效果如下图所示。

分析:
对于热力图,如果想要使用不同的颜色风格,我们可以使用 cmap 这个参数来实现。其中,cmap 是 “color map” 的缩写。对于 cmap 参数,它的取值为 Matplotlib 中的 colormap。当然了,对于颜色风格,我们在后面 “Seaborn 调色板” 这一节也会详细介绍。
我们都知道,在默认情况下,Seaborn 中的热力图都是 “颜色越深,数据越小”。如果想要使得 “颜色越深,数据越大”,我们就可以使用 cmap 这个参数来设置。
示例 6:自定义样式
import matplotlib.pyplot as plt
import seaborn as sns
# 设置
sns.set_theme(rc={'font.sans-serif': 'SimHei', 'axes.unicode_minus': False})
# 加载数据
df = sns.load_dataset('flights')
# 重命名列
df.rename(columns={'year': '年份', 'month': '月份', 'passengers': '人数'}, inplace=True)
# 重构 DataFrame(透视表)
df = df.pivot_table(index='年份', columns='月份', values='人数', observed=True)
# 行列转置
df = df.T
# 绘制图表
sns.heatmap(data=df, linewidth=0.5)
# 显示
plt.show()运行之后,效果如下图所示。

分析:
如果想要给单元格之间添加间距,我们可以使用 linewidth 这个参数来实现。如果我们不需要右侧的颜色条,可以设置 cbar=False。修改后的代码如下,此时效果如下图所示。
sns.heatmap(data=df, cbar=False)

对于绘制一个热力图,使用 Matplotlib 实现起来是非常麻烦的,而使用 Seaborn 几句代码就可以轻松实现。从这一节我们也可以非常深刻地感受到,Seaborn 比 Matplotlib 更加的简单好用。
最后,我们来总结一下 heatmap() 函数的参数,常用的如下表所示。
| 参数 | 说明 |
|---|---|
| data | 数据部分(二维) |
| annot | 添加注释文本,True 或 False |
| fmt | 定义数据格式 |
| cmap | 定义颜色风格 |
| linewidth | 添加间距 |
| cbar | 显示颜色条,True 或 False |
