2011-06-10 32 views
8

Estoy tratando de hacer una trama 3D en matplotlib con tres círculos, cada uno centrado en el origen y con un radio de 1, apuntando en diferentes direcciones, para ilustrar una esfera de radio 1, por ejemplo.Cómo trazar una colección de parches 3D en matplotlib?

En 2D haré una colección de parches circulares y la añadiré a los ejes. En 3D tengo problemas para mostrar los parches, y mucho menos para orientarlos en diferentes direcciones.

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

La ejecución de este programa se llena toda la pantalla de diagramas con el azul, es decir, el color de la cara de los parches, no importa cómo puedo rotar la trama. Si configuro facecolor='none' en la llamada PatchCollection(), aparece un Axes3D vacío.

cosas que he intentado:

  • Si uso un CircleCollection en lugar de un PatchCollection, no hay parches aparecen en absoluto.
  • El parámetro zs en la llamada patch_collection_2d_to_3d() es impar; Yo esperaría que poner ya sea zs=0 (una coordenada z para los tres parches) o zs=[0,0,0] (una por separado coordenada z para cada parche), pero ambos de los que tirar un error:

    ValueError: setting an array element with a sequence.

  • para orientar el parches de manera diferente, esperaría poder pasar algo como zdir=['x', 'y', 'z'] pero los resultados no son diferentes si paso eso o 'z' o .

  • También me hubiera esperado a ser capaz de hacer ax.add_collection3d(circles, zs=[0, 0, 0], zdir=['x', 'y', 'z']) en lugar de convertir la colección de parches de 2D a 3D, pero que arroja un error demasiado:

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

+0

@ respuesta de Lilith es un enfoque alternativo excelente; ¿Alguien puede aclararme por qué mi enfoque no funcionó? – ptomato

Respuesta

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

¿cómo se puede generalizar esto para centrar el círculo en (x, y, z) = (a, b, c)? – kevinkayaks

Cuestiones relacionadas