【python打卡】Day09 热力图和子图的绘制

今日任务:
  1. 热力图的绘制方法
  2. enumerate()函数
  3. 子图的绘制方法

复习昨日标签编码

step1 获得某一列信息

import pandas as pd
data = pd.read_csv('路径')

# 查看数据集(二维表格)每一列的名称
data.columns
# 选取某一列,获得这一列的值信息和对应数量
data["Home Ownership"].value_counts()

上述代码输出:

Home Ownership
Home Mortgage    3637
Rent                      3204
Own Home            647
Have Mortgage      12
Name: count, dtype: int64

step2 手动构建字典

mapping = {
"Home Ownership":{
    "Home Mortgage ":0,
    "Rent":1,
    "Own Home":2
    "Have Mortgage":3
}

}

step3 使用map()函数,进行映射转换

data['Home ownership']= data['Home ownership'].map(mapping['Home ownership'])

绘制热力图

heatmap()函数

基本语法

seaborn.heatmap(data, *, vmin=None, vmax=None, cmap=None, center=None, annot=None, fmt='.2g', annot_kws=None, linewidths=0, linecolor='white', cbar=True, cbar_kws=None, cbar_ax=None, square=False, xticklabels='auto', yticklabels='auto', mask=None, ax=None, **kwargs)

参数解释

data:必需参数,通常是一个二维的 pandas DataFrame 或者 numpy 数组。它包含了要绘制热力图的数据,矩阵中的每个元素对应热力图中的一个方块。

vmin 和 vmax:用于设置颜色映射的最小值和最大值。如果不指定,seaborn 会自动根据数据的范围来确定。

cmap:指定颜色映射方案,即数据值与颜色的对应关系。例如,'coolwarm' 是一种常用的颜色映射,它将较小的值映射为蓝色,较大的值映射为红色;'YlGnBu' 则是从黄色到绿色再到蓝色的渐变。

center:指定颜色映射的中心值。当需要突出显示数据围绕某个特定值的分布时会用到,比如当数据有正负值,想以 0 为中心进行颜色映射。

annot:布尔值或者与 data 形状相同的数组。如果设置为 True,会在每个方块上显示对应的数据值;如果传入一个数组,则会用数组中的值进行标注。

fmt:指定标注数字的格式,默认是 '.2g',表示保留两位有效数字。

annot_kws:一个字典,设置标注文本的属性,如字体大小、颜色等。例如,{'size': 10} 可以设置标注文本的字体大小为 10。

linewidths:设置方块之间的分隔线宽度。

linecolor:设置分隔线的颜色,默认是白色。

cbar:布尔值,决定是否显示颜色条。颜色条可以帮助读者理解颜色与数据值之间的对应关系。

cbar_kws:一个字典,用于设置颜色条的属性,如标签、刻度等。

square:布尔值,如果设置为 True,会将每个方块绘制为正方形。

xticklabels 和 yticklabels:可以是布尔值、列表或者整数。

        如果是 True,会显示坐标轴标签;如果是 False,则不显示;

        如果传入列表,会用列表中的值作为坐标轴标签;

        如果传入整数,会每隔指定数量的标签显示一个。

mask:与 data 形状相同的布尔数组,用于屏蔽某些方块。True 表示该方块不会被绘制。

ax:指定绘制热力图的 matplotlib 坐标轴对象,如果不指定,seaborn 会自动创建一个新的坐标轴。

import pandas as pd
import seaborn as sns
import matpotlib.pyplot as plt

# 获取连续特征
continuous_features = data.select_dtypes(include=['float64','int64']).columns.tolist()

# step1 使用corr() 函数计算相关系数矩阵
correalation_matrix = data[continuous_features].corr()

# (可选)设置图片清晰度
plt.rcParams['figure.dpi']= 500

# step2_final   绘制热力图
plt.figure(figsize=(16,14))    #figsize表述热力图中每个格子大小
sns.heatmap(correalation_matrix,vmin=-1, vmax=1,cmap='coolwarm',annot=True)
plt.title('连续特征相关系数矩阵')
plt.show()

上述代码输出结果

【python打卡】Day09 热力图和子图的绘制_第1张图片

绘制子图

之前绘制单个特征的箱线图、直方图,简单理解,子图就是把单个特征的箱线、直方图放在一起

subplots()函数

简介:创建包含多个子图的图形窗口

语法:matplotlib.pyplot.subplots(nrows=1, ncols=1, sharex=False, sharey=False, squeeze=True, subplot_kw=None, gridspec_kw=None, **fig_kw)

  1. nrows 和 ncols

    • nrows:指定子图网格的行数,默认值为 1。
    • ncols:指定子图网格的列数,默认值为 1。
    • 例如,nrows=2 和 ncols=3 会创建一个 2 行 3 列的子图布局,总共包含 6 个子图。
  2. sharex 和 sharey

    • sharex:控制子图是否共享 x 轴。可以取值为 True(所有子图共享 x 轴)、False(每个子图有独立的 x 轴)、'row'(同一行的子图共享 x 轴)或 'col'(同一列的子图共享 x 轴),默认值为 False
    • sharey:控制子图是否共享 y 轴,取值和用法与 sharex 类似。
  3. squeeze:布尔值,默认值为 True。如果设置为 True,当 nrows 和 ncols 都为 1 时,返回的 axes 对象将是一个单一的 Axes 实例,而不是包含单个元素的数组;当 nrows 或 ncols 中有一个为 1 时,返回的 axes 对象将是一个一维数组。如果设置为 False,返回的 axes 对象将始终是一个二维数组,即使只有一个子图。

  4. subplot_kw:一个字典,用于传递给每个子图的 add_subplot 方法的额外关键字参数。例如,可以使用 subplot_kw={'projection': 'polar'} 来创建极坐标子图。

  5. gridspec_kw:一个字典,用于传递给 GridSpec 构造函数的额外关键字参数,用于更精细地控制子图的布局。

  6. **fig_kw:其他关键字参数,用于设置整个图形的属性。

    常见的参数如 figsize(用于设置图形的大小,以英寸为单位,格式为 (宽度, 高度))、dpi(用于设置图形的分辨率)等。

返回值:返回一个包含两个元素的元组

        第一个元素是 matplotlib.figure.Figure 类的实例,代表整个图形窗口

        第二个元素是包含 matplotlib.axes.Axes 类实例的数组,每个 Axes 实例代表一个子图

import pandas as pd
import matplotlib.pyplot as plt

# step1 定义要绘制子图的特征
# 随便选的4个特征,当作示例,不在意对不对
features = ['Annual Income', 'Years in current job', 'Tax Liens', 'Number of Open Accounts']

# (可选)设置图片清晰度
plt.rcParams['figure.dpi']=500

# step2 创建一个包含 2 行 2 列的子图布局,并设置每个图形大小
fig,axes = plt.subplots(2,2,figsize=(16,14))

# step3_final 开始绘制
for i in range(len(features)):
    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()

enumerate()函数

作用:自动为值加上索引

语法:enumerate(iterable, start=0)

参数:

        iterable -- 必需参数,表示要遍历的可迭代对象,比如列表、元组、字符串等

        start -- 可选参数,用于指定索引的起始值,默认为 0

返回值:返回一个可迭代的枚举对象,每次迭代返回一个包含"索引和对应元素值"的元组。在实际使用中,常结合 for 循环来遍历这个枚举对象。

features = ['Annual Income', 'Years in current job', 'Tax Liens', 'Number of Open Accounts']

for i, feature in enumerate(features):
    print(f"索引 {i} 对应的特征是: {feature}")

上述代码输出结果

索引 0 对应的特征是: Annual Income

索引 1 对应的特征是: Years in current job

索引 2 对应的特征是: Tax Liens

索引 3 对应的特征是: Number of Open Accounts

使用enumerate()函数,完成子图绘制

# 上面代码不变

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)

# 下面代码不变

作业:

尝试对着心脏病数据集绘制热力图和单特征分布的大图(包含几个子图)

你可能感兴趣的:(【打卡】Python训练营,python,开发语言)