Seaborn 热力图

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()

运行之后,效果如下图所示。

Seaborn 热力图

分析:

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 热力图案例

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

Seaborn 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()

运行之后,效果如下图所示。

Seaborn 基本热力图

分析:

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()

运行之后,效果如下图所示。

Seaborn 热力图调换位置

分析:

如果想要调换 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()

运行之后,效果如下图所示。

Seaborn 热力图显示数据

分析:

如果想要给每一个单元格都写上对应的数据,我们可以使用 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()

运行之后,效果如下图所示。

Seaborn 热力图改变颜色风格

分析:

对于热力图,如果想要使用不同的颜色风格,我们可以使用 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()

运行之后,效果如下图所示。

Seaborn 热力图添加间距

分析:

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

sns.heatmap(data=df, cbar=False)

Seaborn 热力图隐藏颜色条

对于绘制一个热力图,使用 Matplotlib 实现起来是非常麻烦的,而使用 Seaborn 几句代码就可以轻松实现。从这一节我们也可以非常深刻地感受到,Seaborn 比 Matplotlib 更加的简单好用。

最后,我们来总结一下 heatmap() 函数的参数,常用的如下表所示。

heatmap() 函数的参数
参数 说明
data 数据部分(二维)
annot 添加注释文本,True 或 False
fmt 定义数据格式
cmap 定义颜色风格
linewidth 添加间距
cbar 显示颜色条,True 或 False

上一篇: Seaborn 箱线图

下一篇: Seaborn 核密度图

给站长反馈

绿叶网正在不断完善中,小伙伴们如果发现任何问题,还望多多给站长反馈,谢谢!

邮箱:lvyenet@vip.qq.com

「绿叶网」服务号
绿叶网服务号放大
关注服务号,微信也能看教程。
绿叶网服务号