3D-график Mathematica с координатами оси X и Y в отдельных списках - PullRequest
4 голосов
/ 04 января 2012

У меня есть матрица размером (ixj) mat, которая содержит значения из эксперимента.

Если я использую ListPlot3D[mat], я могу визуализировать это на трехмерном графике.

У меня также есть два массива размера i (aRow) и размера j (aCol), которые я определил из своего эксперимента.

Как заменить стандартные x и yось показана с ListPlot3D[mat] с aRow и aCol?

Ответы [ 2 ]

3 голосов
/ 04 января 2012

Пожалуйста, обратите внимание на параметр Ticks, и его пример используется в документации.


Вот один из способов сделать это. Сначала сгенерируйте пример данных:

mat = Table[Exp[-(x^2 + y^2)], {x, -2, 2, .1}, {y, -2, 2, .1}];    
aCol = aRow = Round[mat[[20]], 0.01];

Сюжет в 3D. Я решил показать каждый десятый тик из всех возможных. list[[;; ;; 10]] выбирает каждый 10-й элемент списка.

ListPlot3D[mat,
 Ticks -> {
   Transpose[{Range@Length[aRow], aRow}][[;; ;; 10]],
   Transpose[{Range@Length[aCol], aCol}][[;; ;; 10]],
   Automatic}]

Mathematica graphics

Составьте график в 2D тоже. ListDensityPlot по умолчанию имеет Frame (не Axes), поэтому мы используем FrameTicks

ListDensityPlot[mat,
 FrameTicks -> {
   Transpose[{Range@Length[aRow], aRow}][[;; ;; 10]],
   Transpose[{Range@Length[aCol], aCol}][[;; ;; 10]],
   None, None},
 Mesh -> Automatic]

Mathematica graphics


Обновление

Если вам не нужны произвольные тики, просто другой диапазон для обычных, линейно разделенных тиковых меток, тогда вы можете использовать параметр DataRange, например:

ListPlot3D[mat, DataRange -> {{0, 1}, {0, 1}}]

Mathematica graphics

Если вам все еще нужны данные в формате {x,y,z} (поскольку координаты не расположены равномерно), вы можете построить их, используя

Join @@ MapThread[Append, {Outer[List, aRow, aCol], mat}, 2]
2 голосов
/ 04 января 2012

Если различия между последовательными элементами в aRow и bRow постоянны, вы можете сделать что-то вроде

ListPlot3D[mat, DataRange -> (Through[{Min, Max}[#]] & /@ {aCol, aRow})]

Если нет, то вы можете создать список с элементами {aCol[[i]], aRow[[j]], mat[[j,i]]} и построить его. Есть разные способы сделать это, например

list = Flatten[Table[{aCol[[i]], aRow[[j]], mat[[j, i]]}, 
    {i, Length[aCol]}, {j, Length[aRow]}], 1];

ListPlot3D[list]

Редактировать

Более быстрый способ создания list - сделать что-то вроде

list = ConstantArray[0, {Length[aCol] Length[aRow], 3}];
list[[All, {2, 1}]] = Tuples[{aRow, aCol}];
list[[All, 3]] = Flatten[mat];
...