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ć?


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


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.


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


2
Obawiam się, że większość linków w tej odpowiedzi jest już martwa = (
— alkanen
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.