使用颜色作为第四变量的3D散点图

0 投票
1 回答
23 浏览
提问于 2025-04-12 06:52

我想在三维空间中散布一个数据集,并且希望每个点的颜色能用一个标量变量来表示,这样可以更好地可视化一些现象。为了简单起见,假设我希望每个绘制的点都有一个颜色,这个颜色以某种方式代表另一个三维数组(比如密度、温度、能量等)。

我该怎么做呢?我想要的效果大概是这样的:

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

#some dummy data
x = np.linspace(-1,1,3, endpoint = True )
y  = np.linspace(-1,1,3, endpoint = True )
z = np.linspace(-1,1,3, endpoint = True )
X,Y,Z = np.meshgrid(x,y,z,indexing = 'ij')
E = X**2+Y**2+Z**2
fig = plt.figure()
ax = fig.add_subplot(111,projection = '3d')
ax.scatter(X,Y,Z, color = VV)
plt.show()

这里的VV是一个数组,它以某种方式与E成比例,并且根据E[x,y,z]给每个(x,y,z)点分配一个颜色。最后,我还想加一个颜色条,这样可以帮助读取大致的颜色值。我在论坛上搜索过,但找到的答案都不适用于三维数据集,现在我遇到瓶颈了。

1 个回答

0

如果我理解没错的话,你只需要在调用 scatter 的时候把 c=E 加上,Matplotlib 就会自动把它调整到合适的颜色范围。scatter 会返回一个叫 PathCollection 的东西,这种东西可以用来做映射,所以可以传给 colorbar

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

#some dummy data
x = np.linspace(-1,1,3, endpoint = True )
y  = np.linspace(-1,1,3, endpoint = True )
z = np.linspace(-1,1,3, endpoint = True )
X,Y,Z = np.meshgrid(x,y,z,indexing = 'ij')
E = X**2+Y**2+Z**2

fig = plt.figure()
ax = fig.add_subplot(111, projection = '3d')
pc = ax.scatter(X, Y, Z, c=E)
fig.colorbar(pc)
plt.show()

在这里输入图片描述

撰写回答