2016-05-16 5 views
-1

Мне нужно визуализировать массив 2d numpy в python. Не контурный график, а не поверхностный сюжет. Настройте точку на оси z для каждого элемента (x, y) в 3d-массиве. Мои данные - это массив размером 1024 x 1024, но я полагаю, что смог бы уничтожить его, если бы мне пришлось. Мне нужно, чтобы он мог поворачивать сюжет с помощью мыши, чтобы увидеть его с разных точек зрения.«Быстрый» интерактивный график массива 2d numpy в python

Matplotlib не может этого сделать, даже для массива 100 х 100. Это слишком медленно. После перетаскивания массив 100 х 100 занимает две или три секунды. 1024 x 1024 не может быть и речи.

mlab от Mayavi, похоже, обладает этой возможностью, но самый простой пробный сбой в моей системе с ошибками wx. Насколько я могу судить, пакеты, обеспечивающие быстрое интерактивное вращение (например, VTK), ориентированы на рендеринг сложных 3d-фигур и не предоставляют простой API для построения данных.

Можете ли вы предложить варианты?

Моя текущая настройка:
OS X 10.11.4
питон 1.7.11
NumPy 1.11.0
Matplotlib 1.5.1
MayaVi 4.4.0
WX 3.0.0.0

+0

Голосов без комментариев не очень полезны. – garyp

+0

Вы указываете, чего не хотите, но не то, что вы действительно хотите. –

+0

@ Han-KwangNienhuys Я предполагаю, что мой первый абзац не ясен. У меня есть 2d-массив, я хочу визуализировать его в 3d, с осью z, представляющей значение массива в каждой точке. Я хочу, чтобы иметь возможность поворачивать его с помощью перетаскивания мышью. – garyp

ответ

0

Это представляет собой график xyz с 20-миллиметровым прореживанием, который является самым высоким, что мой ноутбук будет комфортно делать. Больше очков, чем это, в любом случае не имеет большого смысла, поскольку вы больше не сможете отличить отдельные точки друг от друга.

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

fig = plt.figure() 
X = np.linspace(-3,3,1024) 
Y = np.linspace(-3,3,1024) 
X, Y = np.meshgrid(X, Y) 
Z = np.exp(-(X**2+Y**2)) 
ax = fig.add_subplot(1, 1, 1, projection='3d') 
ax.plot_wireframe(X, Y, Z, rstride=20, cstride=20) 

plt.show(block=False) 
raw_input('Press ENTER') 

Вы можете рассмотреть возможность построения графика через Gnuplot. Он будет обрабатывать интерактивное вращение намного быстрее, чем matplotlib. Пример:

set isosamp 50 
set xrange [-3:3] 
set yrange [-3:3] 
splot exp(-x**2-y**2) 

Существует модуль питона Gnuplot.py, который позволит вам использовать его непосредственно из питона.

Смежные вопросы