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()
上述代码输出结果
之前绘制单个特征的箱线图、直方图,简单理解,子图就是把单个特征的箱线、直方图放在一起
subplots()函数
简介:创建包含多个子图的图形窗口
语法:matplotlib.pyplot.subplots(nrows=1, ncols=1, sharex=False, sharey=False, squeeze=True, subplot_kw=None, gridspec_kw=None, **fig_kw)
nrows
和 ncols
nrows
:指定子图网格的行数,默认值为 1。ncols
:指定子图网格的列数,默认值为 1。nrows=2
和 ncols=3
会创建一个 2 行 3 列的子图布局,总共包含 6 个子图。sharex
和 sharey
sharex
:控制子图是否共享 x 轴。可以取值为 True
(所有子图共享 x 轴)、False
(每个子图有独立的 x 轴)、'row'
(同一行的子图共享 x 轴)或 'col'
(同一列的子图共享 x 轴),默认值为 False
。sharey
:控制子图是否共享 y 轴,取值和用法与 sharex
类似。squeeze:
布尔值,默认值为 True
。如果设置为 True
,当 nrows
和 ncols
都为 1 时,返回的 axes
对象将是一个单一的 Axes
实例,而不是包含单个元素的数组;当 nrows
或 ncols
中有一个为 1 时,返回的 axes
对象将是一个一维数组。如果设置为 False
,返回的 axes
对象将始终是一个二维数组,即使只有一个子图。
subplot_kw:
一个字典,用于传递给每个子图的 add_subplot
方法的额外关键字参数。例如,可以使用 subplot_kw={'projection': 'polar'}
来创建极坐标子图。
gridspec_kw:
一个字典,用于传递给 GridSpec
构造函数的额外关键字参数,用于更精细地控制子图的布局。
**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(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)
# 下面代码不变
作业:
尝试对着心脏病数据集绘制热力图和单特征分布的大图(包含几个子图)