MATLAB: нужно сделать 4D сюжет (3D + цвет / цвет) - PullRequest
7 голосов
/ 01 апреля 2012

Мне нужно сделать трехмерную поверхность, где цвет будет представлять четвертую переменную. Я знаю, что "серфинг" похож на то, что мне нужно, но это не совсем так. По сути, у меня есть следующие переменные:

t = [1: м]

y = [1: n]

a = [1: o]

Это должны быть три декартовых кородинатных оси.

У меня также есть переменная S, которая имеет размеры m x n x o и в основном является амплитудой, функцией от предыдущих трех переменных (то есть S = f (t, y, a)). Я хочу, чтобы это было представлено цветом.

Итак, чтобы подвести итог, мне нужен график в форме (t, y, a, S), где первые три переменные являются векторами неравных размеров, а последняя переменная является многомерным массивом, размеры которого определяются первыми тремя .

Заранее спасибо.

Ответы [ 3 ]

10 голосов
/ 01 апреля 2012

SCATTER3 требует, чтобы x, y и z и другие аргументы группировки были равными по размеру векторами Nx1 для одной серии или матрицами NxM для серии M.

У вас есть 3D-данные полного пространства. Для создания координатных векторов одинакового размера используйте функцию MESHGRID (или NDGRID ):

[X, Y, Z] = meshgrid(t, y, a);

Тогда вы можете использовать SCATTER3:

scatter3( X(:), Y(:), Z(:), [], S(:) )

Проблема в том, что разброс данных по всему пространству 3 не поможет, особенно если у вас много точек.

Вероятно, вы можете отфильтровать переменную S (что-то вроде idx = S > 0), затем вы можете построить отфильтрованные данные.

Если вам действительно нужно визуализировать все данные, посмотрите Визуализация объема в документации MATLAB. Я могу порекомендовать функцию SLICE , например.

EDIT

Вот пример полного трехмерного пространственного рассеяния для малых векторов (m, n, o равно 5) с S = rand([m,n,o]); scatter3( X(:), Y(:), Z(:), [], S(:), 'filled' )

scatter example

РЕДАКТИРОВАТЬ 2

Из ваших комментариев к другому ответу я обнаружил, что у вас матрица 32x76050x4. На самом деле вы можете построить 2D срез по одному. Вы можете сделать это в 2D с функцией IMAGESC или в 3D с функцией SLICE.

Попробуйте:

imagesc(S(:,:,k))

, где k - число от 1 до 4 для третьего измерения.

Или попробуйте

slice(S, [], [], 1:size(S,3))
shading flat

slice example

3 голосов
/ 30 мая 2013

Может быть может помочь эта созданная пользователем подпрограмма .

Снимок со связанной страницы: Screnshot from the linked page

1 голос
/ 01 апреля 2012

Я всегда использовал scatter3 для окрашивания / определения размеров пикселей в трехмерном пространстве. Я считаю, что подпись:

scatter3(x,y,z, size, color)

Размер и цвет могут быть скалярными или векторными длинами, равными координатам. Я обычно использую либо цвет, либо размер, чтобы отразить четвертый атрибут, в зависимости от того, что я показываю. У меня нет Matlab на этой машине, так что прости меня, если моя память не совсем точна при использовании. "help scatter3" должен описать это намного лучше.

...