🐝 数据分析绘图

# 绘图基本理论 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"]) ```