web-dev-qa-db-fra.com

Traçage d'un cube 3D, d'une sphère et d'un vecteur dans Matplotlib

Je cherche comment tracer quelque chose avec moins d'instruction que possible avec Matplotlib mais je ne trouve aucune aide à ce sujet dans la documentation.

Je veux tracer les choses suivantes:

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

Comment faire ça?

65
Vincent

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

159
HYRY

Pour dessiner simplement 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()

carquois peut effectivement être utilisé pour tracer plusieurs vecteurs à la fois. L'utilisation est la suivante: - [from http://matplotlib.org/mpl_toolkits/mplot3d/tutorial.html?highlight=quiver#mpl_toolkits.mplot3d.Axes3D.quiver]

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

Arguments:

X, Y, Z: Les coordonnées x, y et z des emplacements des flèches

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

Les arguments peuvent être des tableaux ou des scalaires.

Arguments des mots clés:

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

arrow_length_ratio: [0.3 | float] Le rapport entre la tête de flèche et le carquois, par défaut à 0,3

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

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

8
Aritra