Comment tracer une collection patch 3D matplotlib?
-
25-10-2019 - |
Question
Je suis en train de faire un terrain 3D matplotlib avec trois cercles, chacun centré sur l'origine et avec un rayon de 1, pointant dans des directions différentes - pour illustrer une sphère de rayon 1, par exemple
En 2D je faire une collection de patch cercle et l'ajouter aux axes. En 3D, je vais avoir du mal à obtenir les patchs pour montrer du tout, et encore moins orienter les 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()
, puis une montre de Axes3D
vides vers le haut.
Ce que j'ai essayé:
- Si j'utilise un
CircleCollection
au lieu d'unPatchCollection
, aucun patch apparaissent du tout. -
Le paramètre
zs
dans l'appel depatch_collection_2d_to_3d()
est impair; Je me attends à mettre soitzs=0
(une coordonnée z pour les trois patches) ouzs=[0,0,0]
(une coordonnée z pour chaque patch), mais les deux personnes jettent une erreur:ValueError:. La fixation d'un élément de réseau avec une séquence
-
Pour orienter les patchs différemment, j'attendre de pouvoir passer quelque chose comme
zdir=['x', 'y', 'z']
mais les résultats ne sont pas différents si je passe ou que'z'
ou['z']
. - J'aurait également prévu de pouvoir faire
ax.add_collection3d(circles, zs=[0, 0, 0], zdir=['x', 'y', 'z'])
au lieu de convertir la collection de patch de la 2D à la 3D, mais qui jette une erreur aussi:AttributeError: 'Patch3DCollection' objet n'a pas d'attribut 'set_sort_zpos'
La solution
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()