如何根据给定的 x、y 和 z 坐标框架绘制第四个变量
How to plot the fourth variable based on a given x, y and z coordinate framework
我有一个四列多行的 numpy 数组。第一列是我的变量,另外三个是 x
、y
和 z
坐标,分别是:
arr= np.array([[2., 0., 0., 0.],
[1., 0., 0., 1.],
[2., 0., 1., 0.],
[3., 1., 0., 0.]])
第一列有一些离散值,例如它是 1
或 2
或 3
。现在,使用 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()
我有一个四列多行的 numpy 数组。第一列是我的变量,另外三个是 x
、y
和 z
坐标,分别是:
arr= np.array([[2., 0., 0., 0.],
[1., 0., 0., 1.],
[2., 0., 1., 0.],
[3., 1., 0., 0.]])
第一列有一些离散值,例如它是 1
或 2
或 3
。现在,使用 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()