热力图和子图的绘制
知识点:热力图和子图的绘制
1.介绍了热力图的绘制方法
2.介绍了enumerate()
函数
3.介绍了子图的绘制方法
作业:
尝试对着心脏病数据集绘制热力图和单特征分布的大图(包含几个子图)
笔记:
1. 热力图的绘制方法
热力图是通过颜色深浅来直观展示数据矩阵中数值大小的图表,常用语展示相关性矩阵、混淆矩阵等。在python中,常用的绘制库是seaborn
和matplotlib
。
绘制步骤
- 准备数据: 先通过
corr()
函数来计算数据集的相关系数矩阵,corr()
通常用于特征选择(分析自变量与因变量的相关性)、多重共线性检测(分析自变量之间的相关性)、探索数据中潜在的关联模式。corr()
函数的参数说明如下:
method
:指定相关系数的计算方法(默认'pearson'
):'pearson'
:皮尔逊相关系数(最常用,适用于线性相关)。'kendall'
:肯德尔等级相关系数(适用于有序分类数据)。'spearman'
:斯皮尔曼等级相关系数(适用于非线性或有序数据)。
min_periods
:计算相关系数所需的最小非缺失值数量(默认 1)。- 结果解释:
- 相关系数的取值范围是 [-1, 1]:
- 接近 1:强正相关(一个变量增加,另一个变量也增加)。
- 接近 -1:强负相关(一个变量增加,另一个变量减少)。
- 接近 0:几乎无线性相关。
- 对角线元素恒为 1(变量与自身的相关性)。
- 矩阵是对称的(A与B的相关性 = B与A的相关性)
- 相关系数的取值范围是 [-1, 1]:
- 注意事项:
corr()
会自动排除包含缺失值(NaN
)的行 / 列(或根据min_periods
调整)。- 相关系数仅衡量线性关系,无法捕捉非线性关联(如二次关系)。
- 相关性不等于因果关系,需结合业务逻辑解读结果。
-
使用seaborn绘制
示例代码:
import seaborn as sns
import matplotlib.pyplot as plt
sns.heatmap(data, # 数据矩阵
cmap="YlGnBu", # 颜色映射(如"viridis"、"coolwarm")
annot=True, # 是否在单元格中显示数值
fmt=".2f", # 数值格式(保留2位小数)
linewidths=.5) # 单元格边框宽度
plt.title("热力图示例")
plt.show()
- 应用场景:
- 相关性分析(如特征间的相关系数矩阵)
- 数据分布可视化(如不同时间段的数值变化)
2. enumerate()
函数
enumerate()
是 Python 内置函数,用于将可迭代对象(如列表、元组)转换为枚举对象,同时返回元素的索引和值,简化了 “遍历元素并记录位置” 的操作。
语法:
enumerate(iterable, start=0)
- iterable:需遍历的可迭代对象(如列表、字符串)。
- start:索引的起始值(默认从 0 开始)。
优势: - 避免手动定义计数器(如
i = 0; for value in iterable: ...; i += 1
),代码更简洁。 - 适用于需要同时获取元素位置和值的场景(如遍历列表并修改指定索引的元素)。
3. 子图的绘制方法
子图(Subplot)是在同一画布上绘制多个图表,便于对比数据。常用matplotlib
的plt.subplots()
——一次性创建多个子图或plt.subplot()
——逐个创建子图实现。
方法一:plt.subplots ()
语法:
fig, axes = plt.subplots(nrows, ncols, figsize=(宽, 高))
- nrows:子图行数;ncols:子图列数。
- fig:画布对象;axes:子图数组(若单图则为单个对象)。
示例代码:
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)
y3 = x**2
y4 = np.exp(x)
# 创建2行2列的子图,画布大小10x8
fig, axes = plt.subplots(2, 2, figsize=(10, 8))
# 第1行第1列子图(索引[0,0])
axes[0, 0].plot(x, y1)
axes[0, 0].set_title("sin(x)")
# 第1行第2列子图(索引[0,1])
axes[0, 1].plot(x, y2, color="orange")
axes[0, 1].set_title("cos(x)")
# 第2行第1列子图(索引[1,0])
axes[1, 0].plot(x, y3, color="green")
axes[1, 0].set_title("x²")
# 第2行第2列子图(索引[1,1])
axes[1, 1].plot(x, y4, color="red")
axes[1, 1].set_title("e^x")
plt.tight_layout() # 自动调整子图间距,避免重叠
plt.show()
方法二:plt.subplot ()
语法:
plt.subplot(nrows, ncols, index) # index从1开始,按行优先排序
示例代码:
plt.subplot(1, 2, 1) # 第1个位置(1行2列中的第1个)
plt.plot(x, y1)
plt.title("图1")
plt.subplot(1, 2, 2) # 第2个位置
plt.plot(x, y2)
plt.title("图2")
plt.tight_layout()
plt.show()
注意事项:
- 子图索引在
subplots()
中是0 开始的数组索引,在subplot()
中是1 开始的位置编号。 - 使用
plt.tight_layout()
可避免子图标题、标签重叠。 - 可通过
axes
对象单独设置每个子图的标题(set_title()
)、坐标轴标签(set_xlabel()
)等。
作业
心脏病数据集绘制热力图和单特征分布的大图(包含几个子图)
主要步骤如下:
- 数据导入和认识数据
- 绘制热力图
- 计算不同特征之间的皮尔逊相关系数,得到相关系数矩阵
- 导入绘图包,绘图
- 绘制单特征分布图
- 定义要绘制的特征
- 设置图片清晰度
- 创建子图布局
- 遍历特征并绘图
- 调整子图之间的间距
1. 数据导入和认识数据
import pandas as pd
data = pd.read_csv(r'heart.csv')
data.info()
没有缺失值,不需要填补缺失值,不需要做类型转换,直接进行画图
2. 绘制热力图
1. 计算不同特征之间的皮尔逊相关系数,得到相关系数矩阵
2. 导入绘图包,绘图
1. 计算相关系数矩阵
## 绘制热力图
## 导入包
import seaborn as sns
import matplotlib.pyplot as plt
## 计算相关系数矩阵
corr_matrix = data.corr()
corr_matrix
2. 绘图
## 绘图
plt.figure(figsize=(12,10)) ## 新建画布
plt.rcParams['figure.dpi']=300 ##设置图片清晰度
sns.heatmap(corr_matrix,annot=True,cmap='coolwarm',vmin=-1,vmax=1)
plt.title('Correlation Heatmap of Features')
plt.show()
3. 绘制单特征分布图(包含多个子图)
1. 定义要绘制的特征
2. 设置图片清晰度
3. 创建子图布局
4. 遍历特征并绘图
5. 调整子图之间的间距
## 绘制子图
## 为了勤加练习,这里把特征分了三组,list1中储存了前6个列,list2中储存了后8列,list3中储存了全部的列
## 对list1,list2,list3 分别绘制子图
list1 = data.columns[0:6] #取数据集中的列,从索引0取到索引6,不含索引6
list2 = data.columns[6:14] #取数据集中的列,从索引6取到索引14
list3 = data.columns
print(list1,'\n',list2,'\n',list3)
## list1 绘制子图
## 创建画布,其中包含3行2列的子图
fig, axes = plt.subplots(3,2,figsize=(12,18))
# 这里的axes是一个二维数组,包含2行2列的子图
# 这里的fig是一个Figure对象,表示整个图形窗口
# 你可以把fig想象成一个画布,axes就是在这个画布上画的图形
# 用for循环遍历所有特征并绘制小提琴图
for i,feature in enumerate(list1):
row = i // 2
col = i % 2
axes[row,col].violinplot(data[feature].dropna())
axes[row,col].set_title(f"The ViolinPlot Of {feature}")
axes[row,col].set_ylabel(feature)
# 调整子图之间的间距
plt.tight_layout()
#展示图形
plt.show()
## list2 绘制子图
fig , axes = plt.subplots(4,2,figsize=(12,24))
for i, feature in enumerate(list2):
r = i // 2
c = i % 2
axes[r,c].violinplot(data[feature].dropna())
axes[r,c].set_title(f'The ViolinPlot of {feature}')
axes[r,c].set_ylabel(feature)
plt.tight_layout()
plt.show()
## list3 绘制子图
fig, axes = plt.subplots(7,2,figsize=(12,48))
for i,feature in enumerate(list3):
r = i // 2
c = i % 2
axes[r,c].violinplot(data[feature].dropna())
axes[r,c].set_title(f'The Violinplot Of {feature}')
axes[r,c].set_ylabel(feature)
plt.tight_layout()
plt.show()