如何在matplotlib中绘制3D补丁集合?

10
我正在尝试在matplotlib中制作一个三维图,其中有三个圆,每个圆心都在原点,半径为1,指向不同的方向 - 例如,用于说明半径为1的球体。
在二维空间中,我会创建一个圆形补丁集合,并将其添加到坐标轴中。但是在三维空间中,我无法让这些补丁出现,更别说使它们朝不同的方向了。
import matplotlib
import matplotlib.pyplot as P
import mpl_toolkits.mplot3d as M3

fig = P.figure()
ax = fig.add_subplot(1, 1, 1, projection='3d')
circles = matplotlib.collections.PatchCollection(
    [matplotlib.patches.Circle((0, 0), 1) for count in range(3)],
    offsets=(0, 0))
M3.art3d.patch_collection_2d_to_3d(circles, zs=[0], zdir='z')
ax.add_collection(circles)
P.show()
运行这个程序会使整个绘图窗口填充蓝色,即补丁的面颜色,无论我如何旋转绘图。如果在PatchCollection()调用中设置facecolor='none',则会出现一个空的Axes3D
我尝试过以下几点:
- 如果我使用CircleCollection而不是PatchCollection,则根本没有显示任何补丁。 - patch_collection_2d_to_3d()调用中的zs参数很奇怪。我希望可以将zs=0(所有三个补丁的一个z坐标)或zs=[0,0,0](每个补丁一个单独的z坐标),但这两者都会导致错误:

ValueError: setting an array element with a sequence.

- 为了以不同的方向定位补丁,我希望能够传递类似于zdir=['x', 'y', 'z']之类的内容,但是无论我传递zdir=['x', 'y', 'z']还是'z'['z'],结果都是一样的。 - 我也希望能够执行ax.add_collection3d(circles, zs=[0, 0, 0], zdir=['x', 'y', 'z'])而不是将补丁集合从2D转换为3D,但这也会导致错误:

AttributeError: 'Patch3DCollection' object has no attribute 'set_sort_zpos'


@Lilith的回答是一个很好的替代方法;有人能告诉我为什么我的方法不起作用吗? - ptomato
1个回答

18
import matplotlib.pyplot as plt
from matplotlib.patches import Circle, PathPatch
from mpl_toolkits.mplot3d import Axes3D 
import mpl_toolkits.mplot3d.art3d as art3d


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

for i in ["x","y","z"]:
    circle = Circle((0, 0), 1)
    ax.add_patch(circle)
    art3d.pathpatch_2d_to_3d(circle, z=0, zdir=i)


ax.set_xlim3d(-2, 2)
ax.set_ylim3d(-2, 2)
ax.set_zlim3d(-2, 2)

plt.show()

如何将此推广以使圆心位于 (x,y,z) = (a,b,c)? - kevinkayaks

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接