Как создать трехмерный график рассеяния на Python?


92

В настоящее время у меня есть матричный массив nx3. Я хочу построить три столбца как три оси. Как я могу это сделать?

Я погуглил, и люди предложили использовать Matlab , но мне действительно трудно понять это. Мне также нужно, чтобы это была диаграмма рассеяния.

Кто-нибудь может меня научить?


1
Вы ищете приложение для построения сюжета или хотите написать код (на любом языке), который рисует сюжет?
Нильс Пипенбринк

Используйте асимптоту - это бесплатно, мощно и с отличным качеством!
Хэмиш Грубиджан,

1
Если у вас есть массив, я бы предположил, что у вас есть программа, и этот массив является ее частью. Пожалуйста, дайте нам возможность помочь вам, указав, что это за программа (язык)!
Carl Smotricz

Я бы все равно использовал асимптоту (как библиотеку) или просто сгенерировал бы для нее входной файл. Оцените потрясающее качество вывода!
Хэмиш Грубиджан,

2
Если это nмассив по 3, вы получите график кривой в 3 измерениях. Для «трехмерного графика» вам понадобится n x m x lмассив. Вам нужна кривая, в которой любой кортеж (x,y,z)представляет точку на кривой?
Алок Сингхал,

Ответы:


161

Для этого вы можете использовать matplotlib . В matplotlib есть модуль mplot3d, который будет делать именно то, что вы хотите.

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

Приведенный выше код генерирует рисунок вроде:

matplotlib 3D изображение


11
Хорошее решение. Обратите внимание, что это не plt.zlabel('zlabel')сработает. Для того, чтобы маркировать оси Z. Вы должны использовать: ax.set_zlabel('Z').
Йонатан Симсон

8

Используйте следующий код, который у меня сработал:

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

в то время как X_iso - это мой трехмерный массив, а для X_val, Y_val, Z_val я скопировал / использовал 1 столбец / ось из этого массива и назначил этим переменным / массивам соответственно.


1

Вместо этого используйте асимптоту!

Вот как это может выглядеть:

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

Это код: http://asymptote.sourceforge.net/gallery/3D%20graphs/helix.asy

Асимптота также может считываться в файлах данных.

И полная галерея: http://asymptote.sourceforge.net/gallery/

Чтобы использовать асимптоту из Python:

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


2
Боюсь, что большинство ссылок в этом ответе уже мертвы = (
alkanen
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.