我试图在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()

运行此程序填充了整个绘图窗口,无论我如何旋转绘图,都可以用蓝色,即贴片的面部颜色。如果我设置 facecolor='none' 在里面 PatchCollection() 打电话,然后是空的 Axes3D 出现。

我尝试过的事情:

  • 如果我使用 CircleCollection 代替 PatchCollection, ,根本没有补丁。
  • zs 参数 patch_collection_2d_to_3d() 通话很奇怪;我希望把 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'

有帮助吗?

解决方案

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()
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top