繁体   English   中英

Numpy ND 矩阵到 3D 网格图

[英]Numpy N-D Matrix to a 3D Mesh Graph

我试着查了很多,有很多关于具体例子的信息,但它们太具体而无法理解。

如何将 Numpy ND 矩阵中的数据放入 3D 图。 请参考以下示例

 import numpy as np
 X =20

 Y =  20
 Z = 2
 sample = np.zeros(((X,Y,Z)))
 sample[1][2][2]=45
 sample[1][3][0]=52
 sample[1][8][1]=42
 sample[1][15][1]=30
 sample[1][19][2]=15

我想在 X、Y、Z 位置上使用值以显示在 3D 图形(绘图)上。

提前致谢

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

 # Define size of data
 P= 25
 X = 70
 Y = 25
 Z = 3

 # Create meshgrid
 x,y = np.meshgrid(np.arange(X),np.arange(Y))

 # Create some random data (your example didn't work)
 sample = np.random.randn((((P,X,Y,Z))))

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

 # Define colors
 colors=['b','r','g']

 # Plot for each entry of in Z
 for i in range(Z):
    ax.plot_wireframe(x, y, sample[:,:,:,i],color=colors[i])
    plt.draw()
 plt.show()

但我只想画 X,Y,Z。 当我使用上面的代码时,python 抛出了很多错误,比如 ValueError: too many values to unpack

你在寻找这样的东西吗?

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

# Define size of data
X = 20
Y = 20
Z = 3

# Create meshgrid
x,y = np.meshgrid(np.arange(X),np.arange(Y))

# Create some random data (your example didn't work)
sample = np.random.randn(X,Y,Z)

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

# Define colors
colors=['b','r','g']

# Plot for each entry of in Z
for i in range(Z):
    ax.plot_wireframe(x, y, sample[:,:,i],color=colors[i])
    plt.draw()
plt.show()

你会给哪个

3D 线框图

matplotlib中还有很多其他方法可以显示 3D 数据,另请参见此处 但是,您总是被限制为 3 个维度(或者 4 个,如果您使用颜色编码第 4 个维度的 3D 散点图)。 因此,您需要决定要显示哪些维度,或者是否可以以某种方式对其进行总结。

我有一些可能对你有用的东西。 为了理解它,我简要解释了我要去的过程。 我将 4x4x4 = 64 个点质量相互连接,并创建了一个带有阻尼器、弹簧和内部摩擦的立方体。 我使用 numpy 解决了运动学和机械行为,然后我需要可视化立方体,我所拥有的只是每个质量的每个时间步长的 X、Y、Z 点。

我所拥有的是每个时间 tn 的 4x4x4 XYZ 点:

这是怎么回事:

import matplotlib.pyplot as plt 

zeroPoint=points[50] # at time step 50 elastic cube in space 
surf0x=zeroPoint[0,:,:,0]
surf0y=zeroPoint[0,:,:,1]
surf0z=zeroPoint[0,:,:,2]

surf1x=zeroPoint[:,0,:,0]
surf1y=zeroPoint[:,0,:,1]
surf1z=zeroPoint[:,0,:,2]

surf2x=zeroPoint[:,:,0,0]
surf2y=zeroPoint[:,:,0,1]
surf2z=zeroPoint[:,:,0,2]

surf3x=zeroPoint[nmx-1,:,:,0]
surf3y=zeroPoint[nmx-1,:,:,1]
surf3z=zeroPoint[nmx-1,:,:,2]

surf4x=zeroPoint[:,nmy-1,:,0]
surf4y=zeroPoint[:,nmy-1,:,1]
surf4z=zeroPoint[:,nmy-1,:,2]

surf5x=zeroPoint[:,:,nmz-1,0]
surf5y=zeroPoint[:,:,nmz-1,1]
surf5z=zeroPoint[:,:,nmz-1,2]

fig = plt.figure(figsize=(10,10))
wf = plt.axes(projection ='3d')
wf.set_xlim(-0.5,2)
wf.set_ylim(-0.5,2)
wf.set_zlim(-0.5,2)
wf.plot_wireframe(surf0x, surf0y, surf0z, color ='green')
wf.plot_wireframe(surf1x, surf1y, surf1z, color ='red')
wf.plot_wireframe(surf2x, surf2y, surf2z, color ='blue')
wf.plot_wireframe(surf3x, surf3y, surf3z, color ='black')
wf.plot_wireframe(surf4x, surf4y, surf4z, color ='purple')
wf.plot_wireframe(surf5x, surf5y, surf5z, color ='orange')
 
 
# displaying the visualization
wf.set_title('Its a Cube :) ')
pyplot.show()

在此处输入图像描述

在时间步 190 相同的立方体(动画为 60 FPS):

在此处输入图像描述

诀窍是如您所见,您需要在出发前从点创建曲面。 你甚至不需要 np.meshgrid 来做到这一点。 人们这样做是为了计算参数 z 值。 如果您拥有所有积分,则不需要它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM