Come tracciare una raccolta di patch 3D in matplotlib?
-
25-10-2019 - |
Domanda
Sto cercando di fare un grafico 3D in matplotlib con tre cerchi su di esso, ciascuno centrato sull'origine e con un raggio di 1, che puntano in direzioni diverse - per illustrare una sfera di raggio 1, ad esempio
In 2D vorrei fare una raccolta di patch cerchio e aggiungerlo agli assi. In 3D Sto avendo difficoltà a raggiungere le patch di presentarsi a tutti, per non parlare di orientare in direzioni diverse.
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'esecuzione di questo programma riempie l'intera finestra grafica con il blu, vale a dire il colore faccia delle patch, non importa quanto ho ruotare la trama. Se fisso facecolor='none'
nella chiamata PatchCollection()
, poi un vuoto spettacoli Axes3D
up.
Le cose che ho provato:
- Se io uso un
CircleCollection
invece di unPatchCollection
, nessuna patch appaiono affatto. -
Il parametro
zs
nella chiamatapatch_collection_2d_to_3d()
è dispari; Mi aspetterei di mettere siazs=0
(una coordinata z per tutte e tre le patch) ozs=[0,0,0]
(un separato coordinata z per ogni patch), ma sia di quelli genera un errore:ValueError:. Modificando un elemento di matrice con una sequenza
-
Per orientare le patch in modo diverso, mi sarei aspettato di essere in grado di passare qualcosa come
zdir=['x', 'y', 'z']
ma i risultati non sono diversi se mi passa quello o'z'
o['z']
. - I avrebbe anche dovrebbe essere in grado di fare
ax.add_collection3d(circles, zs=[0, 0, 0], zdir=['x', 'y', 'z'])
invece di convertire la raccolta di patch dal 2D al 3D, ma che getta un errore troppo:AttributeError: oggetto 'Patch3DCollection' non ha alcun attributo 'set_sort_zpos'
Soluzione
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()