Python / matplotlib: tracer un cube 3d, une sphère et un vecteur?

Je cherche comment tracer quelque chose avec moins d'instructions que 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 latérale de 2
  • une sphère "filaire" centrée en 0 avec un rayon de 1
  • un point à coordonnées [0, 0, 0]
  • un vecteur qui commence à ce point et va à [1, 1, 1]

Comment faire ça?

55
demandé sur Seanny123 2012-06-21 18:15:43

2 réponses

, Il est un peu compliqué, mais vous pouvez dessiner tous les objets par 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

145
répondu HYRY 2017-02-17 08:58:48

Pour dessiner juste la flèche, il y a une méthode plus facile: -

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 effectivement ê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]

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: Le composants x, y et z des vecteurs fléchés

Les arguments peuvent être de type tableau ou scalaires.

Arguments des mots clés:

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

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

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

Normaliser: [False | True] Lorsqu'il est vrai, toutes les flèches auront la même longueur. La valeur par défaut est False, où les flèches seront de longueurs différentes en fonction des valeurs de u, v, W.

6
répondu Aritra 2017-01-26 13:51:08