2011-06-10 91 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