Day 09 Python打卡训练营:生成热力图的子图详解
总结:今天的干货超多
# 热力图:
二维、颜色表示数据密度或数值
!!用颜色编码来表示数据密度或数值大小的图表。
它通常使用二维矩阵的数据,其中每个单元格的颜色深浅对应着该单元格数据值的大小。热力图在很多领域都有广泛应用,例如展示相关性矩阵、基因表达数据、地理数据等。
# 子图(Subplot):
多个表多区域同时展示
!!子图是指在一个图形窗口中创建多个小的绘图区域,每个区域可以独立绘制不同的图表。
使用子图可以在一个窗口中同时展示多个相关的图表,方便对比和分析数据。
# value_counts():
Series中的唯一值的数目,并按照出现次数从高到低排序返回一个新的 Series(二维列表)
所以使用的时候也只能有一个字段
# mapping[]:
##“映射”通常指建立一种对应关系,将一个集合中的元素关联到另一个集合中的元素(类似字典一一对应的关系)
##因为是组,所以检索的时候检索名出现键值
pandas中的map()应用替换元素
# 相关系数矩阵
data[].corr():
.corr() :这是 pandas 的 DataFrame 对象的一个方法,用于计算数据框中各列之间的相关系数矩阵。默认情况下, corr() 方法使用皮尔逊相关系数来衡量两个变量之间的线性相关程度,相关系数的取值范围是 [-1, 1] ,其中 -1 表示完全负相关,1 表示完全正相关,0 表示没有线性相关关系
# 图片清晰度
rcParams :这是 matplotlib 的一个全局配置参数对象,通过它可以修改 matplotlib 的各种默认设置,例如图表的大小、字体、颜色等。
'figure.dpi' :这是 rcParams 中的一个键,代表图表的每英寸点数(Dots Per Inch,简称 DPI)。DPI 越高,图表的分辨率就越高,图像也就越清晰
# 热力图设置
sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm', vmin=-1, vmax=1)
heatmap()绘制热力图
annot=True : annot 是 annotate 的缩写,当设置为 True 时,会在热力图的每个单元格中显示对应的数据值。这样可以让用户更直观地看到每个单元格的具体数值。
cmap='coolwarm' : cmap 是 colormap 的缩写,用于指定热力图的颜色映射方案。 'coolwarm' 是一种常用的颜色映射,它使用蓝色表示负值,红色表示正值,中间值用白色表示,这种颜色映射非常适合展示相关性矩阵,因为相关系数的取值范围是 [-1, 1] 。
vmin=-1, vmax=1 : vmin 和 vmax 分别指定了颜色映射的最小值和最大值。在相关性矩阵中,相关系数的取值范围是 [-1, 1] ,因此将 vmin 设置为 -1 , vmax 设置为 1 ,可以确保颜色映射正确地反映相关系数的取值范围。
# 子图
fig, axes = plt.subplots(2, 2, figsize=(12, 8)) 列、行、大小
plt.subplots() :这是 matplotlib.pyplot 模块中的一个函数,用于创建一个包含多个子图的图形窗口。它会返回两个对象:一个是 Figure 对象,另一个是包含多个 Axes 对象的数组。
– Figure 对象:代表整个图形窗口,类似于画布,所有的子图都绘制在这个画布上(figsize)
– Axes 对象:代表每个子图,用于在其上绘制具体的图形,如折线图、柱状图等(有几个就画几个)
axes[0, 0].boxplot(data[feature].dropna())
– axes[0, 0] :在 matplotlib 里,当使用 plt.subplots() 创建多个子图时,会返回一个包含多个 Axes 对象的数组 axes 。 axes[0, 0] 表示这个子图数组中第 1 行(索引从 0 开始)第 1 列的子图,后续的绘图操作会在这个子图上进行。
– .boxplot() :这是 Axes 对象的一个方法,用于绘制箱线图。箱线图是一种常用的统计图表,能展示数据的分布情况,包括最小值、第一四分位数、中位数、第三四分位数和最大值,还能显示异常值。
– data[feature] : data 通常是一个 pandas 的 DataFrame 对象, feature 是一个字符串,表示 data 中的某一列名。 data[feature] 表示从 data 中选取指定列的数据。
– .dropna() :这是 pandas 的 Series 或 DataFrame 对象的方法,用于移除数据中的缺失值( NaN )。在绘制箱线图之前移除缺失值,能避免这些缺失值对统计结果产生影响。
axes[0, 0].set_title(f'Boxplot of {feature}')
– axes[0, 0] :在使用 plt.subplots() 创建多个子图时,会返回一个 axes 对象数组, axes[0, 0] 表示这个数组中第 1 行第 1 列的子图(索引从 0 开始计数)。
– .set_title() :这是 matplotlib 中 Axes 对象的一个方法,用于为指定的子图设置标题。
– f'Boxplot of {feature}' :这是一个 f-string(格式化字符串字面值),Python 3.6 及以上版本支持。 f 前缀表示这是一个格式化字符串,花括号 {} 内的 feature 是一个变量,在运行时会被该变量的实际值替换。例如,如果 feature 的值是 'Annual Income' ,那么这个字符串就会变成 'Boxplot of Annual Income'
axes[0,0].ylabels[feature]
– axes[0, 0] :在使用 plt.subplots() 创建多个子图时,会返回一个 axes 对象数组。 axes[0, 0] 表示这个数组中第 1 行(索引从 0 开始)第 1 列的子图。后续的操作都会作用在这个子图上。
– .set_ylabel() :这是 matplotlib 中 Axes 对象的一个方法,用于设置子图的 y 轴标签。
– feature :这是一个变量,通常是一个字符串。 set_ylabel() 方法会将这个变量的值作为 y 轴的标签显示在子图上
plt.tight_layout()
被用于调整包含 2 行 2 列子图布局的间距,确保每个子图的标题、坐标轴标签等元素不会相互覆盖,让整个图形更加美观和易读
import pandas as pd
data = pd.read_csv('D:\Z My try\code\python\python60-days-challenge-master05-09\python60-days-challenge-master\data.csv')
data.head()#前5行
data.info()#行/列数目+内存大小|有没有空值+数据类型
## 把years in current job列和Home Ownership 列转化为数字
#查看
data["Years in current job"].value_counts()
#Series中的唯一值的数目
data["Home Ownership"].value_counts()
#设置mapping的值
mappings = {
"Years in current job":{
"10+ years" : 10,
"9 years" : 9,
"8 years" : 8,
"7 years" : 7,
"6 years" : 6,
"5 years" : 5,
"4 years" : 4,
"3 years" : 3,
"2 years" : 2,
"1 years" : 1,
"< 1 year" :0
},
"Home Ownership":{
"Home Mortgage": 0,
"Rent": 1,
"Own Home": 2,
"Have Mortgage": 3
}
data["Years in current job"] = data["Years in current job"].map(mappings["Years in current job"])
data["Years in current job"]
data.info()
data["Home Ownership"] = data["Home Ownership"].map(mappings["Home Ownership"])
data["Home Ownership"]
data.info()
data.head()#映射后的数据显示
data.columns#获取所有列表名
#输入库
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
continuous_features = [
'Annual Income', 'Years in current job', 'Tax Liens',
'Number of Open Accounts', 'Years of Credit History',
'Maximum Open Credit', 'Number of Credit Problems',
'Months since last delinquent', 'Bankruptcies',
'Current Loan Amount', 'Current Credit Balance', 'Monthly Debt',
'Credit Score'
]
#相关系数矩阵
correaltion_maxric = data[continuous_features].corr()
plt.rcParams['figure.dpi'] = 300
#绘制热力图
plt.figure(figsize=[12,10])
sns.heatmap(correaltion_maxric, 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
fig, axes = plt.subplots(2, 2, figsize=(12, 8))
i = 0
feature = features[i]
axes[0, 0].boxplot(data[feature].dropna())
axes[0,0].set_title(f'Boxplot of {feature}')
axes[0, 0].set_ylabel(feature)
i = 1
feature = features[i]
axes[0, 1].boxplot(data[feature].dropna())
axes[0, 1].set_title(f'Boxplot of {feature}')
axes[0, 1].set_ylabel(feature)
i = 2
feature = features[i]
axes[1, 0].boxplot(data[feature].dropna())
axes[1, 0].set_title(f'Boxplot of {feature}')
axes[1, 0].set_ylabel(feature)
i = 3
feature = features[i]
axes[1, 1].boxplot(data[feature].dropna())
axes[1, 1].set_title(f'Boxplot of {feature}')
axes[1, 1].set_ylabel(feature)
plt.tight_layout()
plt.show()

features = ['Annual Income', 'Years in current job', 'Tax Liens', 'Number of Open Accounts']
plt.rcParams['figure.dpi'] = 300
fig, axes = plt.subplots(2, 2, figsize=(12, 8))
for i in range(len(feature)):
row = i // 2
col = i % 2
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()
@浙大疏锦行
作者:CyberLuy