поверхностные участки для прямоугольных массивов в matplotlib

1

Я пытаюсь использовать matplotlib для создания поверхностного графика прямоугольного массива (в моем случае это 47x70). Способ организации этого массива:

47 - это измерение указывает количество функций

70 - это измерение указывает количество выборок

Массив содержит значения для этих функций по каждому образцу.

Если бы мне нужно было создать участок поверхности в MATLAB или Octave, это действительно просто.

vals = csvread("vals.csv"); surf(vals)

Результат выглядит примерно так:

Изображение 174551

Массив в vals.csv был сгенерирован следующим образом:

tempvals = np.random.randint(0, 10000, size = (47, 70))
np.savetxt("vals.csv", tempvals, delimiter=',')

Как это сделать в python/matplotlib?

Здесь есть довольно приятный ответ. Однако в этом ответе используется некоторая интерполяция, которую я не могу использовать. Я хочу напрямую строить свои ценности.

Я пробовал писать что-то очень простое. Как это -

import numpy as np
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt

vals = np.genfromtxt('vals.csv', delimiter=',')

fig1 = plt.figure(1, figsize = (9, 6))
ax1 = fig1.add_subplot(111, projection = '3d')
xax = np.arange(0, 46)
yax = np.arange(0, 70)
xax, yax = np.meshgrid(yax, xax)

Axes3D.plot3D(xax, yax, vals)

Это, конечно, не с ошибкой -

AttributeError: 'numpy.ndarray' object has no attribute 'has_data'

Я просмотрел всю эту страницу, но чего-то не хватает. Как я могу генерировать поверхностные графики для прямоугольных массивов?

  • 1
    Что вы подразумеваете под "использует интерполяцию"? Вы ищете сюжет, состоящий из серии кубоидов? Если так, bar3d должен сделать трюк
Теги:
matplotlib
numpy
python-3.x
mplot3d

1 ответ

1
Лучший ответ

Я думаю, что это дает результат, похожий на сюжет сюжета surf(vals) matlab, с которым вы связались: matplotlib - 3d-поверхность из прямоугольного массива высот.

import numpy as np
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt

# gen random 2d array and write to csv file
tempvals = np.random.randint(0, 10000, size = (47, 70))
np.savetxt("vals.csv", tempvals, delimiter=',')

# read from csv
vals = np.genfromtxt('vals.csv', delimiter=',')
val_xdim, val_ydim = vals.shape

# generate meshgrid for plot
xax = np.arange(0, val_xdim)
yax = np.arange(0, val_ydim)
xax, yax = np.meshgrid(yax, xax)

# plot and save
fig = plt.figure()
ax = fig.gca(projection='3d')
surf = ax.plot_surface(xax, yax, vals, rstride=1, cstride=1, cmap='viridis', linewidth=0, antialiased=False)
ax.plot_wireframe(xax, yax, vals, color='k', lw=0.05, alpha=0.3)
fig.colorbar(surf, shrink=0.5, aspect=5)
plt.savefig("rand_3d_surf.png", dpi=160)

Что производит: Изображение 174551

Ещё вопросы

Сообщество Overcoder
Наверх
Меню