Intento hacer un gráfico 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.
En 2D haría una colección de parches circulares y la agregaría a los ejes. En 3D estoy teniendo problemas para que los parches se muestren, por no hablar de 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 progtwig llena toda la ventana del gráfico con azul, es decir, el color de la cara de los parches, sin importar cómo lo rote. Si configuro facecolor='none'
en la llamada PatchCollection()
, aparece un Axes3D
vacío.
Cosas que he probado:
CircleCollection
lugar de PatchCollection
, no se muestran parches. El parámetro zs
en la llamada patch_collection_2d_to_3d()
es impar; Espero poner zs=0
(una coordenada z para los tres parches) o zs=[0,0,0]
(una coordenada z separada para cada parche), pero ambos lanzan un error:
ValueError: configurando un elemento de matriz con una secuencia.
Para orientar los parches de manera diferente, espero poder pasar algo como zdir=['x', 'y', 'z']
pero los resultados no son diferentes, ya sea que pase eso o 'z'
o ['z']
.
ax.add_collection3d(circles, zs=[0, 0, 0], zdir=['x', 'y', 'z'])
lugar de convertir la colección de parches de 2d a 3d, pero que arroja un error también:AttributeError: el objeto ‘Patch3DCollection’ no tiene atributo ‘set_sort_zpos’
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()