Como fazer um gráfico de dispersão 3D em Python?


97

Atualmente, tenho uma matriz de matriz nx3. Eu quero plotar as três colunas como três eixos. Como eu posso fazer isso?

Pesquisei no Google e algumas pessoas sugeriram o uso do Matlab , mas estou realmente tendo dificuldade em entender. Eu também preciso que seja um gráfico de dispersão.

Alguém pode me ensinar?


1
Você está procurando um aplicativo para fazer o gráfico ou deseja escrever o código (em qualquer idioma) que desenhe o gráfico?
Nils Pipenbrinck

Use a assíntota - é grátis, poderosa e de qualidade incrível!
Hamish Grubijan

1
Se você tiver um array, suponho que você tenha um programa e esse array faça parte dele. Dê-nos a oportunidade de ajudá-lo indicando que tipo de programa (idioma) é!
Carl Smotricz

Eu ainda usaria a assíntota (como uma lib), ou apenas geraria o arquivo de entrada para ela. Confira a incrível qualidade de saída!
Hamish Grubijan

2
Se for uma nmatriz de 3, você obterá um gráfico de uma curva em 3 dimensões. Para um "gráfico 3-d", você precisaria de uma n x m x lmatriz. Você quer uma curva, com qualquer tupla (x,y,z)representando um ponto na curva?
Alok Singhal

Respostas:


170

Você pode usar matplotlib para isso. matplotlib tem um módulo mplot3d que fará exatamente o que você quiser.

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

O código acima gera uma figura como:

imagem 3D matplotlib


11
Ótima solução. Observe que plt.zlabel('zlabel')não vai funcionar. Para rotular o eixo z você precisa usar: ax.set_zlabel('Z').
Yonatan Simson

8

Use o seguinte código que funcionou para mim:

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

enquanto X_iso é meu array 3-D e para X_vals, Y_vals, Z_vals eu copiei / usei 1 coluna / eixo desse array e atribuído a essas variáveis ​​/ arrays respectivamente.


1

Em vez disso, use a assíntota!

Pode ser assim:

https://asymptote.sourceforge.io/gallery/3Dgraphs/helix.html

Este é o código: https://asymptote.sourceforge.io/gallery/3Dgraphs/helix.asy

A assíntota também pode ler arquivos de dados.

E a galeria completa: https://asymptote.sourceforge.io/gallery/index.html

Para usar a assíntota de dentro do Python:

https://ctan.org/tex-archive/graphics/asymptote/base/asymptote.py


2
Receio que a maioria dos links nesta resposta já estejam mortos = (
alkanen
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.