matplotlib之Pyplot模块绘制三维散点图使用颜色表示数值大小

巷口听风
巷口听风
发布时间:2026-10-16| 8人浏览过
原创

本文介绍如何利用Python的matplotlib库绘制三维散点图,并通过颜色映射(Colormap)直观展示三元函数f(x,y,z)=v的数据分布。文章详细讲解了如何配置颜色等级、自定义侧边Colorbar的数值范围及显示格式,并提供了完整的代码实现与关键参数解析,帮助开发者实现更精细的数据可视化效果。

一、摘要

在数据可视化场景中,一元函数f(x)=y通常采用二维平面图表展示,其中x轴代表自变量,y轴代表函数值。对于二元函数f(x,y)=z,我们可以借助三维图形进行可视化,x轴和y轴分别表示两个自变量,z轴表示函数值。然而,受限于显示设备的物理特性,三元函数f(x,y,z)=v无法单纯通过增加第四个坐标轴来直观呈现。一种有效的解决方案是:利用x、y、z三个坐标轴表示自变量,而将数据点的颜色作为第四个维度,用以表示函数值的大小。

如下图所示:

基于上述思路,本文实现了一个三维散点图示例,其中数据点的颜色深浅或色调对应数值的大小,并额外添加了支持自定义数值范围的侧边Colorbar,以增强数据的可读性。

文章的第二部分将展示实现该效果的核心代码及必要注释;第三部分对关键代码逻辑进行详细拆解说明;第四部分列出了相关的参考资源链接。

二、代码

import matplotlib.colors 
import matplotlib.ticker
import matplotlib.pyplot as plt
import random
# 1.0 初始化数据
# f(x,y,z) = v
# 其中x,y,z为随机数,v=x*y*z
x = [random.randint(0,100) for i in range(0,100)]
y = [random.randint(0,100) for i in range(0,100)]
z = [random.randint(0,100) for i in range(0,100)]
v = [x[i]*y[i]*z[i] for i in range(0,100)]
# 1.1 根据各个点的值(v[]),设置点的颜色值,每个点的颜色使用一个rgb三维的元组表示,例如,若想让点显示为红色,则颜色值为(1.0,0,0)
# 设置各个点的颜色
# 每个点的颜色值按照colormap("seismic",100)进行设计,其中colormap类型为"seismic",共分为100个级别(level)
min_v = min(v)
max_v = max(v)
color = [plt.get_cmap("seismic", 100)(int(float(i-min_v)/(max_v-min_v)*100)) for i in v]

# 2.0 显示三维散点图
# 新建一个figure()
fig = plt.figure()
# 在figure()中增加一个subplot,并且返回axes
ax = fig.add_subplot(111,projection='3d')
# 设置colormap,与上面提到的类似,使用"seismic"类型的colormap,共100个级别
plt.set_cmap(plt.get_cmap("seismic", 100))
# 绘制三维散点,各个点颜色使用color列表中的值,形状为"."
im = ax.scatter(x, y, z, s=100,c=color,marker='.')
# 2.1 增加侧边colorbar
# 设置侧边colorbar,colorbar上显示的值使用lambda方程设置
fig.colorbar(im, format=matplotlib.ticker.FuncFormatter(lambda x,pos:int(x*(max_v-min_v)+min_v)))
# 2.2 增加坐标轴标签
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z')
# 2.3显示
plt.show()

运行结果如下:

三、部分代码解释

1. colormap(颜色)映射设置。

如上图所示,为了通过颜色准确反映各个数据点的数值,必须建立合理的值-颜色映射关系。本文代码中使用了"seismic"类型的colormap,并将其划分为100个等级(level)。相关代码如下:

color = [plt.get_cmap("seismic", 100)(int(float(i-min_v)/(max_v-min_v)*100)) for i in v]

在代码执行过程中,plt.get_cmap("seismic",100)会返回一个colormap对象实例。随后,通过调用plt.get_cmap("seismic",100)(x)并传入具体的x数值,即可获取对应等级下的颜色代码值。例如:

a = plt.get_cmap("seismic",100)(0)
b = plt.get_cmap("seismic",100)(100)
print("a:", a)
print("b:", b)

输出结果为:

a: (0.0, 0.0, 0.3, 1.0) b: (0.5, 0.0, 0.0, 1.0)

上述输出表明,级别0对应的(r,g,b,alpha)颜色值为(0.0, 0.0, 0.3, 1.0),而级别100对应的颜色值为(0.5, 0.0, 0.0, 1.0)。

若需使用其他类型的colormap以获得不同的视觉效果,只需指定相应的colormap名称即可。更多详细信息可参考文章:python matplotlib自定义colorbar颜色条-以及matplotlib中的内置色条。

2. 设置三维散点格式

首先通过设置绘图格式:

ax = fig.add_subplot(111,projection='3d')

接着使用scatter()函数来绘制三维散点图:

im = ax.scatter(x, y, z, s=100,c=color,marker='.')

其中,s=100用于设定数据点的大小,c=color用于指定点的颜色,而marker='.'则用于定义点的形状(本例中为实心圆点)。

3. 设置侧边colorbar

根据数据的实际分布格式,我们需要对侧边colorbar显示的数值范围进行设定。例如,在本例中,数据的最小值为825,最大值为784179。代码中使用了lambda表达式来计算最终显示的值。由于默认情况下colorbar显示的数值范围是[0,1],因此需要利用lambda公式将显示值映射到[825,784179]区间内。具体代码如下:

fig.colorbar(im, format=matplotlib.ticker.FuncFormatter(lambda x,pos:int(x*(max_v-min_v)+min_v)))

此外,为了确保散点图中点的颜色与colorbar上的颜色条保持一致,必须执行以下操作:

plt.set_cmap(plt.get_cmap("seismic", 100))

这使得clormap和colorbar拥有相同的类型定义,从而保证颜色映射的一致性。

四、参考

[1]. MATLAB scatter 画二维/三维散点图时 用颜色表示数值大小 colorbar

[2]. 三维散点图加colorbar

[3]. 【python图像处理】彩色映射

[4]. matplotlib的colorbar自定义刻度范围

[5]. Python中lambda的使用

总结

到此这篇关于matplotlib之Pyplot模块绘制三维散点图使用颜色表示数值大小的文章就介绍到这了,更多相关Pyplot绘制三维散点图内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。