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. 最简单的散点图:坐标点分布
假设我们想展示两个变量 x
和 y
的关系,可以生成随机数据并直接调用 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 个随机分布的点,每个点的坐标由 x
和 y
决定。这就像在一张空白画布上,用铅笔点出数据的“指纹”,直观展示两变量的分布关系。
3. 参数详解:坐标、标签与标题
x
和y
:必填参数,分别代表横纵坐标的数值序列。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
进行数据预处理。实践是掌握技能的最佳路径,不妨尝试用本文代码分析自己的数据集!