🐝 数据分析绘图
# 绘图基本理论
fix和ax是常见的两个对象。分别表示图形和子图。
fig是Figure类的一个实例,表示一个完整的图形,包含了所有的子图、轴、标题、标签等元素。可以使用plt.figure()函数或者plt.subplots()函数来创建一个fig对象。
ax是Axes类的一个实例,表示一个子图,包含了坐标轴、数据点、线条、图例等元素。你可以使用plt.subplot()函数或者plt.subplots()函数来创建一个或多个ax对象
# matplotlib配置
`plt.rcParams['figure.figsize']`是matplotlib库的配置,显示了matplotlib库默认显示的宽度和高度——6.4英寸和4.8英寸。
可以通过赋值来覆盖默认配置。
## 注意事项
matplotlib3.6版本之后将不支持子图重叠,需要显式地消除无用子图,或者给不同子图以不同的名称。
# 绘制箱型图
```
# 4和6的单位是英寸
fig = plt.figure(figsize=(4,6))
# h代表水平,width代表箱型图的腰部长度
sns.boxplot(data, orient='h', width=0.5)
```
# 绘制QQ图
```
# QQ图是一种用于检验数据分布的散点图,通常用于比较两组数据是否来自同一分布,或者一组数据是否符合某个理论分布(如正态分布)。
# QQ图的横坐标是一个样本的分位数,纵坐标是另一个样本的分位数。如果两个样本的分布相同,那么QQ图中的点会大致落在y=x附近。如果两个样本的分布线性相关,那么QQ图中的点会大致落在一条直线上,但不一定是y=x。
# 如果要检验一组数据是否符合正态分布,可以用标准正态分布的分位数作为横坐标,样本值作为纵坐标。如果数据近似服从正态分布,那么QQ图中的点会大致落在一条直线上,该直线的斜率为标准差,截距为均值。
import seaborn as sns
import scipy.stats as stats
import matplotlib.pyplot as plt
# 绘制子图
fig, (ax1, ax2) = plt.subplots(1, 2)
# fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(10, 5))
# 设置画布的大小
fig.set_figwidth(5)
fig.set_figheight(2.5)
# 在第一个子图上绘制直方图
sns.histplot(train_data['V0'], ax=ax1, kde=True)
# 在第二个子图上绘制QQ图,检验是否符合正态分布
stats.probplot(train_data['V0'], dist="norm", plot=ax2)
plt.show()
```
另外一种写法,推荐第一种,先定义好对象,再具体填充对象。代码可读性更强。下面这种适用于循环展示不同属性列的图像。
```
# 查看数据分布图 查看特征变量‘V0’的数据分布直方图,并绘制Q-Q图查看数据是否近似于正态分布
plt.figure(figsize=(5, 2.5))
ax = plt.subplot(1, 2, 1)
# sns库可能会有warnings,根据warnings解决bug
# kde为True表示启用核密度估计
sns.histplot(train_data['V0'], kde=True)
ax = plt.subplot(1, 2, 2)
res = stats.probplot(train_data['V0'], dist="norm", plot=plt) # 绘制Q-Q图
```
# 比较测试集和训练集的分布
```
#对比同一特征变量‘V0’下,训练集数据和测试集数据的分布情况,查看数据分布是否一致
ax = sns.kdeplot(train_data['V0'], color="Red", fill=True)
ax = sns.kdeplot(test_data['V0'], color="Blue", fill=True)
ax.set_xlabel('V0')
ax.set_ylabel("Frequency")
ax = ax.legend(["train","test"])
```