如何根据给定的 x、y 和 z 坐标框架绘制第四个变量

How to plot the fourth variable based on a given x, y and z coordinate framework

我有一个四列多行的 numpy 数组。第一列是我的变量,另外三个是 xyz 坐标,分别是:

arr= np.array([[2., 0., 0., 0.],
               [1., 0., 0., 1.],
               [2., 0., 1., 0.],
               [3., 1., 0., 0.]])

第一列有一些离散值,例如它是 123。现在,使用 matplotlib 或任何其他有用的库,如 seaborn)我想在由第二、第三和第四列创建的 3d space 中绘制这些值。例如,我想将 1 表示为红星符号,将 2 表示为黄色矩形,将 3 表示为黑色方块。如果有人帮助我这样做,我将不胜感激。我尝试了以下代码,但它没有给我想要的东西:

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
x= arr[0][:,1]
y= arr[0][:,2]
X, Y = np.meshgrid(x, y)
z= arr[0][:,3]
V= arr[0][:,0]
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.view_init(45,60)
ax.plot_surface(X, Y, z, facecolors=cm.Oranges(V))

我想要下图的自动版:

散点图会导致您的预期输出,并且可以轻松地进行个性化设置。此示例代码甚至应该适用于超过 3 种情况(只要您添加标记样式和颜色)

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm

arr= np.array([[2., 0., 0., 0.],
               [1., 0., 0., 1.],
               [2., 0., 1., 0.],
               [3., 1., 0., 0.]])


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

arr_T = arr.T

#get unique values --> makes it possible to work with more cases, may not be necessary
unique = list(set(arr_T[0]))
marker_styles = {1:"*", 2:"s", 3:"o"}
marker_colors = {1:"r", 2:"y", 3:"black"}
for i in range(len(unique)):
    value = unique[i]
    xs = arr[arr_T[0] == value].T[1]
    ys = arr[arr_T[0] == value].T[2]
    zs = arr[arr_T[0] == value].T[3]
    ax.scatter(xs, ys, zs, marker=marker_styles[unique[i]], color = marker_colors[unique[i]], alpha=1)

ax.set_xlabel('X Label')
ax.set_ylabel('Y Label')
ax.set_zlabel('Z Label')

ax.view_init(45,60)
plt.show()