Come creare un grafico a dispersione 3D in Python?


92

Al momento ho un array a matrice nx3. Voglio tracciare le tre colonne come tre assi. Come posso fare ciò?

Ho cercato su Google e le persone hanno suggerito di usare Matlab , ma sto davvero avendo difficoltà a capirlo. Ho anche bisogno che sia un grafico a dispersione.

Qualcuno può insegnarmi?


1
Cerchi un'applicazione per fare la trama o vuoi scrivere codice (in qualsiasi lingua) che disegna la trama?
Nils Pipenbrinck

Usa asintoto: è gratuito, potente e la qualità è fantastica!
Hamish Grubijan

1
Se hai un array, presumo che tu abbia un programma e questo array ne faccia parte. Ti preghiamo di darci la possibilità di aiutarti indicando che tipo di programma (lingua) è!
Carl Smotricz

Vorrei comunque utilizzare asintoto (come lib) o semplicemente generare il file di input per esso. Controlla la sua straordinaria qualità di output!
Hamish Grubijan

2
Se è un narray per 3, otterrai un grafico di una curva in 3 dimensioni. Per un "grafico 3-d", avresti bisogno di un n x m x larray. Vuoi una curva, con una tupla che (x,y,z)rappresenta un punto sulla curva?
Alok Singhal

Risposte:


161

Puoi usare matplotlib per questo. matplotlib ha un modulo mplot3d che farà esattamente quello che vuoi.

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()

Il codice sopra genera una figura come:

immagine 3D matplotlib


11
Bella soluzione. Nota che plt.zlabel('zlabel')non funzionerà. Per etichettare l'asse z è necessario utilizzare: ax.set_zlabel('Z').
Yonatan Simson

8

Usa il seguente codice che ha funzionato per me:

# 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()

mentre X_iso è il mio array 3-D e per X_vals, Y_vals, Z_vals ho copiato / usato 1 colonna / asse da quell'array e assegnato a quelle variabili / array rispettivamente.


1

Usa invece l'asintoto!

Ecco come può apparire:

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

Questo è il codice: http://asymptote.sourceforge.net/gallery/3D%20graphs/helix.asy

Asymptote può anche leggere file di dati.

E la galleria completa: http://asymptote.sourceforge.net/gallery/

Per usare un asintoto dall'interno di Python:

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


2
Temo che la maggior parte dei link in questa risposta siano ormai morti = (
alkanen
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.