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'un PatchCollection, aucun patch apparaissent du tout.
  • Le paramètre zs dans l'appel de 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] (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'

Était-ce utile?

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()
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top