seaborn可视化
一、seaborn函数结构
figure-level: 图绘制函数,把数据绘制到图对象
axes-level:轴绘制函数,把数据绘制到轴对象
下图:图绘制函数对应于下面的轴绘制函数,并且提供了对应的接口。在图绘制函数中对参数进行设置就可以实现轴绘制函数对应的功能。
displot:distribution plot,绘制直方图、KDE曲线等
relplot:relation plot,绘制散点图
lmplot:linear regression plot,绘制线性回归的拟合
catplot:plot,绘制类别变量图
二、安装seaborn
conda install seaborn
import seaborn as sns
# 查看版本
print(sns.__version__)
# 查看数据集
print(sns.get_dataset_names())
三、讲解案例
3.1 分类问题:企鹅种类
3.1.1查看数据集
penguin_df = sns.load_dataset("penguins")
print(penguin_df)
3.1.2 查看数值变量的取值范围,是否有异常值
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")
此外还可用catplot绘制箱型图:
sns.catplot(data = penguin_df,x = "bill_length_mm",kind = "box")
plt.savefig("boxplot.png")
把该数据集所有的数据绘制在一个箱型图上:
sns.catplot(data = penguin_df,kind = "box")
plt.savefig("boxplot.png")
由于数量级的差距,这样绘制出来的箱型图效果并不好。
3.1.2.2 柱状图
sns.displot(data=penguin_df,x="bill_length_mm")
plt.savefig("barplot.png")
使用histplot绘制可以得到带边框的图案
sns.histplot(data=penguin_df,x="bill_length_mm")
plt.savefig("barplot.png")
参数bins可以控制分组的个数,间接控制了区间的长度。
sns.histplot(data=penguin_df,x="bill_length_mm",bins=50)
plt.savefig("barplot.png")
除了数值变量,displot还可以绘制类别变量的图形。
sns.histplot(data=penguin_df,x="species")
plt.savefig("barplot.png")
使用参数hue可以使不同的条形呈现不同的颜色
sns.displot(data=penguin_df,x="species",hue="species")
plt.savefig("barplot.png")
使用参数shrink可以控制条形图的大小
sns.displot(data=penguin_df,x="species",hue="species",shrink = 0.7)
plt.savefig("barplot.png")
在使用countplot对类别进行绘制时,柱状的颜色各不相同,countplot没有shrink参数
3.1.2.2 KDE图
使用displot对参数kind进行修改,kind = “kde”
sns.displot(data=penguin_df,x="bill_length_mm",kind = "kde")
plt.savefig("kdeplot.png")
使用kdeplot绘制kde图像。效果相同但图片的宽高比不同,图像在矩形方框中进行呈现。
sns.kdeplot(data=penguin_df,x="bill_length_mm")
plt.savefig("kdeplot.png")
但是输出最大最小值可以看到,在<32.1和>59.6的时候就没有数据了,但在图上还是可以看到有曲线存在。
print(np.min(penguin_df["bill_length_mm"]))
print(np.max(penguin_df["bill_length_mm"]))
解决方法一:
添加参数cut,使cut=0,擦除超出数据范围的线。
解决方法二:
在直方图的基础上设置kde=True,实现在直方图上添加kde曲线
sns.displot(data=penguin_df,x="bill_length_mm",kde = True)
plt.savefig("kde_bar_plot.png")
3.1.3 分析双峰分布
使hue等于分类时的种类变量,可以得到数据中不同种类的kde曲线
sns.displot(data=penguin_df,x="bill_length_mm",kind = "kde",hue = "species")
plt.savefig("kdeplot.png")
3.1.4 分布有偏移的情况
以diamonds数据库为例,对分布有偏移的情况进行分析。
导入diamonds库,查看包含数据
dia_df = sns.load_dataset("diamonds")
print(dia_df)
绘制箱型图和条形图,可以看到其中的数据呈现偏移的情况
sns.boxplot(data = dia_df,x = "price")
plt.savefig("boxplot")
sns.displot(data = dis_df,x = "price")
plt.savefig("barplot")
对坐标轴x取对数处理,可以使其更加接近正态分布
sns.displot(data = dia_df,x = "price",log_scale = True)
plt.savefig("bar——plot")
使用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")
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")
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")
# 加入类别变量的因素
sns.displot(data=penguin_df,x="bill_length_mm",row = "sex",col = "island",kind = "kde",hue = "species")
plt.savefig("kdeplot.png")
3.1.7 sns.displot()绘制两个变量的联合分布
sns.displot(data=penguin_df,x="bill_length_mm",y="bill_depth_mm")
plt.savefig("two.png")
绘制等比线。
sns.displot(data=penguin_df,x="bill_length_mm",y="bill_depth_mm",kind = "kde")
plt.savefig("two.png")
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")
参数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")
sns.displot(data=penguin_df,x="island",y="species")
plt.savefig("two.png")
3.2 回归问题:估计参观餐馆给的小费
3.2.1 绘制箱型图查看数据分布情况
tip_df = sns.load_dataset("tips")
sns.boxplot(data = tip_df)
plt.savefig("boxplot.png")
可以看到数据中出现了部分的异常值,对具体的某一个数据进行查看,可以得到更具体的信息。
sns.boxplot(data = tip_df,x = "total_bill")
plt.savefig("boxplot")
3.2.2 数值变量的关系分析
3.2.2.1 sns.relplot():绘制散点图
sns.relplot(data = tip_df,x = "total_bill",y = "tip")
plt.savefig("dotplot")
加入时间因素和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")
将hue设置为用餐人数,表示的为数值变量,但也可近似看为是类别变量,在seaborn中,若类别变量之间存在大小关系,则seaborn会自动使用渐进色进行表示。
sns.relplot(data = tip_df,x = "total_bill",y = "tip",hue = "size")
plt.savefig("dotplot")
进行分组展示,col指定按照哪个列进行分组,并在子图中显示不同的组,col_wrap指定每行显示子图的数量。
sns.relplot(data = tip_df,x = "total_bill",y = "tip",col = "day",col_wrap = 2)
plt.savefig("dotplot")
3.2.2.2 sns.relplot():绘制连线图
连线图适合于连续变化的数据(例如:时序数据、股价的波动等)
sns.relplot(data = tip_df,x = "total_bill",y = "tip",kind = "line")
plt.savefig("lineplot")
3.2.2.3 sns.lmlplot():分析两个数值变量的线性关系
sns.lmplot(data=tip_df,x = "total_bill",y = "tip")
plt.savefig("lmplot")
使用regplot进行绘图,得到图形相同但宽高比不同的图像。
sns.regplot(data=tip_df,x = "total_bill",y = "tip")
plt.savefig("regplot")
使用residplot得到拟合后的残差,理想情况下数据在残差图中应该呈现以下特点:
- 均值为零: 残差的均值应该接近于零,表示拟合模型与真实值之间的平均误差为零。
- 随机分布: 残差应该在零附近随机分布,没有明显的模式或趋势。这意味着拟合模型没有遗漏重要的特征或结构。
- 同方差性: 残差的方差(离散程度)应该在不同的预测值范围内保持相对稳定,没有显著的差异。这表明模型在不同预测范围内的预测误差大小是相似的。
- 无异常值: 残差图中不应该有明显的离群点或异常值,它们可能表示模型对某些观测值产生了较大的误差。
sns.residplot(data=tip_df,x = "total_bill",y = "tip")
plt.savefig("residplot")
3.2.2.4 sns.jointplot():绘制两个变量的联合分布和各自分布
sns.jointplot(data=tip_df,x = "total_bill",y = "tip")
plt.savefig("jointplot")
这里kind参数可选
sns.jointplot(data=tip_df,x = "total_bill",y = "tip",kind="hex")
plt.savefig("jointplot")
也可以加入参数hue进行分类
sns.jointplot(data=tip_df,x = "total_bill",y = "tip",hue = "sex")
plt.savefig("jointplot")
使用jointplot也可以绘制类别变量。
sns.jointplot(data=penguin_df,x="island",y="species",kind = "hist")
plt.savefig("joint.png")
JointGrid为jointplot升级版。
使图形的内部为直方图,外部为箱型图。
g = sns.JointGrid(data=tip_df,x = "total_bill",y = "tip")
g.plot(sns.histplot,sns.boxplot)
plt.savefig("jointplot")
内部绘制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")
3.2.2.4 sns.pairplot():成对绘制所有数值变量的联合分布
sns.pairplot(data = tip_df)
plt.savefig("pairplot")
参数kind可为
sns.pairplot(data = tip_df,kind = "kde")
plt.savefig("pairplot")
可对x轴、y轴的变量进行规定
sns.pairplot(data = tip_df,kind = "kde",x_vars = ["total_bill","size"],y_vars = ["tip","size"])
plt.savefig("pairplot")
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")
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")
3.2.2.5.2 类别变量与数值变量的关系
(1)不同类别中数值变量的均值/中值估计:barplot,pointplot
sns.catplot(data = penguin_df,x = "species",y = "bill_length_mm",kind = "bar")
plt.savefig("catplot")
catplot的FacetGrid特性:
sns.catplot(data = tip_df,x = "time",y = "tip",kind = "bar",col = "size",col_wrap = 3)
plt.savefig("catplot")
(2)不同类别中数值变量的取指范围:boxplot,boxenplot
sns.catplot(data = penguin_df,x = "species",y = "bill_length_mm",kind = "box")
plt.savefig("catplot")
boxenplot适用于大数据集
(3)不同类别中数值变量的分布图:stripplot,swarmplot,violinplot
sns.catplot(data = penguin_df,x = "species",y = "bill_length_mm",kind = "strip")
plt.savefig("catplot")
使用jitter确定绘制的宽窄
sns.catplot(data = penguin_df,x = "species",y = "bill_length_mm",kind = "strip",jitter=0.5)
plt.savefig("catplot")
使用swarm可以避免出现叠加的情况
sns.catplot(data = penguin_df,x = "species",y = "bill_length_mm",kind = "swarm")
plt.savefig("catplot")
对上述点形成的曲线进行拟合的话,便生成了小提琴图。
sns.catplot(data = penguin_df,x = "species",y = "bill_length_mm",kind = "violin")
plt.savefig("catplot")
进行叠加
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")
增加不同的参数可以实现不同的功能。
增加类别变量:
使两类都各展示一半
sns.catplot(data = penguin_df,x = "species",y = "bill_length_mm",kind = "violin",hue = "sex",split = True)
plt.savefig("catplot")
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")
g = sns.FacetGrid(data = tip_df,row = "time",col = "smoker")
g.map(sns.scatterplot,"total_bill","tip")
plt.savefig("kdeplot")
3.2.3.2 PairGrid
g = sns.PairGrid(data = penguin_df,hue = "species")
g.map(sns.scatterplot)
plt.savefig("pairplot")
使对角线为kde曲线,其他部分为散点图
g = sns.PairGrid(data = penguin_df,hue = "species")
g.map_diag(sns.kdeplot)
g.map_offdiag(sns.scatterplot)
plt.savefig("pairplot")
还可加入hue等参数进行设置。