seaborn可视化

一、seaborn函数结构

figure-level: 图绘制函数,把数据绘制到图对象

axes-level:轴绘制函数,把数据绘制到轴对象

下图:图绘制函数对应于下面的轴绘制函数,并且提供了对应的接口。在图绘制函数中对参数进行设置就可以实现轴绘制函数对应的功能。

displot:distribution plot,绘制直方图、KDE曲线等

relplot:relation plot,绘制散点图

lmplot:linear regression plot,绘制线性回归的拟合

catplot:plot,绘制类别变量图

python制作在线预览拓扑图_python制作在线预览拓扑图

二、安装seaborn

conda install seaborn

import seaborn as sns

# 查看版本
print(sns.__version__)
# 查看数据集
print(sns.get_dataset_names())

python制作在线预览拓扑图_开发语言_02

三、讲解案例

3.1 分类问题:企鹅种类

3.1.1查看数据集

penguin_df = sns.load_dataset("penguins")
print(penguin_df)

python制作在线预览拓扑图_python_03

3.1.2 查看数值变量的取值范围,是否有异常值

python制作在线预览拓扑图_python_04


PS:对displot中的kind参数进行修改,可以实现histplot、kdeplot、ecdplot的绘制

3.1.2.1箱型图
# x=...表示在x轴上绘制,也可以改为y
sns.boxplot(data = penguin_df,x = "bill_length_mm")
# 保存图像
plt.savefig("boxplot.png")

python制作在线预览拓扑图_开发语言_05


此外还可用catplot绘制箱型图:

sns.catplot(data = penguin_df,x = "bill_length_mm",kind = "box")
plt.savefig("boxplot.png")

python制作在线预览拓扑图_数学建模_06


把该数据集所有的数据绘制在一个箱型图上:

sns.catplot(data = penguin_df,kind = "box")
plt.savefig("boxplot.png")

python制作在线预览拓扑图_数学建模_07

由于数量级的差距,这样绘制出来的箱型图效果并不好。

3.1.2.2 柱状图
sns.displot(data=penguin_df,x="bill_length_mm")
plt.savefig("barplot.png")

python制作在线预览拓扑图_数据_08


使用histplot绘制可以得到带边框的图案

sns.histplot(data=penguin_df,x="bill_length_mm")
plt.savefig("barplot.png")

python制作在线预览拓扑图_开发语言_09


参数bins可以控制分组的个数,间接控制了区间的长度。

sns.histplot(data=penguin_df,x="bill_length_mm",bins=50)
plt.savefig("barplot.png")

python制作在线预览拓扑图_python_10


除了数值变量,displot还可以绘制类别变量的图形。

sns.histplot(data=penguin_df,x="species")
plt.savefig("barplot.png")

python制作在线预览拓扑图_python制作在线预览拓扑图_11


使用参数hue可以使不同的条形呈现不同的颜色

sns.displot(data=penguin_df,x="species",hue="species")
plt.savefig("barplot.png")

python制作在线预览拓扑图_数学建模_12


使用参数shrink可以控制条形图的大小

sns.displot(data=penguin_df,x="species",hue="species",shrink = 0.7)
plt.savefig("barplot.png")

python制作在线预览拓扑图_python_13


在使用countplot对类别进行绘制时,柱状的颜色各不相同,countplot没有shrink参数

python制作在线预览拓扑图_python制作在线预览拓扑图_14

3.1.2.2 KDE图

使用displot对参数kind进行修改,kind = “kde”

sns.displot(data=penguin_df,x="bill_length_mm",kind = "kde")
plt.savefig("kdeplot.png")

python制作在线预览拓扑图_数学建模_15


使用kdeplot绘制kde图像。效果相同但图片的宽高比不同,图像在矩形方框中进行呈现。

sns.kdeplot(data=penguin_df,x="bill_length_mm")
plt.savefig("kdeplot.png")

python制作在线预览拓扑图_python制作在线预览拓扑图_16


但是输出最大最小值可以看到,在<32.1和>59.6的时候就没有数据了,但在图上还是可以看到有曲线存在。

print(np.min(penguin_df["bill_length_mm"]))
print(np.max(penguin_df["bill_length_mm"]))

python制作在线预览拓扑图_数据_17


解决方法一

添加参数cut,使cut=0,擦除超出数据范围的线。

python制作在线预览拓扑图_数学建模_18


解决方法二

在直方图的基础上设置kde=True,实现在直方图上添加kde曲线

sns.displot(data=penguin_df,x="bill_length_mm",kde = True)
plt.savefig("kde_bar_plot.png")

python制作在线预览拓扑图_开发语言_19

3.1.3 分析双峰分布

使hue等于分类时的种类变量,可以得到数据中不同种类的kde曲线

sns.displot(data=penguin_df,x="bill_length_mm",kind = "kde",hue = "species")
plt.savefig("kdeplot.png")

python制作在线预览拓扑图_开发语言_20

3.1.4 分布有偏移的情况

以diamonds数据库为例,对分布有偏移的情况进行分析。
导入diamonds库,查看包含数据

dia_df = sns.load_dataset("diamonds")
print(dia_df)

python制作在线预览拓扑图_python制作在线预览拓扑图_21

绘制箱型图和条形图,可以看到其中的数据呈现偏移的情况

sns.boxplot(data = dia_df,x = "price")
plt.savefig("boxplot")
sns.displot(data = dis_df,x = "price")
plt.savefig("barplot")

python制作在线预览拓扑图_python制作在线预览拓扑图_22


python制作在线预览拓扑图_python_23


对坐标轴x取对数处理,可以使其更加接近正态分布

sns.displot(data = dia_df,x = "price",log_scale = True)
plt.savefig("bar——plot")

python制作在线预览拓扑图_数学建模_24


使用kde曲线比较训练集和测试集变量的分布是否一致(两张kde图像画到一张上面去)

train_df,test_df = train_test_split(dia_df,test_size = 0.3,random_state=42)
# 把训练集和测试集两批数据放到同一张图上,第一批数据可以用displot或kdeplot,但是第二批数据必须是kdeplot
sns.displot(data=train_df,x = "depth",kind = "kde",linewidth = 5.0,color = "r")
sns.kdeplot(data=test_df,x = "depth",color="g")
plt.savefig("two")

python制作在线预览拓扑图_数据_25

3.1.5 ecdf曲线

CDF (Empirical Cumulative Distribution Function) 曲线是一种描述经验累积分布函数的图形表示方法。经验累积分布函数是用来描述样本数据的累积分布情况的统计工具。
ECDF 曲线由一系列的数据点组成,其中每个数据点表示给定样本数据中小于或等于该值的观测值的比例。

sns.displot(data=penguin_df,x="bill_length_mm",kind = "ecdf")
plt.savefig("ecdfplot.png")

python制作在线预览拓扑图_开发语言_26

3.1.6 FacetGrid特性

包含:

  • 灵活的子图布局: FacetGrid可以根据条件变量的不同值自动创建和排列子图。它可以支持多行、多列的子图布局,适应不同的数据集大小。
  • 按指定条件分组: 你可以使用FacetGrid根据一个或多个条件变量对数据进行分组,每个子图将显示一个条件的子集。例如,你可以根据类别、时间或任何其他分类变量来创建不同子图。
  • 灵活的绘图函数: FacetGrid允许你自定义每个子图中的绘图函数。你可以使用Seaborn的绘图函数(如distplot、scatterplot等)或自定义函数来绘制子图中的数据。
  • 条件设置: FacetGrid提供了一系列可选参数,以便进一步自定义子图的外观,例如坐标轴标签、标题、刻度、间距等。
    使用FacetGrid,可以将数据按照不同的条件分组并绘制多个子图,然后在各个子集上分析数据集的变量分布,从而更好地理解数据集中的模式和关系。
# 以企鹅的性别为行、岛屿为列
sns.displot(data=penguin_df,x="bill_length_mm",row = "sex",col = "island",kind = "kde")
plt.savefig("kdeplot.png")

python制作在线预览拓扑图_开发语言_27

# 加入类别变量的因素
sns.displot(data=penguin_df,x="bill_length_mm",row = "sex",col = "island",kind = "kde",hue = "species")
plt.savefig("kdeplot.png")

python制作在线预览拓扑图_开发语言_28

3.1.7 sns.displot()绘制两个变量的联合分布

sns.displot(data=penguin_df,x="bill_length_mm",y="bill_depth_mm")
plt.savefig("two.png")

python制作在线预览拓扑图_开发语言_29


绘制等比线。

sns.displot(data=penguin_df,x="bill_length_mm",y="bill_depth_mm",kind = "kde")
plt.savefig("two.png")

python制作在线预览拓扑图_数据_30


thresh是displot函数的一个可选参数,用于指定显示核密度估计轮廓的阈值。 若thresh=0.2,则只有大于0.2的部分才可以绘制出来。

sns.displot(data=penguin_df,x="bill_length_mm",y="bill_depth_mm",kind = "kde",thresh=0.2)
plt.savefig("two.png")

python制作在线预览拓扑图_数据_31


参数levels决定所绘制的图像中线的疏密。

sns.displot(data=penguin_df,x="bill_length_mm",y="bill_depth_mm",kind = "kde",thresh=0.2,levels=5)
plt.savefig("two.png")

python制作在线预览拓扑图_开发语言_32

sns.displot(data=penguin_df,x="island",y="species")
plt.savefig("two.png")

python制作在线预览拓扑图_python制作在线预览拓扑图_33

3.2 回归问题:估计参观餐馆给的小费

3.2.1 绘制箱型图查看数据分布情况

tip_df = sns.load_dataset("tips")
sns.boxplot(data = tip_df)
plt.savefig("boxplot.png")

python制作在线预览拓扑图_数据_34


可以看到数据中出现了部分的异常值,对具体的某一个数据进行查看,可以得到更具体的信息。

sns.boxplot(data = tip_df,x = "total_bill")

plt.savefig("boxplot")

python制作在线预览拓扑图_python_35

3.2.2 数值变量的关系分析

3.2.2.1 sns.relplot():绘制散点图
sns.relplot(data = tip_df,x = "total_bill",y = "tip")
plt.savefig("dotplot")

python制作在线预览拓扑图_python_36

加入时间因素和hue,使图像更清晰的对数据做出表示。

# hue = "time"加入类别变量
# style = "time",markers = ["o","^"],使一个类别用○表示,一个类别用▲表示
sns.relplot(data = tip_df,x = "total_bill",y = "tip",hue = "time",style = "time",markers = ["o","^"])
plt.savefig("dotplot")

python制作在线预览拓扑图_python制作在线预览拓扑图_37


将hue设置为用餐人数,表示的为数值变量,但也可近似看为是类别变量,在seaborn中,若类别变量之间存在大小关系,则seaborn会自动使用渐进色进行表示。

sns.relplot(data = tip_df,x = "total_bill",y = "tip",hue = "size")
plt.savefig("dotplot")

python制作在线预览拓扑图_python制作在线预览拓扑图_38

进行分组展示,col指定按照哪个列进行分组,并在子图中显示不同的组,col_wrap指定每行显示子图的数量。

sns.relplot(data = tip_df,x = "total_bill",y = "tip",col = "day",col_wrap = 2)
plt.savefig("dotplot")

python制作在线预览拓扑图_数学建模_39

3.2.2.2 sns.relplot():绘制连线图

连线图适合于连续变化的数据(例如:时序数据、股价的波动等)

sns.relplot(data = tip_df,x = "total_bill",y = "tip",kind = "line")
plt.savefig("lineplot")

python制作在线预览拓扑图_python制作在线预览拓扑图_40

3.2.2.3 sns.lmlplot():分析两个数值变量的线性关系
sns.lmplot(data=tip_df,x = "total_bill",y = "tip")
plt.savefig("lmplot")

python制作在线预览拓扑图_开发语言_41

使用regplot进行绘图,得到图形相同但宽高比不同的图像。

sns.regplot(data=tip_df,x = "total_bill",y = "tip")
plt.savefig("regplot")

python制作在线预览拓扑图_python_42

使用residplot得到拟合后的残差,理想情况下数据在残差图中应该呈现以下特点:

  • 均值为零: 残差的均值应该接近于零,表示拟合模型与真实值之间的平均误差为零。
  • 随机分布: 残差应该在零附近随机分布,没有明显的模式或趋势。这意味着拟合模型没有遗漏重要的特征或结构。
  • 同方差性: 残差的方差(离散程度)应该在不同的预测值范围内保持相对稳定,没有显著的差异。这表明模型在不同预测范围内的预测误差大小是相似的。
  • 无异常值: 残差图中不应该有明显的离群点或异常值,它们可能表示模型对某些观测值产生了较大的误差。
sns.residplot(data=tip_df,x = "total_bill",y = "tip")
plt.savefig("residplot")

python制作在线预览拓扑图_python_43

3.2.2.4 sns.jointplot():绘制两个变量的联合分布和各自分布
sns.jointplot(data=tip_df,x = "total_bill",y = "tip")
plt.savefig("jointplot")

python制作在线预览拓扑图_数学建模_44

这里kind参数可选python制作在线预览拓扑图_数学建模_45

sns.jointplot(data=tip_df,x = "total_bill",y = "tip",kind="hex")
plt.savefig("jointplot")

python制作在线预览拓扑图_数学建模_46


也可以加入参数hue进行分类

sns.jointplot(data=tip_df,x = "total_bill",y = "tip",hue = "sex")
plt.savefig("jointplot")

python制作在线预览拓扑图_python_47


使用jointplot也可以绘制类别变量。

sns.jointplot(data=penguin_df,x="island",y="species",kind = "hist")
plt.savefig("joint.png")

python制作在线预览拓扑图_数据_48

JointGrid为jointplot升级版。
使图形的内部为直方图,外部为箱型图。

g = sns.JointGrid(data=tip_df,x = "total_bill",y = "tip")
g.plot(sns.histplot,sns.boxplot)
plt.savefig("jointplot")

python制作在线预览拓扑图_数据_49

内部绘制kde曲线,边缘分布采用直方图叠加kde曲线

g = sns.JointGrid(data=tip_df,x = "total_bill",y = "tip")
g.plot_joint(sns.kdeplot)
g.plot_marginals(sns.histplot,kde=True)
plt.savefig("jointplot")

python制作在线预览拓扑图_数学建模_50

3.2.2.4 sns.pairplot():成对绘制所有数值变量的联合分布
sns.pairplot(data = tip_df)
plt.savefig("pairplot")

python制作在线预览拓扑图_python_51


参数kind可为python制作在线预览拓扑图_python制作在线预览拓扑图_52

sns.pairplot(data = tip_df,kind = "kde")
plt.savefig("pairplot")

python制作在线预览拓扑图_python制作在线预览拓扑图_53


可对x轴、y轴的变量进行规定

sns.pairplot(data = tip_df,kind = "kde",x_vars = ["total_bill","size"],y_vars = ["tip","size"])
plt.savefig("pairplot")

python制作在线预览拓扑图_数学建模_54


PairGrid为pairplot的升级版

g = sns.PairGrid(data = tip_df,x_vars = ["total_bill","size"],y_vars = ["tip","size"])
# 定义上三角为散点图
g.map_upper(sns.scatterplot)
# 定义对角线部分为直方图+kde
g.map_diag(sns.histplot,kde = True)
# 定义下三角部分为拟合图
g.map_lower(sns.regplot)
plt.savefig("pairplot")

python制作在线预览拓扑图_数学建模_55

3.2.2.5 data.corr()+sns.heatmap():用热力图成对绘制所有数值变量的相关系数

首先求出来每对数值变量的相关系数

car_df = sns.load_dataset("car_crashes")
car_cor = sns.corr(car_df)
print(car_cor)

使用热力图绘制相关系数

sns.heatmap(car_cor,cmap = "Blues")
3.2.2.5 类别变量的分析
3.2.2.5.1 类别变量的分布:sns.countplot(),类似sns.histplot()
sns.catplot(data = penguin_df,x = "species",y = "bill_length_mm",kind = "bar",estimator=np.median,color="steelblue")
plt.savefig("bar.png")
# 得到三个中点连起来的图像
sns.catplot(data = penguin_df,x = "species",y = "bill_length_mm",kind = "point")
plt.savefig("point.png")

python制作在线预览拓扑图_python制作在线预览拓扑图_56


python制作在线预览拓扑图_数学建模_57

3.2.2.5.2 类别变量与数值变量的关系

(1)不同类别中数值变量的均值/中值估计:barplot,pointplot

sns.catplot(data = penguin_df,x = "species",y = "bill_length_mm",kind = "bar")
plt.savefig("catplot")

python制作在线预览拓扑图_python制作在线预览拓扑图_58


catplot的FacetGrid特性:

sns.catplot(data = tip_df,x = "time",y = "tip",kind = "bar",col = "size",col_wrap = 3)
plt.savefig("catplot")

python制作在线预览拓扑图_数学建模_59

(2)不同类别中数值变量的取指范围:boxplot,boxenplot

sns.catplot(data = penguin_df,x = "species",y = "bill_length_mm",kind = "box")
plt.savefig("catplot")

python制作在线预览拓扑图_数学建模_60


boxenplot适用于大数据集

(3)不同类别中数值变量的分布图:stripplot,swarmplot,violinplot

sns.catplot(data = penguin_df,x = "species",y = "bill_length_mm",kind = "strip")
plt.savefig("catplot")

python制作在线预览拓扑图_python制作在线预览拓扑图_61


使用jitter确定绘制的宽窄

sns.catplot(data = penguin_df,x = "species",y = "bill_length_mm",kind = "strip",jitter=0.5)
plt.savefig("catplot")

python制作在线预览拓扑图_数学建模_62


使用swarm可以避免出现叠加的情况

sns.catplot(data = penguin_df,x = "species",y = "bill_length_mm",kind = "swarm")
plt.savefig("catplot")

python制作在线预览拓扑图_数据_63

对上述点形成的曲线进行拟合的话,便生成了小提琴图。

sns.catplot(data = penguin_df,x = "species",y = "bill_length_mm",kind = "violin")
plt.savefig("catplot")

python制作在线预览拓扑图_数据_64


进行叠加

sns.catplot(data = penguin_df,x = "species",y = "bill_length_mm",kind = "violin")
sns.swarmplot(data = penguin_df,x = "species",y = "bill_length_mm")
plt.savefig("catplot")

python制作在线预览拓扑图_python_65


增加不同的参数可以实现不同的功能。

增加类别变量:

python制作在线预览拓扑图_数据_66


使两类都各展示一半

sns.catplot(data = penguin_df,x = "species",y = "bill_length_mm",kind = "violin",hue = "sex",split = True)
plt.savefig("catplot")

python制作在线预览拓扑图_开发语言_67

3.2.3 FacetGrid、PairGrid中自定义绘制函数

FacetFrid依据类别变量中不同的类别进行子集的划分,然后针对不同的子集进行分析。
PairGrid在全部的数据集上把全部的数值变量成对的进行分析。

3.2.3.1 FacetGrid

根据time和smoker把数据集分为四个子集,然后在不同的子集上分别绘制tip的分布

g = sns.FacetGrid(data = tip_df,row = "time",col = "smoker")
g.map(sns.kdeplot,"tip")
plt.savefig("kdeplot")

python制作在线预览拓扑图_python_68

g = sns.FacetGrid(data = tip_df,row = "time",col = "smoker")
g.map(sns.scatterplot,"total_bill","tip")
plt.savefig("kdeplot")

python制作在线预览拓扑图_开发语言_69

3.2.3.2 PairGrid
g = sns.PairGrid(data = penguin_df,hue = "species")
g.map(sns.scatterplot)
plt.savefig("pairplot")

python制作在线预览拓扑图_数学建模_70


使对角线为kde曲线,其他部分为散点图

g = sns.PairGrid(data = penguin_df,hue = "species")
g.map_diag(sns.kdeplot)
g.map_offdiag(sns.scatterplot)
plt.savefig("pairplot")

python制作在线预览拓扑图_数据_71


还可加入hue等参数进行设置。