2011-06-10 7 views
8

J'essaie de créer un tracé 3D en matplotlib avec trois cercles centrés à l'origine et avec un rayon de 1, pointant dans des directions différentes - pour illustrer une sphère de rayon 1, par exemple.Comment tracer une collection de patch 3D dans matplotlib?

En 2D, je voudrais créer une collection de patchs en cercle et l'ajouter aux axes. En 3D, j'ai du mal à faire apparaître les patchs, et encore moins à les orienter dans des directions différentes.

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

L'exécution de ce programme remplit toute la fenêtre de la parcelle avec le bleu, à savoir la couleur du visage des taches, peu importe comment je fais tourner l'intrigue. Si je mets facecolor='none' dans l'appel PatchCollection(), alors un Axes3D apparaît.

choses que j'ai essayé:

  • Si j'utilise un CircleCollection au lieu d'un PatchCollection, aucun patch apparaissent du tout.
  • Le paramètre zs dans l'appel patch_collection_2d_to_3d() est impair; Je me attends à mettre soit zs=0 (une coordonnée z pour les trois patches) ou zs=[0,0,0] (un z coordonnée pour chaque patch), mais les deux de ceux qui jettent une erreur:

    ValueError: setting an array element with a sequence.

  • Pour orienter la correctifs différemment, je m'attendrais à être capable de passer quelque chose comme zdir=['x', 'y', 'z'] mais les résultats ne sont pas différents si je passe cela ou 'z' ou ['z'].

  • Je voudrais également attendu à pouvoir faire ax.add_collection3d(circles, zs=[0, 0, 0], zdir=['x', 'y', 'z']) au lieu de convertir la collection de patch de 2d à 3d, mais qui jette une erreur aussi:

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

+0

@ La réponse de Lilith est une excellente approche alternative; Quelqu'un peut-il m'éclairer pour savoir pourquoi mon approche n'a pas fonctionné? – ptomato

Répondre

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

comment peut-on généraliser ceci pour centrer le cercle en (x, y, z) = (a, b, c)? – kevinkayaks

Questions connexes