我的知识记录

Python matplotlib画散点图:分析两组数据相关性

用Python matplotlib画散点图,展示两个变量之间的相关性,含颜色映射、点大小区分、回归线和中文配置,代码完整可运行。

场景痛点

分析广告投入和销售额、学习时长和成绩、身高和体重这类成对数据时,最直观的就是散点图。Excel里画散点图要手动选两列数据、加趋势线,点多了还看不清分布。用matplotlib画散点图,不仅能显示数据分布,还能按第三维数据上色、加回归线,一眼看出相关性强弱。

用到的库

pip install matplotlib pandas numpy

完整代码

# 导入库
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
import numpy as np

# 解决中文乱码
matplotlib.rcParams["font.sans-serif"] = ["SimHei", "Microsoft YaHei", "Arial Unicode MS"]
matplotlib.rcParams["axes.unicode_minus"] = False


def draw_scatter():
# 模拟广告投入(万元)和销售额(万元)数据
np.random.seed(42)  # 固定随机种子,结果可复现
ad_cost = np.random.uniform(5, 50, 60)  # 广告投入5到50万
# 销售额和广告投入正相关,加一点噪声
sales = 2.5 * ad_cost + np.random.normal(0, 15, 60)
# 点的大小按第三维数据(客户数)变化
customer = np.random.uniform(50, 300, 60)

plt.figure(figsize=(10, 6))

# 画散点,颜色和大小都带映射
scatter = plt.scatter(
ad_cost, sales,
c=customer,        # 颜色代表客户数
s=customer,         # 点大小也代表客户数
cmap="viridis",     # 配色方案
alpha=0.7,          # 透明度,重叠点可见
edgecolors="gray",
)

# 加一条拟合回归线
coef = np.polyfit(ad_cost, sales, 1)
x_line = np.linspace(5, 50, 100)
y_line = coef[0] * x_line + coef[1]
plt.plot(x_line, y_line, color="red", linestyle="--", label="趋势线")

plt.title("广告投入与销售额关系", fontsize=16)
plt.xlabel("广告投入(万元)", fontsize=12)
plt.ylabel("销售额(万元)", fontsize=12)
plt.legend()

# 加颜色条说明颜色含义
plt.colorbar(scatter, label="客户数")

plt.tight_layout()
plt.savefig("scatter_chart.png", dpi=150)
plt.close()
print("散点图已保存为 scatter_chart.png")


if __name__ == "__main__":
draw_scatter()

代码讲解

  • np.random.seed(42) 固定随机种子,每次运行生成的数据一样,方便复现和调试。
  • plt.scatter()c 参数把第三个维度映射到颜色,s 参数映射到点大小,cmap 指定配色方案。
  • alpha=0.7 设置半透明,数据点重叠时不会完全糊成一团。
  • np.polyfit(ad_cost, sales, 1) 做一元线性拟合,返回斜率和截距,再用 plot 画出红色虚线回归线。
  • plt.colorbar() 把颜色对应的数值范围显示在右侧,让读者看懂颜色含义。

运行结果

当前目录生成 scatter_chart.png,图中60个散点按客户数大小和颜色区分,叠加一条红色虚线回归线,横轴广告投入、纵轴销售额,右侧有颜色条。整体点从左下往右上分布,说明两者正相关。

注意事项

  • 数据点超过几千个时,alpha 要调到0.3以下,否则重叠区域会完全变黑。
  • cmap 可选 viridisplasmacoolwarm 等,不要用默认的 jet 配色,色阶不均匀容易误导。
  • 散点图只展示相关性,不代表因果关系,写报告时措辞要注意。

Python matplotlib画散点图:分析两组数据相关性

标签:

更新时间:2026-09-14 20:29:47

上一篇:Python matplotlib多子图subplot:一张图放多个子图

下一篇:Python matplotlib保存高清图片:dpi与矢量图设置