2011-06-10 88 views
8

我想在matplotlib中制作一个三维图,上面有三个圆,每个圆都以原点为中心,半径为1,指向不同的方向 - 例如说明半径为1的球体。如何绘制matplotlib中的3D补丁集合?

在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=0(一个z坐标为所有三个补丁)或zs=[0,0,0](每一片单独的z坐标),但两者的那些引发错误:

    ValueError: setting an array element with a sequence.

  • 以定向不同的补丁,我希望能够通过像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'

+0

@莉莉丝的回答是一个很好的替代方法;有谁能够启发我,为什么我的方法行不通? – ptomato 2011-06-15 09:26:57

回答

11
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() 
+0

怎么能概括这个在(x,y,z)=(a,b,c)处居中的圆? – kevinkayaks 2017-04-18 23:05:35