Python图形绘制-直方图、密度图、小提琴图、箱图、正态QQ图、散点图和线图、热力图、回归拟合图、联合分布图

在构建模型之前,我们可以通过针对变量绘制图形的方式初步研究变量的分布特征。常用的图形绘制方法包括直方图、密度图、小提琴图、箱图、正态QQ图、散点图和线图、热力图、回归拟合图、联合分布图等,这些图形绘制方法可以帮助用户快速了解数据点的分布,还可以发现异常值的存在。

import numpy as np
import pandas as pd

# 设置随机种子以确保结果可重复
np.random.seed(0)

# 生成数据
data_size = 100
data = {
    'A': np.random.normal(loc=0, scale=1, size=data_size),  # 正态分布数据,均值0,标准差1
    'B': np.random.normal(loc=5, scale=2, size=data_size),  # 正态分布数据,均值5,标准差2
    'C': np.random.uniform(low=0, high=10, size=data_size),  # 均匀分布数据,范围[0, 10]
    'D': np.random.exponential(scale=1, size=data_size)      # 指数分布数据,尺度参数1
}
# 创建数据框
df = pd.DataFrame(data)

1 直方图

直方图(Histogram)又称柱状图,是一种统计报告图,由一系列高度不等的纵向条纹或线段表示数据分布的情况。一般用横轴表示数据类型,纵轴表示分布情况。通过绘制直方图可以较为直观地传递有关数据的变化信息,使数据使用者能够较好地观察数据波动的状态,使数据决策者能够依据分析结果确定在什么地方需要集中力量改进工作。

import matplotlib.pyplot as plt

# 绘制直方图
plt.figure(figsize=(10, 6))  # 设置图形大小
plt.hist(df['A'], bins=30, alpha=0.7, color='blue', edgecolor='black')  # 绘制直方图
# 参数说明:
# bins: 直方图的柱子数量
# alpha: 透明度
# color: 柱子的颜色
# edgecolor: 柱子的边缘颜色
plt.title('Histogram of A')  # 设置标题
plt.xlabel('Value')  # X轴标签
plt.ylabel('Frequency')  # Y轴标签
plt.grid(True)  # 显示网格
plt.show()  # 显示图形

2 密度图

密度图(Density Plot)用于显示数据在连续时间段内的分布状况,是直方图的进化,使用平滑曲线来绘制数值水平,从而得出更平滑的分布。密度图的峰值显示数值在该时间段内最为高度集中的位置。相对于直方图,密度图不受所使用分组数量(直方图中的条形)的影响,所以能更好地界定分布形状。

import seaborn as sns

# 绘制密度图
plt.figure(figsize=(10, 6))  # 设置图形大小
sns.kdeplot(df['A'], shade=True, color='blue')  # 绘制密度图
# 参数说明:
# shade: 是否填充曲线下方区域
# color: 曲线颜色
plt.title('Density Plot of A')  # 设置标题
plt.xlabel('Value')  # X轴标签
plt.ylabel('Density')  # Y轴标签
plt.grid(True)  # 显示网格
plt.show()  # 显示图形

3 箱图

箱图(Box-Plot)又称为盒须图、盒式图或箱线图,是一种用于显示一组数据的分散情况的统计图。箱图提供了一种只用5个点总结数据集的方式,这5个点包括最小值、第一个四分位数Q1、中位数点、第三个四分位数Q3、最大值。数据分析者通过绘制箱图不仅可以直观明了地识别数据中的异常值,还可以判断数据的偏态、尾重以及比较几批数据的形状。

# 绘制箱图
plt.figure(figsize=(10, 6))  # 设置图形大小
sns.boxplot(x=df['A'])  # 绘制箱图
# 参数说明:
# x: 变量,用于绘制箱图
plt.title('Box Plot of A')  # 设置标题
plt.xlabel('Value')  # X轴标签
plt.grid(True)  # 显示网格
plt.show()  # 显示图形

箱图把所有的数据分成了4部分:第1部分是从顶线到箱体的上部,这部分数据值在全体数据中排名前25%;第2部分是从箱体的上部到箱体中间的线,这部分数据值在全体数据中排名25%以下、50%以上;第3部分是从箱体中间的线到箱体的下部,这部分数据值在全体数据中排名50%以下、75%以上;第4部分是从箱体的底部到底线,这部分数据值在全体数据中排名后25%。顶线与底线的间距在一定程度上表示了数据的离散程度,间距越大就越离散。

4 小提琴图

小提琴图其实是箱式图与密度图的结合,通过使用密度曲线描述一组或多组的数值数据分布。箱式图展示了分位数的位置,小提琴图则展示了任意位置的密度。


# 绘制小提琴图
plt.figure(figsize=(10, 6))  # 设置图形大小
sns.violinplot(x=df['A'])  # 绘制小提琴图
# 参数说明:
# x: 变量,用于绘制小提琴图
plt.title('Violin Plot of A')  # 设置标题
plt.xlabel('Value')  # X轴标签
plt.grid(True)  # 显示网格
plt.show()  # 显示图形

5 正态QQ图

正态QQ图是由标准正态分布的分位数为横坐标,样本值为纵坐标的散点图,通过把测试样本数据的分位数与已知分布相比较来检验数据是否服从正态分布。如果QQ图中的散点近似地在图中的直线附近,就说明是正态分布,而且该直线的斜率为标准差,截距为均值。

# 绘制Q-Q图
plt.figure(figsize=(10, 6))  # 设置图形大小
stats.probplot(df['A'], dist="norm", plot=plt)  # 绘制Q-Q图
# 参数说明:
# dist: 使用的理论分布,"norm"表示正态分布
plt.title('Normal Q-Q Plot of A')  # 设置标题
plt.grid(True)  # 显示网格
plt.show()  # 显示图形

6 散点图和线图

作为对数据进行预处理的重要工具之一,散点图(Scatter Diagram)深受专家、学者们的喜爱。散点图的简要定义就是点在直角坐标系平面上的分布图。研究者对数据制作散点图的主要出发点是通过绘制该图来观察某变量随另一变量变化的大致趋势,据此可以探索数据之间的关联关系,甚至选择合适的函数对数据点进行拟合。散点图的绘制函数是plt.scatter()和sns.scatterplot()。其中plt.scatter()的具体函数形式为:

matplotlib.pyplot.scatter(x, y, s=None, c=None, marker=None, cmap=None, norm=None,
vmin=None, vmax=None, alpha=None, linewidths=None, verts=None, edgecolors=None, *, data=None,
**kwargs)

函数中常用的参数说明如下:

● x,y分别表示用于绘制散点图的x轴和y轴的数据点。

● s用于控制散点的大小。

● c即color,用于设置散点标记的颜色,默认是蓝色(b)​,如果是红色,则为'r'。● marker用于设置散点标记的样式,默认为'o'。

● linewidth用于设置标记点的长度。

# 绘制散点图
plt.figure(figsize=(10, 6))  # 设置图形大小
plt.scatter(df['A'], df['B'], alpha=0.7, color='blue', edgecolor='black')  # 绘制散点图
# 参数说明:
# alpha: 透明度
# color: 点的颜色
# edgecolor: 点的边缘颜色
plt.title('Scatter Plot of A vs B')  # 设置标题
plt.xlabel('A')  # X轴标签
plt.ylabel('B')  # Y轴标签
plt.grid(True)  # 显示网格
plt.show()  # 显示图形

# 绘制线图
plt.figure(figsize=(10, 6))  # 设置图形大小
# 生成 x 轴数据,从 0 开始,以 0.5 为步长,到 9.5 结束
x = np.arange(0, 10, 0.5)

# 生成与 x 轴数据长度相同的随机数据,服从标准正态分布
y = np.random.randn(len(x))
plt.plot(x, y, marker='o', linestyle='-', color='blue')  # 绘制线图
# 参数说明:
# marker: 数据点标记的样式
# linestyle: 线条的样式
# color: 线条的颜色
plt.title('Line Plot of A vs B')  # 设置标题
plt.xlabel('A')  # X轴标签
plt.ylabel('B')  # Y轴标签
plt.grid(True)  # 显示网格
plt.show()  # 显示图形

线图与散点图的区别就是用一条线来替代散点标志,这样做可以更加清晰直观地看出数据走势,但却无法观察到每个散点的准确定位。从用途上看,线图常用于时间序列分析的数据预处理,用来观察变量随时间的变化趋势。此外,线图可以同时反映多个变量随时间的变化情况,所以线图的应用范围也非常广泛。

7 热力图

热力图是某种事物密集度的图形化显示,是展示差异的一种非常直观的方法。热力图的右侧是颜色带,也叫图例说明,代表了数值到颜色的映射,数值由小到大对应颜色由浅到深。数据值在图形中以颜色的深浅来表示数量的多少,从图中可以快速找到最大值与最小值所在的位置。

# 计算相关矩阵
correlation_matrix = df.corr()

# 绘制热力图
plt.figure(figsize=(10, 6))  # 设置图形大小
sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm', center=0)  # 绘制热力图
# 参数说明:
# annot: 是否在热力图上显示数值
# cmap: 颜色映射,'coolwarm'是一个渐变色
# center: 用于颜色映射的中心值
plt.title('Heatmap of Correlation Matrix')  # 设置标题
plt.show()  # 显示图形

8 回归拟合图

散点图只能大致显示响应变量和特征之间的关系,为了深入研究其拟合关系,可以通过绘制回归拟合图的方式进行观察。回归拟合图应用最小二乘法原理,让误差的平方和最小,但回归拟合图反映的只是大概,并不精确,只能为后续真正做数据拟合提供参考信息。


# 绘制回归拟合图
import numpy as np
import seaborn as sns

# 生成 x 轴数据,从 0 开始,以 0.5 为步长,到 9.5 结束
x = np.arange(0, 10, 0.5)

# 根据线性关系生成 y 轴数据,并加上一些随机噪声
y = 2 * x + np.random.randn(len(x))

# 使用 seaborn 的 regplot 函数绘制回归拟合图
# 参数 x 和 y 分别是 x 轴和 y 轴数据
sns.regplot(x=x, y=y)

# 设置图形标题为'Regression Fit Plot'
plt.title('Regression Fit Plot')

# 设置 x 轴标签为'X'
plt.xlabel('X')

# 设置 y 轴标签为'Y'
plt.ylabel('Y')

# 显示图形
plt.show()

回归拟合图在研究简单的最小二乘回归分析时比较有用,也就是在只有1个特征变量时可以看出特征变量与响应变量之间的拟合关系。

9 联合分布图

联合分布图是一个多面板图形,比如散点图、二维直方图、核密度估计等在同一个图形上显示,它用来显示两个变量之间的双变量关系以及每个变量在单独坐标轴上的单变量分布。联合分布图用到的函数为sns.jointplot(),具体语法格式如下:

serborn.jointplot(x,y,data=None,kind="scatter",stat_func=,color=r,size=8,ratio=6,
space=0.3,dropna=True,xlim=None,ylim=None,joint_kws=None,marginal_kws=None,annot_kws=None,
**kwargs)

函数中常用参数的含义如下:

● kind:表示绘制图形的类型,kind的类型可以是hex, kde, scatter, reg, hist。当kind='reg'时,它显示最佳拟合线。

● stat_func:用于计算有关关系的统计量并标注图。

● color:表示绘图元素的颜色。

● size:用于设置图的大小(正方形)​。

● ratio:表示中心图与侧边图的比例。该参数的值越大,则中心图的占比会越大。

● space:用于设置中心图与侧边图的间隔大小。

● xlim,ylim:表示x轴、y轴的范围。

# 绘制联合分布图

sns.jointplot(x='A', y='B', data=df, kind='scatter', color='blue')  # 绘制联合分布图
# 参数说明:
# x: 自变量
# y: 因变量
# data: 数据框
# kind: 图形类型,'scatter'表示散点图
# color: 图形颜色
plt.show()  # 显示图形

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值