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可选viridis、plasma、coolwarm等,不要用默认的jet配色,色阶不均匀容易误导。- 散点图只展示相关性,不代表因果关系,写报告时措辞要注意。

更新时间:2026-09-14 20:29:47
上一篇:Python matplotlib多子图subplot:一张图放多个子图