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

10 投票
1 回答
14332 浏览
提问于 2025-04-16 19:18

我正在尝试在matplotlib中制作一个3D图,图上有三个圆圈,它们都以原点为中心,半径为1,指向不同的方向——比如用来展示半径为1的球体。

在2D图中,我会创建一个圆形补丁集合,然后把它添加到坐标轴上。但在3D图中,我遇到了麻烦,补丁根本无法显示,更别提把它们朝不同方向摆放了。

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: 试图用一个序列设置数组元素。

  • 为了让补丁朝不同方向摆放,我本以为可以传入类似zdir=['x', 'y', 'z']的东西,但无论我传入这个还是'z'['z'],结果都没有变化。

  • 我还本以为可以直接用ax.add_collection3d(circles, zs=[0, 0, 0], zdir=['x', 'y', 'z'])来添加补丁,而不是把补丁集合从2D转换成3D,但这也会报错:

    AttributeError: 'Patch3DCollection'对象没有属性'set_sort_zpos'

  • 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()
    

    当然可以!请把你想要翻译的内容发给我,我会帮你把它变得更简单易懂。

    撰写回答