我已经问过类似的问题here并且几乎自己找到了答案。 唯一剩下的就是以下内容: 我正在使用
meshgrid
创建 3D 网格。在 color_map.set_array(colo)
中指定颜色时,我使用的数组与 meshgrid
中的元素大小相同。但是这个数组必须如何排序才能产生正确的绘图?
x=[7, 8, 9, 10, 11, 12]
y= [0.4, 0.5, 0.6, 0.7, 0.8, 0.9]
z= [0.1, 0.2, 0.3, 0.4, 0.5, 0.6]
colo=np.random.normal(0, 1, 216)
X,Y,Z = np.meshgrid(x,y,z)
fig = plt.figure(figsize=(10, 10))
ax = fig.add_subplot(111, projection='3d')
color_map = cm.ScalarMappable(cmap=cm.Greens_r)
color_map.set_array(colo)
img = ax.scatter(X, Y, Z, marker='s',
s=200, color='green')
plt.colorbar(color_map)
假设
y
、x
和 z
的长度分别为 6、5 和 4。 X
中的每个网格(Y
、Z
和 np.meshgrid(x, y, z)
)的大小将为6x5x4。这意味着您的数据需要采用 (y, x, z)
格式构建。否则,数据将不会与网格的排列对齐。您不需要展平数据。
如果数据不是
(y, x, z)
的格式,请将其重新排列为该格式。然后,您可以将其交给ax.scatter
,如下所示:
import matplotlib.pyplot as plt
from matplotlib import cm
import numpy as np
#Make some test data
y = [0.4, 0.5, 0.6, 0.7, 0.8, 0.9]
x = [7, 8, 9, 10, 11]
z = [0.1, 0.2, 0.3, 0.4]
#Original data needs to be structured as (y, x, z)
original_data = np.random.normal(0, 1, 120).reshape((6, 5, 4))
X, Y, Z = np.meshgrid(x, y ,z)
ax = plt.figure(figsize=(10, 10)).add_subplot(111, projection='3d')
img = ax.scatter(X, Y, Z, marker='s', s=200, c=original_data, cmap=cm.Greens_r)
ax.set(xlabel='x', ylabel='y', zlabel='z')
plt.colorbar(img)