97 votes

Tracé d'un cube 3d, d'une sphère et d'un vecteur dans Matplotlib

Je cherche comment tracer quelque chose avec le moins d'instructions possible avec Matplotlib mais je ne trouve aucune aide pour cela dans la documentation.

Je veux tracer les choses suivantes :

  • un cube filaire centré en 0 avec une longueur de côté de 2
  • une sphère "filaire" centrée en 0 avec un rayon de 1
  • un point aux coordonnées [0, 0, 0].
  • un vecteur qui commence à ce point et va jusqu'à [1, 1, 1].

Comment faire ?

208voto

HYRY Points 26340

C'est un peu compliqué, mais vous pouvez dessiner tous les objets avec le code suivant :

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np
from itertools import product, combinations

fig = plt.figure()
ax = fig.gca(projection='3d')
ax.set_aspect("equal")

# draw cube
r = [-1, 1]
for s, e in combinations(np.array(list(product(r, r, r))), 2):
    if np.sum(np.abs(s-e)) == r[1]-r[0]:
        ax.plot3D(*zip(s, e), color="b")

# draw sphere
u, v = np.mgrid[0:2*np.pi:20j, 0:np.pi:10j]
x = np.cos(u)*np.sin(v)
y = np.sin(u)*np.sin(v)
z = np.cos(v)
ax.plot_wireframe(x, y, z, color="r")

# draw a point
ax.scatter([0], [0], [0], color="g", s=100)

# draw a vector
from matplotlib.patches import FancyArrowPatch
from mpl_toolkits.mplot3d import proj3d

class Arrow3D(FancyArrowPatch):

    def __init__(self, xs, ys, zs, *args, **kwargs):
        FancyArrowPatch.__init__(self, (0, 0), (0, 0), *args, **kwargs)
        self._verts3d = xs, ys, zs

    def draw(self, renderer):
        xs3d, ys3d, zs3d = self._verts3d
        xs, ys, zs = proj3d.proj_transform(xs3d, ys3d, zs3d, renderer.M)
        self.set_positions((xs[0], ys[0]), (xs[1], ys[1]))
        FancyArrowPatch.draw(self, renderer)

a = Arrow3D([0, 1], [0, 1], [0, 1], mutation_scale=20,
            lw=1, arrowstyle="-|>", color="k")
ax.add_artist(a)
plt.show()

output_figure

16voto

Aritra Points 340

Pour dessiner uniquement la flèche, il existe une méthode plus simple:-.

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.gca(projection='3d')
ax.set_aspect("equal")

#draw the arrow
ax.quiver(0,0,0,1,1,1,length=1.0)

plt.show()

quiver peut en fait être utilisé pour tracer plusieurs vecteurs en une seule fois. L'utilisation est la suivante : [ de [http://matplotlib.org/mpl\_toolkits/mplot3d/tutorial.html?highlight=quiver#mpl\_toolkits.mplot3d.Axes3D.quiver\]](http://matplotlib.org/mpl_toolkits/mplot3d/tutorial.html?highlight=quiver#mpl_toolkits.mplot3d.Axes3D.quiver])

quiver(X, Y, Z, U, V, W, **kwargs)

Arguments :

X, Y, Z : Les coordonnées x, y et z de l'emplacement des flèches.

U, V, W : Les composantes x, y et z des vecteurs flèches

Les arguments peuvent être des tableaux ou des scalaires.

Les arguments des mots-clés :

longueur : [1.0 | float] La longueur de chaque carquois, par défaut 1.0, l'unité est la même que pour les axes.

Rapport de la longueur de la flèche : [0.3 | float] Le ratio de la tête de la flèche par rapport au carquois, par défaut 0.3.

pivot : [ 'queue' | 'milieu' | 'pointe' ] La partie de la flèche qui se trouve au point de la grille ; la flèche tourne autour de ce point, d'où le nom de pivot. La valeur par défaut est 'tail'.

normaliser : [Faux | Vrai] Si la valeur est True, toutes les flèches seront de la même longueur. La valeur par défaut est False, où les flèches auront des longueurs différentes selon les valeurs de u,v,w.

4voto

tash Points 163

Ma réponse est un amalgame des deux précédentes avec une extension pour dessiner une sphère d'opacité définie par l'utilisateur et quelques annotations. Elle trouve son application dans la visualisation du vecteur b sur une sphère pour une image à résonance magnétique (IRM). J'espère que vous la trouverez utile :

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np

fig = plt.figure()
ax = fig.gca(projection='3d')

# draw sphere
u, v = np.mgrid[0:2*np.pi:50j, 0:np.pi:50j]
x = np.cos(u)*np.sin(v)
y = np.sin(u)*np.sin(v)
z = np.cos(v)
# alpha controls opacity
ax.plot_surface(x, y, z, color="g", alpha=0.3)

# a random array of 3D coordinates in [-1,1]
bvecs= np.random.randn(20,3)

# tails of the arrows
tails= np.zeros(len(bvecs))

# heads of the arrows with adjusted arrow head length
ax.quiver(tails,tails,tails,bvecs[:,0], bvecs[:,1], bvecs[:,2],
          length=1.0, normalize=True, color='r', arrow_length_ratio=0.15)

ax.set_xlabel('X-axis')
ax.set_ylabel('Y-axis')
ax.set_zlabel('Z-axis')

ax.set_title('b-vectors on unit sphere')

plt.show()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X