我有一个使用 matplotlib 创建的 3D 图,我有一个对应于每个点的 rbg 值列表。
我有 X、Y 和 Z 数据,然后我有一个形式的“颜色列表”:
[ (r,g,b), (r,g,b), ... , (r,g,b) ]
匹配每个(x,y,z)点。
现在,我有
fig = plt.figure()
ax = fig.add_subplot(111, projection = '3d')
ax.scatter(X, Y, Z)
plt.show()
合并这些 rgb 元组以便为每个点分配特定颜色的适当方法是什么?
如果你不想使用 for 循环(对于大列表来说这可能会很慢)你可以像使用 RGB 颜色列表一样使用 scatter 命令,但是你需要将颜色指定为 RGB 的向量(或RGBA) 值介于 0 和 1
之间X = [0, 1, 2]
Y = [0, 1, 2]
Z = [0, 1, 2]
C = np.array([[255, 0, 0], [0, 255, 0], [0, 0, 255]])
fig = plt.figure()
ax = fig.add_subplot(111, projection = '3d')
ax.scatter(X, Y, Z, c = C/255.0)
plt.show()
这是一个示例,其中颜色是计算出来的,而不是由文字列表指定的。
import numpy as np
from matplotlib.pyplot import subplots
phi = np.linspace(0, 2*np.pi, 60)
x = np.sin(phi)
y = np.cos(phi)
rgb_cycle = (np.stack((np.cos(phi ), # Three sinusoids,
np.cos(phi+2*np.pi/3), # 120° phase shifted,
np.cos(phi-2*np.pi/3)
)).T # Shape = (60,3)
+ 1)*0.5 # scaled to [0,1].
fig, ax = subplots(figsize=(3,3))
ax.scatter(x,y, c=rgb_cycle, s=90)
fig.show()
我使用
for
循环将每种颜色分别分配给每个点。这是我的代码:
X = [1, 2, 3]
Y = [2, 5, 8]
Z = [6, 4, 5]
colors=["#0000FF", "#00FF00", "#FF0066"]
fig = plt.figure()
ax = fig.add_subplot(111, projection = '3d')
for i in range(len(X)):
ax.scatter(X[i], Y[i], Z[i], color=colors[i])
plt.show()
for
循环逐点进行(因此在每个 X、Y、Z 值前面都有 [i]
)并逐一给出颜色。我在示例中使用了十六进制颜色,但如果您愿意,您也可以使用其他颜色。