Jak zrobić wykres punktowy 3D w Pythonie?

92

Obecnie mam macierz macierzy nx3. Chcę wykreślić trzy kolumny jako trzy osie. Jak mogę to zrobić?

Wyszukałem w Google i ludzie zasugerowali używanie Matlab , ale naprawdę ciężko mi to zrozumieć. Potrzebuję też, żeby był to wykres punktowy.

Czy ktoś może mnie nauczyć?

user211037
źródło
1
Szukasz aplikacji do tworzenia fabuły, czy chcesz napisać kod (w dowolnym języku), który rysuje fabułę?
Nils Pipenbrinck
Użyj asymptoty - jest darmowa, potężna, a jakość jest niesamowita!
Hamish Grubijan
1
Jeśli masz tablicę, zakładam, że masz program i ta tablica jest jej częścią. Daj nam szansę, aby Ci pomóc, wskazując rodzaj programu (język)!
Carl Smotricz
Nadal używałbym asymptote (jako biblioteki) lub po prostu wygenerowałbym dla niej plik wejściowy. Sprawdź, jaka jest niesamowita jakość wydruku!
Hamish Grubijan
2
Jeśli jest to ntablica na 3, otrzymasz wykres krzywej w 3 wymiarach. Do „wykresu trójwymiarowego” potrzebna byłaby n x m x ltablica. Czy chcesz mieć krzywą z dowolną krotką (x,y,z)reprezentującą punkt na krzywej?
Alok Singhal

Odpowiedzi:

162

Możesz do tego użyć matplotlib . matplotlib ma moduł mplot3d , który zrobi dokładnie to, co chcesz.

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

Powyższy kod generuje figurę taką jak:

Obraz 3D matplotlib

Chinmay Kanchi
źródło
11
Niezłe rozwiązanie. Zauważ, że to plt.zlabel('zlabel')nie zadziała. Aby oznaczyć oś Z trzeba użyć: ax.set_zlabel('Z').
Yonatan Simson
8

Użyj następującego kodu, który zadziałał dla mnie:

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

podczas gdy X_iso jest moją tablicą 3-W, a dla X_vals, Y_vals, Z_vals skopiowałem / użyłem 1 kolumny / osi z tej tablicy i przypisałem odpowiednio do tych zmiennych / tablic.

Saeed Ullah
źródło
1

Zamiast tego użyj asymptoty!

Tak to może wyglądać:

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

To jest kod: http://asymptote.sourceforge.net/gallery/3D%20graphs/helix.asy

Asymptote może również czytać pliki danych.

Oraz pełna galeria: http://asymptote.sourceforge.net/gallery/

Aby użyć asymptoty z poziomu Pythona:

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

Hamish Grubijan
źródło
2
Obawiam się, że większość linków w tej odpowiedzi jest już martwa = (
alkanen