Comment créer un nuage de points 3D en Python?

92

J'ai actuellement un tableau matriciel nx3. Je veux tracer les trois colonnes comme trois axes. Comment puis je faire ça?

J'ai cherché sur Google et des gens ont suggéré d'utiliser Matlab , mais j'ai vraiment du mal à le comprendre. J'ai également besoin que ce soit un nuage de points.

Quelqu'un peut-il m'apprendre?

utilisateur211037
la source
1
Cherchez-vous une application pour faire le tracé ou voulez-vous écrire du code (dans n'importe quelle langue) qui dessine le tracé?
Nils Pipenbrinck
Utilisez asymptote - c'est gratuit, puissant et la qualité est géniale!
Hamish Grubijan
1
Si vous avez un tableau, je suppose que vous avez un programme et que ce tableau en fait partie. Veuillez nous donner une chance de vous aider en indiquant de quel type de programme (langue) il s'agit!
Carl Smotricz
J'utiliserais toujours asymptote (en tant que lib) ou générerais simplement le fichier d'entrée correspondant. Découvrez sa qualité de sortie incroyable!
Hamish Grubijan
2
S'il s'agit d'un ntableau par 3, vous obtiendrez un tracé d'une courbe en 3 dimensions. Pour un "tracé 3D", vous auriez besoin d'un n x m x ltableau. Voulez-vous une courbe, avec un tuple (x,y,z)représentant un point sur la courbe?
Alok Singhal

Réponses:

161

Vous pouvez utiliser matplotlib pour cela. matplotlib a un module mplot3d qui fera exactement ce que vous voulez.

from matplotlib import pyplot
from mpl_toolkits.mplot3d import Axes3D
import random


fig = pyplot.figure()
ax = Axes3D(fig)

sequence_containing_x_vals = list(range(0, 100))
sequence_containing_y_vals = list(range(0, 100))
sequence_containing_z_vals = list(range(0, 100))

random.shuffle(sequence_containing_x_vals)
random.shuffle(sequence_containing_y_vals)
random.shuffle(sequence_containing_z_vals)

ax.scatter(sequence_containing_x_vals, sequence_containing_y_vals, sequence_containing_z_vals)
pyplot.show()

Le code ci-dessus génère un chiffre comme:

Image 3D matplotlib

Chinmay Kanchi
la source
11
Belle solution. Notez que cela plt.zlabel('zlabel')ne fonctionnera pas. Pour marquer l'axe z vous devez utiliser: ax.set_zlabel('Z').
Yonatan Simson
8

Utilisez le code suivant, cela a fonctionné pour moi:

# Create the figure
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

# Generate the values
x_vals = X_iso[:, 0:1]
y_vals = X_iso[:, 1:2]
z_vals = X_iso[:, 2:3]

# Plot the values
ax.scatter(x_vals, y_vals, z_vals, c = 'b', marker='o')
ax.set_xlabel('X-axis')
ax.set_ylabel('Y-axis')
ax.set_zlabel('Z-axis')

plt.show()

tandis que X_iso est mon tableau 3-D et pour X_vals, Y_vals, Z_vals j'ai copié / utilisé 1 colonne / axe de ce tableau et assigné à ces variables / tableaux respectivement.

Saeed Ullah
la source
1

Utilisez plutôt l'asymptote!

Voici à quoi cela peut ressembler:

http://asymptote.sourceforge.net/gallery/3D%20graphs/helix.pdf

Voici le code: http://asymptote.sourceforge.net/gallery/3D%20graphs/helix.asy

Asymptote peut également lire des fichiers de données.

Et la galerie complète: http://asymptote.sourceforge.net/gallery/

Pour utiliser l'asymptote depuis Python:

http://www.tex.ac.uk/tex-archive/graphics/asymptote/base/asymptote.py

Hamish Grubijan
la source
2
J'ai peur que la plupart des liens de cette réponse soient morts maintenant = (
alkanen