内容目录
散点图¶
散点图概念及简介¶
散点图也叫X-Y图,是一种以点的形式表示数据的图表类型,其中每个点的位置由变量的数值决定。散点图通常用于展示两个变量之间的关系,帮助我们观察变量之间的相关性、趋势和离群值。
散点图的主要用途包括:
- 显示变量之间的关系: 通过散点图,我们可以直观地看出两个变量之间是否存在某种关联或趋势。
- 发现异常值: 散点图可以帮助我们发现数据中的离群值或异常值。
- 比较不同组别数据: 可以使用不同颜色或形状的点来表示不同组别的数据,从而比较它们之间的差异。
散点图的函数说明¶
plt.scatter(x, y, s=None, c=None, marker=None, cmap=None, norm=None, vmin=None, vmax=None, alpha=None, linewidths=None, edgecolors=None, *, plotnonfinite=False, data=None, **kwargs)
- y (array-like): y轴数据。
- s (scalar or array-like, optional): 点的大小。
- c (color or sequence of color, optional): 点的颜色。
- marker (str, optional): 点的形状。
- cmap (Colormap, optional): 颜色映射。
- alpha (float, optional): 点的透明度。
- linewidths (float or array-like, optional): 点边界线宽度。
- edgecolors (color or sequence of color, optional): 点边界线颜色。
散点图示例代码¶
In [17]:
import matplotlib.pyplot as plt
import numpy as np
# 生成男生和女生的随机身高体重数据
np.random.seed(0)
num_points = 50
# 男生身高体重数据,正相关关系
male_height = np.random.normal(loc=170, scale=5, size=num_points)
male_weight = male_height * 0.6 + np.random.normal(loc=0, scale=2, size=num_points)
# 女生身高体重数据,正相关关系
female_height = np.random.normal(loc=160, scale=5, size=num_points)
female_weight = female_height * 0.5 + np.random.normal(loc=0, scale=2, size=num_points)
# 设置中文显示字体
plt.rcParams['font.sans-serif'] = ['PingFang HK']
plt.figure(figsize=(15,8))
# 绘制散点图
plt.scatter(male_height, male_weight, color='blue', label='男生', marker='o')
plt.scatter(female_height, female_weight, color='pink', label='女生', marker='s')
# 添加标题和标签
plt.title('男生和女生身高体重散点图')
plt.xlabel('身高(cm)')
plt.ylabel('体重(kg)')
# 添加图例
plt.legend()
plt.show()
增加平均线¶
In [16]:
import matplotlib.pyplot as plt
import numpy as np
# 生成男生和女生的随机身高体重数据
np.random.seed(0)
num_points = 50
# 男生身高体重数据,正相关关系
male_height = np.random.normal(loc=170, scale=5, size=num_points)
male_weight = male_height * 0.6 + np.random.normal(loc=0, scale=2, size=num_points)
# 女生身高体重数据,正相关关系
female_height = np.random.normal(loc=160, scale=5, size=num_points)
female_weight = female_height * 0.5 + np.random.normal(loc=0, scale=2, size=num_points)
# 计算男生和女生身高、体重的平均值
male_avg_height = np.mean(male_height)
male_avg_weight = np.mean(male_weight)
female_avg_height = np.mean(female_height)
female_avg_weight = np.mean(female_weight)
plt.rcParams['font.sans-serif'] = ['PingFang HK']
plt.figure(figsize=(15,8))
# 绘制散点图
plt.scatter(male_height, male_weight, color='blue', label='男生', marker='o')
plt.scatter(female_height, female_weight, color='pink', label='女生', marker='s')
# 添加平均线
plt.axvline(x=male_avg_height, color='blue', linestyle='--', label='男生平均身高')
plt.axhline(y=male_avg_weight, color='blue', linestyle='--', label='男生平均体重')
plt.axvline(x=female_avg_height, color='pink', linestyle='--', label='女生平均身高')
plt.axhline(y=female_avg_weight, color='pink', linestyle='--', label='女生平均体重')
# 添加标题和标签
plt.title('男生和女生身高体重散点图')
plt.xlabel('身高(cm)')
plt.ylabel('体重(kg)')
# 添加图例
plt.legend()
plt.show()
增加线性回归¶
In [18]:
import matplotlib.pyplot as plt
import numpy as np
from sklearn.linear_model import LinearRegression
# 生成男生和女生的随机身高体重数据
np.random.seed(0)
num_points = 50
# 男生身高体重数据,正相关关系
male_height = np.random.normal(loc=170, scale=5, size=num_points)
male_weight = male_height * 0.6 + np.random.normal(loc=0, scale=2, size=num_points)
# 女生身高体重数据,正相关关系
female_height = np.random.normal(loc=160, scale=5, size=num_points)
female_weight = female_height * 0.5 + np.random.normal(loc=0, scale=2, size=num_points)
plt.rcParams['font.sans-serif'] = ['PingFang HK']
plt.figure(figsize=(15,8))
# 绘制散点图
plt.scatter(male_height, male_weight, color='blue', label='男生', marker='o')
plt.scatter(female_height, female_weight, color='pink', label='女生', marker='s')
# 添加线性回归
# 这里使用Scikit-learn库中的LinearRegression模型进行线性回归,分别对男生和女生的身高、体重数据进行拟合,并在散点图中显示线性回归的结果
male_reg = LinearRegression().fit(male_height.reshape(-1, 1), male_weight)
female_reg = LinearRegression().fit(female_height.reshape(-1, 1), female_weight)
plt.plot(male_height, male_reg.predict(male_height.reshape(-1, 1)), color='blue', linestyle='--')
plt.plot(female_height, female_reg.predict(female_height.reshape(-1, 1)), color='pink', linestyle='--')
# 添加标题和标签
plt.title('男生和女生身高体重散点图')
plt.xlabel('身高(cm)')
plt.ylabel('体重(kg)')
# 添加图例
plt.legend()
plt.show()
In [ ]: