热力图和子图的绘制
作业:对心脏病数据集绘制热力图和单特征分布的大图(包含几个子图)
绘制热力图完整代码:
# 1. 读取数据
import pandas as pd
data = pd.read_csv('heart.csv')
# 2. 查看数据
data.info()
data.head(5)
data.columns
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
# 提取连续值特征
continuous_features = [
'age', 'sex', 'cp',
'trestbps', 'chol',
'fbs', 'restecg',
'thalach', 'exang',
'oldpeak', 'slope', 'ca',
'thal','target'
]
# 计算相关系数矩阵
correlation_matrix = data[continuous_features].corr()
# 设置图片清晰度
plt.rcParams['figure.dpi'] = 300
# 绘制热力图
plt.figure(figsize=(12, 10))
sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm', vmin=-1, vmax=1)
plt.title('Correlation Heatmap of Continuous Features')
plt.show()
逐步解析:
1.读取数据+查看数据
# 1. 读取数据
import pandas as pd
data = pd.read_csv('heart.csv')
# 2. 查看数据
data.info()
2.导入库:
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
3.绘制热力图:
# 提取连续值特征
continuous_features = [
'age', 'sex', 'cp',
'trestbps', 'chol',
'fbs', 'restecg',
'thalach', 'exang',
'oldpeak', 'slope', 'ca',
'thal','target'
]
# 计算相关系数矩阵
correlation_matrix = data[continuous_features].corr()
# 设置图片清晰度
plt.rcParams['figure.dpi'] = 300
# 绘制热力图
plt.figure(figsize=(12, 10))
sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm', vmin=-1, vmax=1)
plt.title('Correlation Heatmap of Continuous Features')
plt.show()
输出的结果是:

单特征分布大图完整代码(前四个特征为例):
import pandas as pd
import matplotlib.pyplot as plt
# 定义要绘制的特征
features = ['Annual Income', 'Years in current job', 'Tax Liens', 'Number of Open Accounts']
# 设置图片清晰度
plt.rcParams['figure.dpi'] = 300
# 创建一个包含 2 行 2 列的子图布局
fig, axes = plt.subplots(2, 2, figsize=(12, 8))
# 使用 for 循环遍历特征
for i in range(len(features)):
row = i // 2 # 计算当前特征在子图中的行索引,// 是整除,即取整 ,之所以用整除是因为我们要的是行数
# 例如 0//2=0, 1//2=0, 2//2=1, 3//2=1
col = i % 2 # 计算当前特征在子图中的列索引,% 是取余,即取模
# 例如 0%2=0, 1%2=1, 2%2=0, 3%2=1
# 绘制箱线图
feature = features[i]
axes[row, col].boxplot(data[feature].dropna())
axes[row, col].set_title(f'Boxplot of {feature}')
axes[row, col].set_ylabel(feature)
# 调整子图之间的间距
plt.tight_layout()
# 显示图形
plt.show()
输出的结果是:

如果想绘制单个子图:
# 设置图片清晰度
plt.rcParams['figure.dpi'] = 300
# 遍历特征逐个绘制
for feature in ['age', 'sex', 'cp', 'trestbps']:
plt.figure(figsize=(8, 6)) # 为每个特征创建新图形
plt.boxplot(data[feature].dropna())
plt.title(f'Boxplot of {feature}')
plt.ylabel(feature)
plt.show() # 显示当前图形
输出的结果是:




最后学习一个非常实用的函数,我们后面会经常看到他
enumerate()函数:
enumerate()函数返回一个迭代对象,该对象包含索引和值。
语法:
enumerate(iterable, start=0)
参数:
iterable -- 迭代对象,迭代对象可以是列表、元组、字典、字符串等。
start -- 索引的开始值
返回值:
返回一个迭代对象,该对象包含索引和值。
之所以这个函数很有用,是因为它允许我们同时迭代一个序列,并获取每个元素的索引和值。
代码:
features = ['Annual Income', 'Years in current job', 'Tax Liens', 'Number of Open Accounts']
for i, feature in enumerate(features):
print(f"索引 {i} 对应的特征是: {feature}")
输出的结果是:

# 定义要绘制的特征
features = ['Annual Income', 'Years in current job', 'Tax Liens', 'Number of Open Accounts']
# 设置图片清晰度
plt.rcParams['figure.dpi'] = 300
# 创建一个包含 2 行 2 列的子图布局,其中
fig, axes = plt.subplots(2, 2, figsize=(12, 8))#返回一个Figure对象和Axes对象
# 这里的axes是一个二维数组,包含2行2列的子图
# 这里的fig是一个Figure对象,表示整个图形窗口
# 你可以把fig想象成一个画布,axes就是在这个画布上画的图形
# 遍历特征并绘制箱线图
for i, feature in enumerate(features):
row = i // 2
col = i % 2
axes[row, col].boxplot(data[feature].dropna())
axes[row, col].set_title(f'Boxplot of {feature}')
axes[row, col].set_ylabel(feature)
# 调整子图之间的间距
plt.tight_layout()
# 显示图形
plt.show()
输出的结果是:

可以看出 enumerate() 是 Python 中一个非常实用的内置函数,它可以让循环变得更加简洁高效。enumerate() 是 Python 中一个非常实用的内置函数,它可以让循环变得更加简洁高效。
编程的世界没有银弹,多尝试、多踩坑才能成长。加油!!!
@浙大疏锦行
583

被折叠的 条评论
为什么被折叠?



