Построение массива 2d с помощью mplot3d
У меня есть двумерный массив numpy, и я хочу построить его в 3D. Я слышал о mplot3d, но я не могу нормально работать
Вот пример того, что я хочу сделать. У меня есть массив с размерами (256,1024). Он должен построить 3D-график, где ось x от 0 до 256 оси y от 0 до 1024, а ось z графика отображает значение массива в каждой записи.
Как мне это сделать?
Ответы
Ответ 1
Похоже, вы пытаетесь создать график surface (в качестве альтернативы вы можете нарисовать wireframe или заполненный график счета.
Из информации в вопросе вы можете попробовать что-то вроде:
import numpy
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
# Set up grid and test data
nx, ny = 256, 1024
x = range(nx)
y = range(ny)
data = numpy.random.random((nx, ny))
hf = plt.figure()
ha = hf.add_subplot(111, projection='3d')
X, Y = numpy.meshgrid(x, y) # `plot_surface` expects `x` and `y` data to be 2D
ha.plot_surface(X, Y, data)
plt.show()
Очевидно, вам нужно выбрать более разумные данные, чем использовать numpy.random
, чтобы получить разумную поверхность.
Ответ 2
Вы можете найти ответ в одном из примеров Галерея Matplotlib; 3D-примеры подходят к концу.
В более общем плане, галерея Matplotlib - отличный ресурс первой остановки, для определения того, как делать некоторые графики.
В примерах, которые я рассмотрел, по существу, работают с тремя 2D-массивами: один со всеми значениями x, один со всеми значениями y и последний со всеми значениями z. Итак, одним из решений является создание массивов значений x и y (например, meshgrid()
).
Ответ 3
Вы также можете использовать модуль oct2py, который на самом деле является мостом python-октавы. Используя его, вы можете использовать fucntions октавы, и вы можете получить то, что вам нужно, и это тоже довольно легко.
ознакомьтесь с этой документацией: https://www.gnu.org/software/octave/doc/v4.0.1/Three_002dDimensional-Plots.html
И для примера примера:
from oct2py import octave as oc
tx = ty = oc.linspace (-8, 8, 41)
[xx, yy] = oc.meshgrid (tx, ty)
r = oc.sqrt (xx * xx + yy * yy) + oc.eps()
tz = oc.sin (r) / r
oc.mesh (tx, ty, tz)
Выше приведен код python, который аналогичен первому примеру, реализованному в октаве в приведенной выше документации.
Ответ 4
Вы можете попробовать 3D-график с помощью функции bar3d.
Предположим, что у вас есть массив A размерности (25, 10), значение с индексом (i, j) равно A [i] [j]. Следующий пример кода может дать вам график 3D-бара, где высота каждого бара равна A [i] [j].
from mpl_toolkits.mplot3d import axes3d
import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline
np.random.seed(1234)
fig = plt.figure()
ax1 = fig.add_subplot(111, projection='3d')
A = np.random.randint(5, size=(25, 10))
x = np.array([[i] * 10 for i in range(25)]).ravel() # x coordinates of each bar
y = np.array([i for i in range(10)] * 25) # y coordinates of each bar
z = np.zeros(25*10) # z coordinates of each bar
dx = np.ones(25*10) # length along x-axis of each bar
dy = np.ones(25*10) # length along y-axis of each bar
dz = A.ravel() # length along z-axis of each bar (height)
ax1.bar3d(x, y, z, dx, dy, dz)
На моем ПК со случайным семенем 1234, я получаю следующий сюжет: ![enter image description here]()
Тем не менее, возможно, будет медленным создание графика для вашей проблемы с размером (256, 1024).