Python 如何使用mplot3d设置网格的原点?

Python 如何使用mplot3d设置网格的原点?,python,matplotlib,scikit-image,mplot3d,marching-cubes,Python,Matplotlib,Scikit Image,Mplot3d,Marching Cubes,按照中的示例,我使用marching cubes算法生成球面网格。我想将单位球体壳居中于由x、y、z栅格定义的原点。但是,我不能这样做,因为我不知道如何在mpl_toolkits.mplot3d.art3d.Poly3DCollection中放置x、y、z信息。代码如下: import matplotlib.pyplot as plt from mpl_toolkits.mplot3d.art3d import Poly3DCollection from skimage import measu

按照中的示例,我使用marching cubes算法生成球面网格。我想将单位球体壳居中于由x、y、z栅格定义的原点。但是,我不能这样做,因为我不知道如何在mpl_toolkits.mplot3d.art3d.Poly3DCollection中放置x、y、z信息。代码如下:

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d.art3d import Poly3DCollection
from skimage import measure
import numpy as np

x, y, z = np.ogrid[-4:4:20j, -4:4:20j, -4:4:20j]
r = np.sqrt(x ** 2 + y ** 2 + z ** 2)
verts, faces, normals, values = measure.marching_cubes_lewiner(r,level=1)
fig = plt.figure(figsize=(10, 10))
ax = fig.add_subplot(111, projection='3d')
mesh = Poly3DCollection(verts[faces])
mesh.set_edgecolor('k')
ax.add_collection3d(mesh)
plt.show()
问题是
marching_cubes_lewiner
函数没有考虑
x,y,z
。如何将生成的球体居中于网格所暗示的0,0,0处?

获取网格中点的索引以计算拓扑。它似乎没有办法指定实际栅格,也没有任何偏移

因此,您可以按照所需的方式操作生成的
顶点。即,可以先乘以网格点之间的差值,有效地缩放输出,然后添加网格的偏移量。在这种情况下,转换为
newverts=0.42105*oldverts-4

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d.art3d import Poly3DCollection
from skimage import measure

x, y, z = np.ogrid[-4:4:20j, -4:4:20j, -4:4:20j]
r = np.sqrt(x ** 2 + y ** 2 + z ** 2)

verts, faces, normals, values = measure.marching_cubes_lewiner(r, level=1)

verts *= np.array([np.diff(ar.flat)[0] for ar in [x,y,z]])
verts += np.array([x.min(),y.min(),z.min()])

fig = plt.figure(figsize=(10, 10))
ax = fig.add_subplot(111, projection='3d')
mesh = Poly3DCollection(verts[faces])
mesh.set_edgecolor('k')
ax.add_collection3d(mesh)
ax.set_xlim(-2, 2) 
ax.set_ylim(-2, 2)
ax.set_zlim(-2, 2)
plt.show()

教程中的函数名为
measure.marching\u cubes\u lewiner
,它有两个参数。@ImportanceOfBeingErnest:第二个参数是可选的,用于设置等值面值。marching_cubes使用lewiner算法作为默认值,因此两者都可以工作。但是,为了避免混淆,我对这个问题进行了编辑。我的skimage版本没有一个
marching\u cubes
。但是现在的代码应该是有效的;你遇到了什么问题?我希望球体的中心为0,0,0。我不知道怎么做。非常感谢你的回答。你能详细说明一下顶点的操作吗?顺便说一下,
import numpy as np
缺失。