2011-06-10 15 views
8

farklı yönlere işaret ederek, bunun üzerine üç dairenin, köken olarak ve 1 yarıçapında merkezli her biri ile matplotlib bir 3B grafiğini yapmaya çalışıyorum.Matplotlib'de bir 3B yama koleksiyonu nasıl oluşturulur? örneğin, 1 yarıçaplı bir küre göstermek için -

2D yılında bir daire yama koleksiyonu yapar ve eksenler ekleyin. 3D olarak, yamaları farklı yönlere yönlendirmelerine izin vermek için yamaları ortaya çıkarmakta zorlanıyorum. Bu program çalıştırıldığında

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

olursa olsun arsa döndürmek nasıl, mavi, yani birlikte yamaların yüz rengini tüm çizim penceresini doldurur. Ben PatchCollection() çağrısında facecolor='none' belirlerseniz, boş Axes3D gösterir.

şeyler denedim:

  • Ben CircleCollection yerine PatchCollection bir kullanımı durumunda yamalar hiç görünür.
  • patch_collection_2d_to_3d() çağrı zs parametre tek olduğu; I koymak beklenir ya zs=0 (bir Z-koordinat üç yamalar için) veya zs=[0,0,0] (ayrı her bir yama z-koordinatı), ancak her ikisi de bu bir hata atmak:

    ValueError: setting an array element with a sequence.

  • yönlendirilmesi için yamalar farklı, ben zdir=['x', 'y', 'z'] gibi bir şey geçmek mümkün olması beklenebilir ancak sonuçlar bunu ya 'z' veya ['z'] geçebilecekler mi farklı değil.

  • Ben de 2D 3D yama toplama dönüştürmek yerine ax.add_collection3d(circles, zs=[0, 0, 0], zdir=['x', 'y', 'z']) yapabilmek için umuyordum, ama bu da bir hata atar: Lilith'in cevabı mükemmel bir alternatif yaklaşımdır

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

+0

@; benim yaklaşımımın neden işe yaramadığına dair beni aydınlatabilir mi? – ptomato

cevap

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

Bir daireyi (x, y, z) = (a, b, c) olarak ortalamak için bunu nasıl genelleştirebilirsiniz? – kevinkayaks

İlgili konular