查看全课大纲(第 83 / 101 节)
- 1.数据分析基本概念
- 2.学习数据分析的一般路线
- 3.数据分析的流程
- 4.数据类型
- 5.环境部署(1)
- 6.环境部署(2)
- 7.课程介绍
- 8.TXT文件操作
- 9.JSON文件操作
- 10.CSV文件操作
- 11.Excel文件操作
- 12.数据库及SQL常用语法
- 13.数据库基本操作
- 14.数据库多表连接
- 15.实战:欧洲职业足球数据库分析
- 16.爬虫简介
- 17.URL管理模块
- 18.网页下载模块
- 19.网页解析模块(1)
- 20.网页解析模块(2)
- 21.Scrapy简介
- 22.Scrapy使用步骤(1)
- 23.Scrapy使用步骤(2)
- 24.Scrapy使用步骤(3)
- 25.Scrapy使用步骤(4)
- 26.实战:获取国内城市空气质量指数数据
- 27.NumPy和SciPy介绍
- 28.多维数组
- 29.多维数组操作
- 30.NumPy的常用方法
- 31.向量化介绍
- 32.向量化及通用函数
- 33.实战:2016美国大选分析
- 34.数据结构-Series
- 35.数据结构-DataFrame
- 36.数据结构-Index
- 37.Series的索引操作
- 38.DataFrame的索引操作
- 39.索引操作总结
- 40.运算与对齐
- 41.函数应用操作(1) -- map
- 42.函数应用操作 (2) -- apply applymap
- 43.文件读写操作
- 44.排序操作
- 45.数据清洗--处理缺失数据
- 46.数据清洗--处理重复数据
- 47.数据清洗--替换数据
- 48.常用统计方法(1) -- describe quantile
- 49.常用统计方法(2) -- sum mean median count
- 50.常用统计方法(3) -- max min idxmax idxmin
- 51.常用统计方法(4) -- mad var std cumsum
- 52.实战:全球食品数据分析
- 53.层级索引
- 54.分组与聚合介绍
- 55.分组操作(1) -- GroupBy对象及常用聚合操作
- 56.分组操作(2) -- 自定义分组及聚合操作
- 57.透视表介绍
- 58.透视表操作
- 59.数据规整(1) -- 数据合并concat
- 60.数据规整(2) -- 数据连接merge
- 61.数据重构(3) -- 数据重构stack unstack
- 62.实战:互联网电影资料库分析
- 63.探索性数据分析EDA介绍
- 64.EDA的目的
- 65.EDA常用工具
- 66.Matplotlib绘图基本介绍
- 67.Matplotlib画布
- 68.散点图和柱状图的绘制
- 69.直方图的绘制
- 70.矩阵绘图
- 71.子图的使用
- 72.Matplotlib颜色、标记、线型
- 73.Matplotlib坐标刻度、标签、图例、标题
- 74.Seaborn介绍
- 75.数据集分布可视化(1) -- 单变量分布、双变量分布
- 76.数据集分布可视化(2) -- 变量关系可视化
- 77.类别数据可视化 -- 类别散布图、类别内数据分布、类别内统计图
- 78.交互式数据可视化工具Bokeh介绍
- 79.Bokeh绘制散点图、柱状图、盒子图、弦图
- 80.Bokeh绘制常用图形元素
- 81.3D绘图 -- mplot3d
- 82.3D曲线可视化
- 83.3D散点图可视化
- 84.3D柱状图可视化
- 85.Pandas绘图
- 86.实战:Lending Club借贷数据探索性分析及可视化
- 87.机器学习介绍及应用场景
- 88.机器学习建模介绍 (1) -- 分类
- 89.机器学习建模介绍 (2) -- 回归
- 90.机器学习建模介绍 (3) -- 聚类
- 91.机器学习分类
- 92.机器学习工具scikit-learn
- 93.使用scikit-learn的流程
- 94.数据集准备及划分
- 95.模型选择
- 96.数据预处理及特征工程
- 97.过拟合与欠拟合
- 98.模型调参介绍
- 99.模型调参方法
- 100.模型测试及评价
- 101.实战:通过移动设备行为数据预测性别和年龄
3D散点图可视化
约 3 分钟
小象实战讲义 · Python数据分析实战
在探索多维数据时,我们常常需要观察三个变量之间的关系。二维散点图只能展示两个维度,当数据具有三个关键特征时,3D散点图就成为了一种强大的可视化工具。本节我们将学习如何使用Matplotlib的3D工具包绘制3D散点图,并掌握在同一坐标系中展示多组数据的方法。
💡 核心导读
- 3D散点图的核心方法:掌握
Axes3D.scatter()函数的基本调用方式与参数含义。 - 关键参数详解:学习如何通过
s、c、marker等参数控制数据点的外观。 - 多组数据绘制:理解在同一3D坐标系中叠加绘制多组数据点的实现逻辑。
- 数据与坐标轴映射:了解
zdir参数如何控制数据维度与空间坐标轴的对应关系。
1. 绘制基础3D散点图
Matplotlib的 mpl_toolkits.mplot3d 模块提供了3D绘图能力。绘制3D散点图的核心是创建一个3D坐标轴对象,然后调用其 scatter 方法。
Axes3D.scatter(xs, ys, zs, zdir='z', s=20, c=None, marker='o', ...) 方法的主要参数如下:
- xs, ys, zs:数据点的三维坐标,可以是等长的数组或列表。
- zdir:指定哪个数据维度作为“高度”方向(即图形中的Z轴)。默认为
'z',表示第三个参数zs的值将沿着Z轴方向绘制。也可以设置为'x'或'y',从而改变数据维度与空间坐标轴的映射关系。 - s:标量或数组,控制数据点的大小。
- c:点的颜色,可以是单一颜色字符串(如
'r'红色、'g'绿色),也可以是数值序列,通过颜色映射(colormap)映射为颜色。 - marker:点的标记形状,如
'o'(圆圈)、'^'(三角形)、's'(方形)等。
下面我们通过一个简单的例子来演示基础绘制流程。
import matplotlib
matplotlib.use('Agg') # 使用无界面后端,确保代码在任何环境可运行
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
# 构造一组简单的三维数据(硬编码,保证输出确定性)
xs = [0.1, 0.5, 0.9, 0.2, 0.7]
ys = [0.8, 0.3, 0.6, 0.1, 0.4]
zs = [0.5, 0.9, 0.2, 0.7, 0.3]
# 创建图形和3D坐标轴
fig = plt.figure(figsize=(8, 6))
ax = fig.add_subplot(111, projection='3d')
# 绘制3D散点图
scatter_plot = ax.scatter(xs, ys, zs, s=50, c='blue', marker='o')
# 设置坐标轴标签
ax.set_xlabel('X Axis')
ax.set_ylabel('Y Axis')
ax.set_zlabel('Z Axis')
ax.set_title('Basic 3D Scatter Plot')
# 在讲义中,我们通常不实际保存文件,此处仅示意
# plt.savefig('basic_3d_scatter.png')
plt.close(fig) # 关闭图形,释放内存
# 打印数据点信息以供验证
print("数据点坐标 (X, Y, Z):")
for i in range(len(xs)):
print(f" 点{i+1}: ({xs[i]:.1f}, {ys[i]:.1f}, {zs[i]:.1f})")
print(f"总共绘制了 {len(xs)} 个数据点。")数据点坐标 (X, Y, Z):
点1: (0.1, 0.8, 0.5)
点2: (0.5, 0.3, 0.9)
点3: (0.9, 0.6, 0.2)
点4: (0.2, 0.1, 0.7)
点5: (0.7, 0.4, 0.3)
总共绘制了 5 个数据点。2. 控制点的外观与zdir参数
通过调整 s、c、marker 参数,我们可以轻松区分不同类别或属性的数据点。zdir 参数则允许我们灵活定义哪个数据维度代表空间中的“高度”。
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
# 准备数据:假设我们有三组空间坐标,但想用不同的映射方式展示
# 第一组:标准映射 (zdir='z')
x1 = [1.0, 2.0, 3.0]
y1 = [1.0, 2.0, 3.0]
z1 = [1.0, 2.5, 3.0] # 这个列表的值将作为“高度”
# 第二组:改变映射,让第二个数据维度作为高度 (zdir='y')
x2 = [1.0, 2.0, 3.0]
y2 = [1.0, 2.5, 3.0] # 这个列表的值将作为“高度”
z2 = [1.0, 2.0, 3.0]
# 创建图形和3D坐标轴
fig = plt.figure(figsize=(10, 8))
ax = fig.add_subplot(111, projection='3d')
# 绘制第一组数据:标准映射,红色圆圈
ax.scatter(x1, y1, z1, zdir='z', s=100, c='red', marker='o', label="zdir='z' (标准)")
# 绘制第二组数据:y方向为高度,绿色三角形
ax.scatter(x2, z2, y2, zdir='y', s=150, c='green', marker='^', label="zdir='y'")
ax.set_xlabel('X Axis')
ax.set_ylabel('Y Axis')
ax.set_zlabel('Z Axis')
ax.set_title('3D Scatter with Different zdir')
ax.legend()
plt.close(fig)
# 解释映射关系
print("第一组数据 (红色圆圈):")
print(" 调用方式: ax.scatter(x1, y1, z1, zdir='z', ...)")
print(" 含义: 数据 (x1, y1, z1) 直接对应空间坐标 (X, Y, Z)。")
print()
print("第二组数据 (绿色三角形):")
print(" 调用方式: ax.scatter(x2, z2, y2, zdir='y', ...)")
print(" 含义: 参数顺序为 (xs, ys, zs),但设置 zdir='y'。")
print(" 因此,xs=x2 映射到X轴,ys=z2 映射到Z轴,zs=y2 映射到Y轴(高度)。")第一组数据 (红色圆圈):
调用方式: ax.scatter(x1, y1, z1, zdir='z', ...)
含义: 数据 (x1, y1, z1) 直接对应空间坐标 (X, Y, Z)。
第二组数据 (绿色三角形):
调用方式: ax.scatter(x2, z2, y2, zdir='y', ...)
含义: 参数顺序为 (xs, ys, zs),但设置 zdir='y'。
因此,xs=x2 映射到X轴,ys=z2 映射到Z轴,zs=y2 映射到Y轴(高度)。3. 在同一坐标系绘制多组数据
在实际分析中,我们经常需要比较不同类别或条件下的数据分布。在3D散点图中,只需在同一个 Axes3D 对象上多次调用 scatter 方法,即可叠加绘制多组数据。
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
# 准备三组不同的数据(硬编码)
# 第一组数据:A类产品
x_a = [0.2, 0.4, 0.6, 0.8]
y_a = [0.8, 0.6, 0.4, 0.2]
z_a = [1.0, 1.2, 1.4, 1.6]
# 第二组数据:B类产品
x_b = [0.3, 0.5, 0.7, 0.9]
y_b = [0.1, 0.3, 0.5, 0.7]
z_b = [1.1, 1.3, 1.5, 1.7]
# 第三组数据:C类产品
x_c = [0.1, 0.5, 0.9]
y_c = [0.9, 0.5, 0.1]
z_c = [0.9, 1.1, 1.3]
# 创建3D图像对象
fig = plt.figure(figsize=(10, 8))
ax = fig.add_subplot(111, projection='3d')
# 绘制三组数据,用不同颜色、大小和标记区分
ax.scatter(x_a, y_a, z_a, s=50, c='red', marker='o', label='Category A')
ax.scatter(x_b, y_b, z_b, s=100, c='blue', marker='^', label='Category B')
ax.scatter(x_c, y_c, z_c, s=150, c='green', marker='s', label='Category C')
# 添加图例和标签
ax.set_xlabel('Feature X')
ax.set_ylabel('Feature Y')
ax.set_zlabel('Feature Z')
ax.set_title('Multiple Groups in 3D Scatter Plot')
ax.legend()
plt.close(fig)
# 输出各组数据点数
print("各组数据统计:")
print(f" Category A: {len(x_a)} 个点")
print(f" Category B: {len(x_b)} 个点")
print(f" Category C: {len(x_c)} 个点")
print(f" 总计: {len(x_a)+len(x_b)+len(x_c)} 个点")各组数据统计:
Category A: 4 个点
Category B: 4 个点
Category C: 3 个点
总计: 11 个点📝 动手练一练
- 概念辨析:在
ax.scatter(x_data, y_data, z_data, zdir='x')这个调用中,三个数据参数x_data,y_data,z_data最终分别被绘制在3D空间的哪个坐标轴上(X, Y, Z)?请描述其映射关系。
👉 点击查看参考答案
当 zdir='x' 时,参数的映射关系如下:
- 第一个参数
x_data的值将沿着 Y轴 方向绘制。 - 第二个参数
y_data的值将沿着 Z轴 方向绘制。 - 第三个参数
z_data的值将沿着 X轴 方向绘制(作为“高度”)。 因此,调用ax.scatter(x_data, y_data, z_data, zdir='x')相当于在空间中绘制坐标为(z_data, x_data, y_data)的点。
- 动手实践:参考本节第三个代码示例,请尝试添加第四组数据(D类产品),包含2个点,坐标自定。并使用黄色(
'yellow')、菱形('D')标记、大小为80来绘制这组数据。修改代码并运行,验证第四组数据是否成功添加。
👉 点击查看参考答案
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
# 原有三组数据(略)...
x_a = [0.2, 0.4, 0.6, 0.8]
y_a = [0.8, 0.6, 0.4, 0.2]
z_a = [1.0, 1.2, 1.4, 1.6]
x_b = [0.3, 0.5, 0.7, 0.9]
y_b = [0.1, 0.3, 0.5, 0.7]
z_b = [1.1, 1.3, 1.5, 1.7]
x_c = [0.1, 0.5, 0.9]
y_c = [0.9, 0.5, 0.1]
z_c = [0.9, 1.1, 1.3]
# 新增第四组数据
x_d = [0.15, 0.85]
y_d = [0.85, 0.15]
z_d = [0.8, 1.8]
fig = plt.figure(figsize=(10, 8))
ax = fig.add_subplot(111, projection='3d')
ax.scatter(x_a, y_a, z_a, s=50, c='red', marker='o', label='Category A')
ax.scatter(x_b, y_b, z_b, s=100, c='blue', marker='^', label='Category B')
ax.scatter(x_c, y_c, z_c, s=150, c='green', marker='s', label='Category C')
# 添加第四组数据的绘制调用
ax.scatter(x_d, y_d, z_d, s=80, c='yellow', marker='D', label='Category D')
ax.set_xlabel('Feature X')
ax.set_ylabel('Feature Y')
ax.set_zlabel('Feature Z')
ax.set_title('Multiple Groups in 3D Scatter Plot (with Group D)')
ax.legend()
plt.close(fig)
print(f"新增 Category D 点数为: {len(x_d)}")新增 Category D 点数为: 2运行后应输出 新增 Category D 点数为: 2,并且代码不会报错,说明添加成功。
本章小结
本节我们深入学习了3D散点图的绘制方法。作为探索三维数据关系的基础工具,3D散点图通过将数据点投射到三维空间,让我们能够直观地观察聚类、趋势和异常。关键在于掌握 Axes3D.scatter() 方法的参数使用,特别是如何通过 s、c、marker 区分数据属性,以及如何利用 zdir 灵活定义数据维度与空间轴的映射。通过在同一坐标系中多次调用 scatter,我们可以轻松实现多组数据的对比可视化。
📋 行动清单
- 尝试使用本节代码,将你自己的三列数据(例如:产品的长度、宽度、重量)绘制成3D散点图。
- 修改
s参数为一个与数据值相关的数组(如s=np.asarray(z_data)*100,观察点的大小如何随数据变化。注意:若z_data是 Python 列表,z_data*100是把列表重复100遍而非逐元素放大,长度会与坐标数组不匹配而报错——所以先转成 NumPy 数组再乘)。 - 查阅Matplotlib官方文档,了解
Axes3D.scatter的其他参数(如depthshade,alpha透明度),并尝试应用到你的图中。
—— 小象教研组
配套资料 · 直接下载
课件、代码、数据集等配套资料全部免费,点击即可直接下载,无需分享或解锁。
- 下载本节课件:3D散点图可视化PDF · 170KB
- 下载全套课件打包(第1-5章)ZIP · 12.8MB
- 下载全套课件打包(第6-8章)ZIP · 15MB
- 下载实战数据集:AppleStore 应用商城分析ZIP · 329KB
- 下载实战数据集:女性服装电商分析ZIP · 2.8MB
- 下载Python 数据分析环境搭建指南PDF · 2MB
- 下载Scrapy 安装教程PDF · 12.7MB
- 下载附加实战项目:AppleStore 应用商城数据分析ZIP · 0.3MB · ipynb + CSV 数据
- 下载附加实战项目:银行电话营销数据分析ZIP · 0.4MB · ipynb + CSV 数据
- 下载附加实战项目:女性服装电商评论数据分析ZIP · 2.7MB · ipynb + CSV 数据
- 下载附加实战项目:美国化学学会杂志数据分析ZIP · 34.2MB · ipynb + SQLite 数据库