gpt4 book ai didi

python - 在 python 中绘制 3D 矩阵的最佳方法

转载 作者:太空狗 更新时间:2023-10-29 22:30:21 25 4
gpt4 key购买 nike

我正在尝试可视化 3D 数据。这是一个完整的 3D 矩阵:每个 (x,y,z) 坐标都有一个值,这与表面或单个数据向量的集合不同。我尝试这样做的方法是绘制一个不透明的立方体,其中立方体的每条边显示正交维度上的数据总和。

一些示例数据——基本上是一个以 (3,5,7) 为中心的 blob:

import numpy as np
(x,y,z) = np.mgrid[0:10,0:10, 0:10]
data = np.exp(-((x-3)**2 + (y-5)**2 + (z-7)**2)**(0.5))
edge_yz = np.sum(data,axis=0)
edge_xz = np.sum(data,axis=1)
edge_xy = np.sum(data,axis=2)

所以这里的想法是生成一个显示立方体的 3D 图;立方体的每个表面都会显示相应的二维矩阵 edge_*。这就像在适当的 3D 位置绘制 3 个 4 边形多边形(或者 6 个,如果你也绘制了立方体的背面),不同之处在于每个多边形实际上是一个要以颜色绘制的值矩阵。

目前我最好的近似方法是计算包含边的倾斜版本的更大矩阵,并将它们连接成一个更大的二维矩阵,然后 imshow() 那个更大的矩阵。看起来很笨拙,并且做了很多工作,matplotlib 或 m3plot 中的某些引擎或我确定已经做过的事情。它也仅适用于以单一视角查看静态图像,但这不是我目前需要克服的问题。

是否有使用现有 python 工具在真正的 3D 图中绘制这些立方体边缘的好方法?有没有更好的方法来绘制 3D 矩阵?

最佳答案

Falko 关于使用 contourf 的建议有点花招。它有点受限,因为至少我的 contourf 版本有一些错误,有时它会将其中一个平面渲染在它应该在后面的其他平面前面,但现在只绘制立方体的三个正面或三个背面将做:

import numpy as np
import math
import matplotlib.pyplot as plot
import mpl_toolkits.mplot3d.axes3d as axes3d

def cube_marginals(cube, normalize=False):
c_fcn = np.mean if normalize else np.sum
xy = c_fcn(cube, axis=0)
xz = c_fcn(cube, axis=1)
yz = c_fcn(cube, axis=2)
return(xy,xz,yz)

def plotcube(cube,x=None,y=None,z=None,normalize=False,plot_front=False):
"""Use contourf to plot cube marginals"""
(Z,Y,X) = cube.shape
(xy,xz,yz) = cube_marginals(cube,normalize=normalize)
if x == None: x = np.arange(X)
if y == None: y = np.arange(Y)
if z == None: z = np.arange(Z)

fig = plot.figure()
ax = fig.gca(projection='3d')

# draw edge marginal surfaces
offsets = (Z-1,0,X-1) if plot_front else (0, Y-1, 0)
cset = ax.contourf(x[None,:].repeat(Y,axis=0), y[:,None].repeat(X,axis=1), xy, zdir='z', offset=offsets[0], cmap=plot.cm.coolwarm, alpha=0.75)
cset = ax.contourf(x[None,:].repeat(Z,axis=0), xz, z[:,None].repeat(X,axis=1), zdir='y', offset=offsets[1], cmap=plot.cm.coolwarm, alpha=0.75)
cset = ax.contourf(yz, y[None,:].repeat(Z,axis=0), z[:,None].repeat(Y,axis=1), zdir='x', offset=offsets[2], cmap=plot.cm.coolwarm, alpha=0.75)

# draw wire cube to aid visualization
ax.plot([0,X-1,X-1,0,0],[0,0,Y-1,Y-1,0],[0,0,0,0,0],'k-')
ax.plot([0,X-1,X-1,0,0],[0,0,Y-1,Y-1,0],[Z-1,Z-1,Z-1,Z-1,Z-1],'k-')
ax.plot([0,0],[0,0],[0,Z-1],'k-')
ax.plot([X-1,X-1],[0,0],[0,Z-1],'k-')
ax.plot([X-1,X-1],[Y-1,Y-1],[0,Z-1],'k-')
ax.plot([0,0],[Y-1,Y-1],[0,Z-1],'k-')

ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
plot.show()

plot_front=真 plot_front=Trueplot_front=假 plot_front=False其他数据(未显示) Other data (not shown)

关于python - 在 python 中绘制 3D 矩阵的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25494668/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com