机器学习记录
Seaborn
Seaborn 是一个基于 Matplotlib 的 Python 可视化库,提供了一些内置数据集以及进行统计数据可视化和模型现场的 API。
sns.get_dataset_names()
方法会返回一个字符串列表,包含所有内置数据集的名称
练习
Seaborn 依赖Matplotlib, NumPy, SciPy, Pandas 和 StatsModels等
conda install -y seaborn
conda install -y numpy
conda install -y pandas
conda install -y scipy
conda install -y statsmodel
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
%reload_ext autoreload
%autoreload 2
print(sns.__version__)
0.12.2
# 获取 Seaborn 中包含的所有数据集名称
print(sns.get_dataset_names())
['anagrams', 'anscombe', 'attention', 'brain_networks', 'car_crashes', 'diamonds', 'dots', 'dowjones', 'exercise', 'flights', 'fmri', 'geyser', 'glue', 'healthexp', 'iris', 'mpg', 'penguins', 'planets', 'seaice', 'taxis', 'tips', 'titanic']
# 加载数据
crash_df = sns.load_dataset('car_crashes')
print(type(crash_df))
print(crash_df.shape)
print(crash_df.head())
<class 'pandas.core.frame.DataFrame'>
(51, 8)
total speeding alcohol not_distracted no_previous ins_premium \
0 18.8 7.332 5.640 18.048 15.040 784.55
1 18.1 7.421 4.525 16.290 17.014 1053.48
2 18.6 6.510 5.208 15.624 17.856 899.47
3 22.4 4.032 5.824 21.056 21.280 827.34
4 12.0 4.200 3.360 10.920 10.680 878.41
ins_losses abbrev
0 145.08 AL
1 133.93 AK
2 110.35 AZ
3 142.39 AR
4 165.63 CA
histplot
绘制单变量或双变量直方图以显示数据集的分布。
直方图是一种经典的可视化工具,它通过计算落在离散区间内的观测值的数量来表示一个或多个变量的分布。
此函数可以对每个区间内计算的统计数据进行归一化,以估计频率、密度或概率质量,并且可以添加使用核密度估计获得的平滑曲线,类似于 :func:kdeplot
。
sns.histplot(
data=None,
*,
x=None,
y=None,
hue=None,
weights=None,
stat='count',
bins='auto',
binwidth=None,
binrange=None,
discrete=None,
cumulative=False,
common_bins=True,
common_norm=True,
multiple='layer',
element='bars',
fill=True,
shrink=1,
kde=False,
kde_kws=None,
line_kws=None,
thresh=0,
pthresh=None,
pmax=None,
cbar=False,
cbar_ax=None,
cbar_kws=None,
palette=None,
hue_order=None,
hue_norm=None,
color=None,
log_scale=None,
legend=True,
ax=None,
**kwargs,
)
bins
: 制定bin的数目或bin边界,默认为10个binbinwidth
: 指定bin的宽度,代替bins参数kde
: 是否显示核密度估计曲线,默认Falsecolor
: 直方图颜色edgecolor
: 直方图边框色linewidth
: 边框宽度alpha
: 透明度element
: 直方图统计的可视化表示bars
step
poly
stat
- 聚合统计数据, y 轴count
: 统计频数,默认值。每个bin的原始频数frequency
: 统计频率。每个bin的相对频率(频数/总频数)density
: 统计密度。每个bin的频率密度(频数/bin宽度)probability
: 统计概率密度。每个bin的概率密度(频数/总频数 * bin宽度
)None
: 不显示任何统计信息。仅显示直方图,无统计摘要
sns.histplot(
crash_df['not_distracted'],
bins=20,
kde=True,
element='bars',
edgecolor='red',
linewidth=2,
alpha=0.8,
)
plt.show()
# distplot过时方式, 将在 seaborn v0.14.0 删除
# sns.distplot(crash_df['not_distracted']), 以下等价
sns.histplot(crash_df['not_distracted'], kde=True, stat='density')
plt.show()
jointplot
用双变量图和单变量图绘制两个变量的图。
此函数为 JointGrid 类提供了一个方便的接口,具有多种固定绘图类型。
这是一个相当轻量级的包装器; 如果您需要更大的灵活性,您应该直接使用 :class:JointGrid
。
参数种类也比较丰富,可以调整图形的各个方面样式。所以掌握这个方法能让我们更轻松高效地做EDA数据探索。
sns.jointplot(
data=None,
*,
x=None,
y=None,
hue=None,
kind='scatter', # "scatter" | "kde" | "hist" | "hex" | "reg" | "resid"
height=6, # 图高
ratio=5, # 长宽比例
space=0.2, # 子图间隔
dropna=False, # 是否删除NaN值
xlim=None,
ylim=None,
color=None, # 颜色
palette=None,
hue_order=None,
hue_norm=None,
marginal_ticks=False, # y 对角轴刻度显示(柱状图的)
joint_kws=None,
marginal_kws=None,
**kwargs,
)
kind 参数用于指定联合分布图的类型:
scatter
: 散点图。默认值。显示x-y变量的散点图以及边缘直方图。- 显示原始关系
reg
: 回归图。显示x-y变量的散点图,并且显示回归线及其方程。用于展示两个定量变量之间的线性相关关系。- 显示线性相关关系
resid
: 残差图。显示x-y变量的散点图及残差与预测值的散点图。用于判断回归模型的合理性。- 判断线性模型的合理性
kde
: 核密度估计图。使用2D的核密度估计方法显示变量之间的联合密度。- 显示全面的联合密度
hex
: 分箱图。将x-y变量以网格状分箱,显示每个分箱中的观测数量。- 显示不同区域内的观测分布
# 速度, 酒精
# 回归图显示线性相关关系
sns.jointplot(
x='speeding',
y='alcohol',
data=crash_df,
kind='reg',
marginal_ticks=True
)
plt.show()
# 核密度图显示全面的联合密度
sns.jointplot(
x='speeding',
y='alcohol',
data=crash_df,
kind='kde',
marginal_ticks=True,
)
plt.show()
# 散点图显示原始关系,直方图显示边缘分布
sns.jointplot(
x='speeding',
y='alcohol',
data=crash_df,
kind='scatter',
marginal_ticks=True,
)
plt.show()
# 速度, 酒精
sns.jointplot(
x='speeding',
y='alcohol',
data=crash_df,
kind='hist',
marginal_ticks=True,
)
plt.show()
# 分箱图显示不同区域内的观测分布
sns.jointplot(
x='speeding',
y='alcohol',
data=crash_df,
kind='hex',
marginal_ticks=True,
)
plt.show()
# 残差图判断线性模型的合理性
sns.jointplot(
x='speeding',
y='alcohol',
data=crash_df,
kind='resid',
marginal_ticks=True,
)
plt.show()
kdeplot
绘制核密度估计图
sns.kdeplot(
data=None,
*,
x=None, # 指定一维数据的变量名称
y=None, # 指定一维数据的变量名称
hue=None,
weights=None,
palette=None,
hue_order=None,
hue_norm=None,
color=None,
fill=None,
multiple='layer',
common_norm=True,
common_grid=False,
cumulative=False, # 是否绘制累积密度曲线
bw_method='scott',
bw_adjust=1,
warn_singular=True,
log_scale=None,
levels=10,
thresh=0.05,
gridsize=200, # 网格大小
cut=3, # 截断外围尾部的比例
clip=None, # 默认截断区间 [-np.inf, np.inf],可以指定其他区间
legend=True, # 是否显示图例
cbar=False, # 是否绘制颜色条
cbar_ax=None, # 颜色条轴
cbar_kws=None, # 颜色条参数
ax=None,
**kwargs,
)
import scipy
sns.kdeplot(crash_df['alcohol'], cumulative=True)
plt.show()
pairplot
绘制多个变量的散点矩阵图。它可以显示数据集中所有变量的二元散点图,便于我们直观地探索变量之间的关系。
在数据集中绘制成对关系。
默认情况下,此函数将创建一个坐标轴网格,这样“数据”中的每个数字变量将在单行的 y 轴和单列的 x 轴之间共享。
对角线图的处理方式不同:绘制单变量分布图以显示每列中数据的边际分布。
也可以显示变量的子集或在行和列上绘制不同的变量。
这是 :class:PairGrid
的高级接口,旨在使绘制一些常用样式变得容易。
如果需要更大的灵活性,直接使用 PairGrid。
sns.pairplot(
data,
*,
hue=None, # 根据hue变量中的类别对图形进行着色,展示多重关系
hue_order=None,
palette=None,
vars=None, # 要绘制的变量,如果为空则绘制全部数值型变量
x_vars=None,
y_vars=None,
kind='scatter', # 散点图类型,可以是'scatter'、'reg'、'kde'、'hex'等
diag_kind='auto', # 对角线图类型,可以是'hist'、'kde'、None等
markers=None,
height=2.5,
aspect=1,
corner=False,
dropna=False, # 是否删除缺失值
plot_kws=None, # 散点图参数(颜色、大小等)
diag_kws=None, # 对角线图参数
grid_kws=None,
size=None,
)
sns.pairplot(crash_df, diag_kind='kde', kind='reg')
plt.show()
tips_df = sns.load_dataset('tips')
print(tips_df.head())
total_bill tip sex smoker day time size
0 16.99 1.01 Female No Sun Dinner 2
1 10.34 1.66 Male No Sun Dinner 3
2 21.01 3.50 Male No Sun Dinner 3
3 23.68 3.31 Male No Sun Dinner 2
4 24.59 3.61 Female No Sun Dinner 4
sns.pairplot(tips_df, hue='sex', palette='Blues')
plt.show()
rugplot
在轴上绘制随机变量的每个观测值的小条形图。
它可以同时绘制一维或二维的数据,用于检查核密度估计或累积密度曲线的拟合效果,或直接显示数据分布的详细信息。
通过沿 x 轴和 y 轴绘制刻度来绘制边际分布。
此功能旨在通过以不显眼的方式显示单个观察的位置来补充其他图。
sns.rugplot(
data=None,
*,
x=None,
y=None,
hue=None,
height=0.025, # 条形图高度,默认为0.05
expand_margins=True,
palette=None,
hue_order=None,
hue_norm=None,
legend=True,
ax=None, # 绘图轴,默认使用当前轴
**kwargs, # 其他可选参数(颜色、alpha等)
)
sns.rugplot(
tips_df['tip']
)
plt.show()
# sns.set_style('whitegrid')
# sns.set_style('darkgrid')
# sns.set_style('dark')
sns.set_style('ticks')
plt.figure(figsize=(8, 4))
# "paper", "talk", and "poster"
sns.set_context('paper', font_scale=1)
sns.jointplot(x='speeding', y='alcohol', data=crash_df, kind='reg')
plt.show()
<Figure size 800x400 with 0 Axes>
barplot
将点估计和误差显示为矩形条。
黑色线,也称为误差线或置信区间
- 条形的高度表示数值变量(y)在不同组别(x)中的测量值,通常表示均值或中位数。它直观地显示不同组之间的差异。
- 黑色的线表示置信区间,用于衡量不同组别之间差异的统计显著性。
- 条形的颜色表示第三个变量(hue)在不同的组别与数值变量的关系,用于展示三变量之间的联合分布或关联。
通过比较不同组别的误差线与其对应的条形是否重叠来判断这两个组别之间的差异是否显著:
- 如果误差线与条形图重叠较小或没有重叠,说明条形图显示的差异大于误差线的范围,更有可能是真实的差异,属于显著差异。
- 如果误差线与条形图重叠较大,则差异可能由于误差线本身的范围引起,难以判断是否为真实差异,因此属于不显著差异。
一般来说,
- 重叠小了更好,说明取得的结果更有说服力,差异更显著。这更能支持我们的假设或证明我们想要研究的效应。
- 重叠大了不太理想,说明结果的稳定性或精确性不足以明确判断差异是否真实存在。这时候需要进一步验证,以确定效应是否真实,或者哪些因素影响了结果。
sns.barplot(
data=None,
*,
x=None,
y=None,
hue=None,
order=None,
hue_order=None,
estimator='mean', # 定量变量的统计方法,默认为'mean',可以是'median', 'max','count'等
errorbar=('ci', 95),
n_boot=1000,
units=None,
seed=None,
orient=None,
color=None,
palette=None,
saturation=0.75,
width=0.8,
errcolor='.26',
errwidth=None,
capsize=None,
dodge=True,
ci='deprecated',
ax=None,
**kwargs,
)
以性别(x)和工资(y)为例来解释误差线与条形图重叠的意义:
import seaborn as sns
sns.barplot(x='sex', y='wage', data=df, ci=95) # 显示95%置信区间
这会产生一个按性别分组的工资平均值条形图,带95%置信区间(误差线)。
- 如果男性与女性工资的误差线与其条形图重叠较小或没有重叠,则两组之间的工资差异可能显著。这说明工资差异超出了误差线的范围,更有可能是真实的差异,可以支持性别歧视的假设。
- 如果男性与女性工资的误差线与其条形图重叠较大,则工资差异可能不显著,可能部分或全部由误差线引起。这时候难以断定是否存在真实的工资差异,需要更大数据量来验证性别歧视的效应。
所以,简而言之:
- 重叠小——工资差异可能显著,性别歧视假说更可信。
- 重叠大——工资差异可能不显著,性别歧视的真实效应还需进一步验证。
sns.barplot(x='sex', y='total_bill', data=tips_df, hue='day')
plt.show()
sns.barplot(x='sex', y='total_bill', data=tips_df, hue='day', errorbar=('ci', 68))
plt.show()
countplot
分类变量的计数条形图
sns.countplot(
data=None,
*,
x=None,
y=None,
hue=None, # 用于制作按第三分类变量分组的条形图
order=None,
hue_order=None,
orient=None,
color=None,
palette=None,
saturation=0.75,
width=0.8,
dodge=True,
ax=None,
**kwargs,
)
sns.countplot(x='sex', hue='day', data=tips_df)
plt.show()
boxplot
箱线图
通过显示数值变量的五数概括(最小值、第一四分位数、中位数、第三四分位数、最大值)来可视化变量的分布。
箱线图用以展示一个或多个分类变量下的数值变量的分布情况。它通过显示五数概括,提供了数值变量分布的整体轮廓和变异性,是判断变量是否正常分布的重要手段之一。
sns.boxplot(
data=None,
*,
x=None,
y=None,
hue=None, # 用于按分类变量对箱线图进行着色,制作分组箱线图。
order=None,
hue_order=None,
orient=None,
color=None,
palette=None,
saturation=0.75,
width=0.8,
dodge=True,
fliersize=5,
linewidth=None,
whis=1.5,
ax=None,
**kwargs,
)
sns.boxplot(x='day', y='total_bill', hue='sex', data=tips_df)
plt.show()
violinplot
小提琴图
通过显示数值变量的核密度估计来展示变量的分布。
小提琴图用以展示一个或多个分类变量下的数值变量的分布情况。它通过显示核密度估计,提供了更丰富和平滑的分布信息,这比箱线图的五数概括能提供更加详细的数值变量分布的整体情况。
sns.violinplot(
data=None,
*,
x=None,
y=None,
hue=None,
order=None,
hue_order=None,
bw='scott',
cut=2,
scale='area',
scale_hue=True,
gridsize=100,
width=0.8,
inner='box',
split=False,
dodge=True,
orient=None,
linewidth=None,
color=None,
palette=None,
saturation=0.75,
ax=None,
**kwargs,
)
sns.violinplot(x='day', y='total_bill', data=tips_df, hue='sex', split=True)
plt.show()
stripplot
条形图
通过显示每个观测值来展示分类变量下的分布。
用于以点的形式显示分类变量下的每个观测值,它提供了变量分布的最详细信息,可以清楚展现出异常值和聚类。但是当观测值较多时,条形图会显得很杂乱。这时候,jitter参数可以添加随机抖动,使得分布更加均匀,便于观察。
sns.stripplot(
data=None,
*,
x=None,
y=None,
hue=None,
order=None,
hue_order=None,
jitter=True,
dodge=False,
orient=None,
color=None,
palette=None,
size=5,
edgecolor='gray',
linewidth=0,
hue_norm=None,
native_scale=False,
formatter=None,
legend='auto',
ax=None,
**kwargs,
)
plt.figure(figsize=(8, 5))
sns.stripplot(x='day', y='total_bill', data=tips_df, jitter=True, hue='sex')
plt.show()
plt.figure(figsize=(8, 5))
sns.stripplot(x='day', y='total_bill', data=tips_df, jitter=True, hue='sex', dodge=True)
plt.show()
swarmplot
条形图
与 stripplot() 类似,同样通过显示每个观测值来展示分类变量下的分布。但是它在绘制时会对重叠的点进行偏移,使得分布更加均匀,便于观察。
可以把 violinplot + swarmplot 结合起来使用.
sns.swarmplot(
data=None,
*,
x=None,
y=None,
hue=None,
order=None,
hue_order=None,
dodge=False,
orient=None,
color=None,
palette=None,
size=5,
edgecolor='gray',
linewidth=0,
hue_norm=None,
native_scale=False,
formatter=None,
legend='auto',
warn_thresh=0.05,
ax=None,
**kwargs,
)
sns.swarmplot(x='day', y='total_bill', data=tips_df)
plt.show()
# violinplot + swarmplot
sns.violinplot(x='day', y='total_bill', data=tips_df)
sns.swarmplot(x='day', y='total_bill', data=tips_df, color='white')
plt.show()
pandas corr()
计算相关系数矩阵
计算变量之间的pearson相关系数、spearman相关系数或kendall相关系数矩阵。
相关系数矩阵为分析变量之间相关性提供了重要依据。我们可以据此选择相关性高的变量进行模型搭建,或者识别冗余变量等。
参数:
method
- 相关系数方法,可选’pearson’,‘spearman’,‘kendall’,默认为’pearson’min_periods
- 计算相关系数所需的最小观测数,默认为1
heatmap
热力图
通过显示数据矩阵的颜色映射来展示数据的分布和聚集情况。
热力图用于将数据矩阵的值通过颜色映射的方式直观地展示出来。它将数据聚集和分布情况从数值为主的表格形式转变为能从视觉上直接识别的色块形式。
热力图常用于展示相关系数矩阵、Confusion Matrix等数据,它提供一个从宏观上判断矩阵数据分布和聚集的快速方式。但热力图难以精确识别每个值,这时添加annot参数可以在每个色块上方标注值,达到详细而直观展示数据的目的。
sns.heatmap(
data,
*,
vmin=None,
vmax=None,
cmap=None,
center=None,
robust=False,
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,
)
plt.figure(figsize=(8, 5))
sns.set_context('paper', font_scale=1.4)
crash_mx = crash_df.corr(numeric_only=True)
print(crash_mx)
# sns.heatmap(crash_mx, annot=True)
sns.heatmap(crash_mx, annot=True, cmap='Blues')
plt.show()
total speeding alcohol not_distracted no_previous \
total 1.000000 0.611548 0.852613 0.827560 0.956179
speeding 0.611548 1.000000 0.669719 0.588010 0.571976
alcohol 0.852613 0.669719 1.000000 0.732816 0.783520
not_distracted 0.827560 0.588010 0.732816 1.000000 0.747307
no_previous 0.956179 0.571976 0.783520 0.747307 1.000000
ins_premium -0.199702 -0.077675 -0.170612 -0.174856 -0.156895
ins_losses -0.036011 -0.065928 -0.112547 -0.075970 -0.006359
ins_premium ins_losses
total -0.199702 -0.036011
speeding -0.077675 -0.065928
alcohol -0.170612 -0.112547
not_distracted -0.174856 -0.075970
no_previous -0.156895 -0.006359
ins_premium 1.000000 0.623116
ins_losses 0.623116 1.000000
pivot_table
用于进行数据透视表操作。它可以将数据进行重塑和汇总,得到表格化的统计结果。
用于将数据进行重塑和汇总,可以得到分类汇总,频数和交叉表格的统计结果。它通过指定行标签、列标签和汇总方法,可以将数据聚合在一起,得到直观的表格化输出,这比直接查看原始数据更加清晰。
透视表为分析不同分类下的数据情况和总体统计提供了很好的工具。可以通过它发现某分类的异常值或有趣的分布,为后续建模或分析提供参考。
pd.pivot_table(
data: 'DataFrame',
values=None,
index=None,
columns=None,
aggfunc: 'AggFuncType' = 'mean', # 汇总函数,默认为求平均值mean,可以是sum、count、std等
fill_value=None,
margins: 'bool' = False,
dropna: 'bool' = True,
margins_name: 'str' = 'All',
observed: 'bool' = False,
sort: 'bool' = True,
) -> 'DataFrame'
flights = sns.load_dataset('flights')
print(flights.head())
flights = flights.pivot_table(index='month', columns='year', values='passengers')
sns.heatmap(flights, cmap='Blues', linecolor='white', linewidth=1)
plt.show()
year month passengers
0 1949 Jan 112
1 1949 Feb 118
2 1949 Mar 132
3 1949 Apr 129
4 1949 May 121
clustermap
聚类热力图
通过层次聚类和热力图相结合的方式展示数据的聚集情况。
聚类热力图将层次聚类与热力图相结合,它既展示了数据矩阵的值与变量之间的相关性,也展示了变量之间的聚集情况。通过观察树图和热力图,我们可以清晰看出哪些变量相关性较高、聚集较紧密。
聚类热力图常用于展示相关系数矩阵,它提供了判断变量相关性和聚类的重要依据。我们可以通过它选择相关较高的变量构建模型,或识别变量之间的冗余等。相比热力图,它可以更清晰展示变量之间的内在关联。
在聚类热力图中,线条表示变量之间的聚类关系。具体来说:
- 树枝长度表示变量之间的聚类程度,长度越短表示聚类越紧密。
- 树枝连接的变量表示它们之间的相似性较高,聚类较近。
- 位于同一树枝上的变量,表示它们与其他变量的相似性均较高,聚类较紧密。
- 位于不同树枝但树枝较近的变量,表示它们之间的相似性也较高,相对而言聚类也较近。
- 位于完全不同树枝的变量,表示它们之间的相似性较低,聚类较远。
通过观察线条,我们可以清晰判断变量之间的相似性和聚类情况:
- 连接在一起或位于同一树枝上的变量,相关性和聚类程度较高。这些变量之间可能存在一定的冗余,可以考虑在建模时剔除某些。
- 树枝长度较短的变量,无论是否直接连接,它们之间的相似性和聚类都较紧密。这提示这些变量之间可能具有较强的相关性,可以考虑一起使用。
- 位于完全不同树枝的变量,相关性和聚类程度较低。这些变量提供的信息可能不同,可以考虑同时使用,以获得更全面的模型。
- 位于较近树枝的变量,相关性和聚类程度一般。这需要根据实际情况具体判断这些变量的相关性是否适度,以决定在建模时是否同时使用。
聚类热力图中的线条提供了判断变量之间相似性和聚类的重要信息。通过对线条的观察和理解,我们可以更好地选择变量,构建出相关性适度的模型。这比直接观察相关系数矩阵更加直观和准确。
sns.clustermap(
data,
*,
pivot_kws=None,
method='average',
metric='euclidean',
z_score=None,
standard_scale=None,
figsize=(10, 10),
cbar_kws=None,
row_cluster=True,
col_cluster=True,
row_linkage=None,
col_linkage=None,
row_colors=None,
col_colors=None,
mask=None,
dendrogram_ratio=0.2,
colors_ratio=0.03,
cbar_pos=(0.02, 0.8, 0.05, 0.18),
tree_kws=None,
**kwargs,
)
sns.clustermap(flights, cmap='Blues', standard_scale=1)
plt.show()
pairgrid
散点矩阵图
通过显示数据中所有变量之间的散点图矩阵来展示变量之间的相关性。
PairGrid可以绘制数据中所有变量或指定变量之间的散点矩阵图。它通过散点图的分布和形状展示了变量之间的相关性,这比直接观察数据更加直观。
散点矩阵图常用于探索变量之间的关系,选择相关性较高的变量构建模型。它提供了判断变量之间相关性强弱和相关类型的重要依据。与相关系数矩阵相比,散点矩阵图通过可视化的方式更加直观地展示了变量之间的内在依赖。
g = sns.PairGrid(
data,
*,
hue=None,
vars=None,
x_vars=None,
y_vars=None,
hue_order=None,
palette=None,
hue_kws=None,
corner=False,
diag_sharey=True,
height=2.5,
aspect=1,
layout_pad=0.5,
despine=True,
dropna=False,
)
所有图
g.map(sns.regplot)
对角线图
g.map_diag(sns.kdeplot)
非对角线图
g.map_offdiag(sns.scatterplot)
上三角
g.map_upper(sns.histplot)
下三角
g.map_lower(sns.kdeplot)
如果都设置, 都会生效
iris = sns.load_dataset('iris')
print(iris.head())
iris_g = sns.PairGrid(iris, hue='species')
# iris_g = sns.PairGrid(iris, vars=['sepal_length', 'sepal_width'], hue='species')
# 所有图
# iris_g.map(sns.regplot)
# 对角线图
iris_g.map_diag(sns.kdeplot)
# 非对角线图
# iris_g.map_offdiag(sns.scatterplot)
# 上三角
iris_g.map_upper(sns.histplot)
# 下三角
iris_g.map_lower(sns.kdeplot)
plt.show()
sepal_length sepal_width petal_length petal_width species
0 5.1 3.5 1.4 0.2 setosa
1 4.9 3.0 1.4 0.2 setosa
2 4.7 3.2 1.3 0.2 setosa
3 4.6 3.1 1.5 0.2 setosa
4 5.0 3.6 1.4 0.2 setosa
FacetGrid
分面网格图。它通过将数据按照行或列的方式进行拆分,并在每个面板中绘制相同的图形来展示数据的分布。
FacetGrid可以将数据中的分类变量用于行分面或列分面,在每个面板中绘制相同类型的图形。它通过将数据分类后在不同的面板中显示,让我们可以更清晰地观察每个分类下的数据分布。
分面网格图常用于探索分类变量对数据分布的影响。我们可以通过它找到某分类下的异常值或有趣变化,为进一步分析提供思路。与绘制全部数据的图形相比,它可以避免图像过于复杂,更清晰直观地显示每个分类的信息。
sns.FacetGrid(
data,
*,
row=None,
col=None,
hue=None,
col_wrap=None,
sharex=True,
sharey=True,
height=3,
aspect=1,
palette=None,
row_order=None,
col_order=None,
hue_order=None,
hue_kws=None,
dropna=False,
legend_out=True,
despine=True,
margin_titles=False,
xlim=None,
ylim=None,
subplot_kws=None,
gridspec_kws=None,
)
tips_fg = sns.FacetGrid(tips_df, col='time', row='smoker')
tips_fg.map(plt.hist, 'total_bill', bins=8)
plt.show()
tips_fg = sns.FacetGrid(tips_df, col='time', row='smoker', height=4, aspect=1.3)
tips_fg.map(plt.hist, 'total_bill', bins=8)
plt.show()
tips_fg = sns.FacetGrid(
tips_df,
col='time',
row='smoker',
height=4,
aspect=1.3,
col_order=['Dinner', 'Lunch'],
palette='Setl'
)
tips_fg.map(plt.scatter, 'total_bill', 'tip')
plt.show()
kws = dict(s=50, linewidth=.5, edgecolor='w')
tips_fg = sns.FacetGrid(
tips_df,
col='sex',
hue='smoker',
height=4,
aspect=1.3,
hue_order=['Yes', 'No'],
hue_kws=dict(marker=['^', 'v'])
)
tips_fg.map(plt.scatter, 'total_bill', 'tip', **kws)
plt.show()
att_df = sns.load_dataset('attention')
att_fg = sns.FacetGrid(att_df, col='subject', col_wrap=5, height=5)
att_fg.map(plt.plot, 'solutions', 'score', marker='.')
plt.show()
lmplot
线性回归模型的散点图和回归线
通过在散点图上显示线性回归模型的拟合结果直观展示两个变量之间的线性关系。
lmplot可以绘制两变量间的散点图和线性回归模型,它通过可视化的方式直观展示了变量之间的线性相关性。我们可以通过观察散点图的分布和回归线的拟合程度判断两变量是否存在线性关系及其强弱。
线性回归模型的可视化分析为判断变量之间的线性依赖提供了重要依据。与相关系数相比,它通过图形化显示了变量之间线性相关的详细信息,这更加直观和准确。我们可以据此选择线性相关较强的变量进行线性回归模型的构建。
sns.lmplot(
data=None,
*,
x=None,
y=None,
hue=None,
col=None,
row=None,
palette=None,
col_wrap=None,
height=5,
aspect=1,
markers='o',
sharex=None,
sharey=None,
hue_order=None,
col_order=None,
row_order=None,
legend=True,
legend_out=None,
x_estimator=None,
x_bins=None,
x_ci='ci',
scatter=True,
fit_reg=True,
ci=95,
n_boot=1000,
units=None,
seed=None,
order=1,
logistic=False,
lowess=False,
robust=False,
logx=False,
x_partial=None,
y_partial=None,
truncate=True,
x_jitter=None,
y_jitter=None,
scatter_kws=None,
line_kws=None,
facet_kws=None,
)
plt.figure(figsize=(8,6 ))
sns.set_context('paper', font_scale=1.4)
sns.lmplot(
x='total_bill',
y='tip',
hue='sex',
data=tips_df,
markers=['o', '^'],
scatter_kws={'s': 100, 'linewidth': 0.5, 'edgecolor': 'w'}
)
plt.show()
<Figure size 800x600 with 0 Axes>
sns.lmplot(
x='total_bill',
y='tip',
col='sex',
row='time',
data=tips_df,
height=5,
aspect=0.7
)
plt.show()