Matplotlib 散点图(保姆级教程)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2900+ 小伙伴加入学习 ,欢迎点击围观

前言

在数据可视化领域,Matplotlib 散点图是探索数据关系的重要工具。它通过二维坐标系中的点阵分布,直观展示变量间的相关性、聚类特征或异常值。无论是分析销售数据中的价格与销量关系,还是研究生物学样本的形态差异,散点图都能帮助我们快速捕捉数据背后的模式。本文将从基础语法到高级技巧,结合实际案例,系统讲解如何用 Matplotlib 绘制和优化散点图,适合编程初学者和中级开发者快速掌握这一技能。


基础语法:从零开始绘制散点图

1. 安装与环境准备

使用 Matplotlib 绘制散点图前,需确保已安装 Python 环境及 Matplotlib 库。若未安装,可通过以下命令安装:

pip install matplotlib  

2. 最简单的散点图:坐标点分布

假设我们想展示两个变量 xy 的关系,可以生成随机数据并直接调用 plt.scatter()

import matplotlib.pyplot as plt  
import numpy as np  

x = np.random.rand(50)  
y = np.random.rand(50)  

plt.scatter(x, y)  
plt.title("Basic Scatter Plot")  
plt.xlabel("X-axis")  
plt.ylabel("Y-axis")  
plt.show()  

运行代码后,会看到 50 个随机分布的点,每个点的坐标由 xy 决定。这就像在一张空白画布上,用铅笔点出数据的“指纹”,直观展示两变量的分布关系。

3. 参数详解:坐标、标签与标题

  • xy:必填参数,分别代表横纵坐标的数值序列。
  • color:设置点的颜色,默认为蓝色。可传入颜色名称(如 "red")或十六进制代码(如 #FF5733)。
  • marker:定义点的形状,默认为圆形("o")。其他选项包括 "s"(正方形)、"^"(三角形)等。
  • s:控制点的大小,默认为 20。例如 s=100 可使点更醒目。

案例演示

plt.scatter(x, y, color="green", marker="x", s=80)  
plt.title("Customized Scatter Plot")  
plt.show()  

此代码将生成绿色叉形标记的点,大小为 80,比默认值更易辨识。


进阶功能:让散点图“动起来”

1. 颜色映射:第三个维度的可视化

散点图不仅能展示两个变量,还能通过颜色映射(Color Mapping)引入第三个维度。例如,用颜色深浅表示数据点的数值大小:

z = np.random.rand(50) * 100  

plt.scatter(x, y, c=z, cmap="viridis", s=100)  
plt.colorbar(label="Value of Z")  
plt.title("Color-Mapped Scatter Plot")  
plt.show()  
  • c=z:将 z 的值映射到颜色空间。
  • cmap="viridis":选择色阶方案,viridis 是一种对色盲友好的渐变色。
  • colorbar():添加颜色条,帮助读者理解颜色与数值的对应关系。

2. 点的大小变化:用面积传递信息

通过 s 参数结合数值数组,可让点的大小反映另一个维度的信息:

size = np.random.randint(10, 200, 50)  # 生成 50 个 10-200 的随机整数  

plt.scatter(x, y, s=size, alpha=0.6, edgecolor="black")  
plt.title("Size-Varying Scatter Plot")  
plt.show()  
  • alpha=0.6:设置透明度,避免密集点重叠时遮挡。
  • edgecolor="black":为点添加黑色边框,增强视觉对比。

3. 图例与分类标签

若数据包含类别信息(如鸢尾花的品种),可通过不同颜色或形状区分:

categories = np.random.choice(["A", "B", "C"], size=50)  

for category in np.unique(categories):  
    mask = categories == category  
    plt.scatter(x[mask], y[mask], label=category, alpha=0.8)  

plt.legend()  
plt.title("Categorical Scatter Plot with Legend")  
plt.show()  

此代码通过循环遍历每个类别,分别绘制对应数据点,并添加图例(plt.legend())说明类别与颜色的关联。


案例实战:分析鸢尾花数据集

1. 数据加载与预处理

使用 pandas 加载鸢尾花数据集,观察花瓣长度与宽度的关系:

import pandas as pd  

df = pd.read_csv("iris.csv")  

x = df["petal_length"]  
y = df["petal_width"]  
species = df["species"]  

2. 绘制分类散点图

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

for species_name in species.unique():  
    subset = df[df["species"] == species_name]  
    plt.scatter(subset["petal_length"], subset["petal_width"],  
                label=species_name,  
                alpha=0.7,  
                edgecolor="w")  

plt.title("Iris Petal Dimensions by Species")  
plt.xlabel("Petal Length (cm)")  
plt.ylabel("Petal Width (cm)")  
plt.legend()  
plt.grid(True, linestyle="--", alpha=0.3)  
plt.show()  

效果解读

  • 不同颜色的点代表不同物种。
  • 萼片长度与宽度的分布呈现明显的聚类特征,验证了物种分类的合理性。
  • grid() 添加了虚线网格,辅助读取坐标值。

常见问题与优化技巧

1. 数据点重叠如何处理?

当数据密集时,点可能重叠导致细节丢失。可通过以下方法解决:

  • 调整透明度:增大 alpha 值(如 0.5)。
  • 使用 hexbin:将密集区域转换为蜂窝图:
    plt.hexbin(x, y, gridsize=20, cmap="PuBu")  
    plt.colorbar()  
    
  • 抽样或降维:对数据进行子采样(如 df.sample(50))或使用 PCA 降维。

2. 如何调整坐标轴范围?

plt.xlim()plt.ylim() 明确指定范围,或自动扩展:

plt.scatter(x, y)  
plt.xlim(0, 8)  # 设置 X 轴范围为 0-8  
plt.autoscale(enable=True, axis="y", tight=True)  # 自动调整 Y 轴  

3. 如何保存高质量图片?

plt.savefig("scatter_plot.png", dpi=300, bbox_inches="tight")  
  • dpi=300:提高分辨率,适合打印或高清展示。
  • bbox_inches="tight":自动裁剪空白边缘。

结论

Matplotlib 散点图凭借其灵活性与丰富的参数配置,成为数据分析师的必备工具。从基础的坐标点分布到多维度信息的可视化,它能帮助我们快速发现数据中的隐藏规律。通过本文的案例和代码示例,读者应能掌握从简单绘图到复杂场景的实现方法。无论是探索商业数据中的趋势,还是验证科学假设,善用散点图这一工具,将显著提升数据分析的效率与洞察力。

提示:若需深入学习,可进一步探索 seaborn 库的高级接口(如 sns.scatterplot()),或结合 numpy 进行数据预处理。实践是掌握技能的最佳路径,不妨尝试用本文代码分析自己的数据集!

最新发布