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 un PatchCollection, nessuna patch appaiono affatto.
  • Il parametro zs nella chiamata patch_collection_2d_to_3d() è dispari; Mi aspetterei di mettere sia zs=0 (una coordinata z per tutte e tre le patch) o zs=[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'

È stato utile?

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()
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top