Mathematica 3D绘图,使用单独的列表作为x和y轴坐标。

5

我有一个大小为(i x j)的矩阵mat,其中包含实验数据。

如果我使用ListPlot3D[mat],我可以在三维图中可视化它。

我还有两个数组,一个大小为i(aRow),另一个大小为j(aCol),它们是从我的实验中确定的。

如何用aRowaCol替换ListPlot3D[mat]显示的默认x和y轴?

2个回答

3
请查看Ticks选项及其文档中的示例用法。
以下是一种实现方式。首先生成一些示例数据:
mat = Table[Exp[-(x^2 + y^2)], {x, -2, 2, .1}, {y, -2, 2, .1}];    
aCol = aRow = Round[mat[[20]], 0.01];

在三维图中绘制它。我选择展示所有可能刻度线中的每10个。 list[[;; ;; 10]] 选择列表的每10个元素。

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

Mathematica图形

在二维中绘制它。默认情况下,ListDensityPlot 具有 Frame(而不是 Axes),因此我们使用 FrameTicks

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

Mathematica图形


更新

如果您不需要任意刻度,只需要线性间隔刻度标记的不同范围,则可以使用DataRange选项,如下所示:

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

Mathematica图形

如果您仍需要以{x,y,z}格式获取数据(因为坐标不是均匀分布的),则可以使用以下方法构建:

Join @@ MapThread[Append, {Outer[List, aRow, aCol], mat}, 2]

这很好,但是我想根据默认情况下没有使用刻度线时的间距来控制刻度线间距。 - akk
据我所知,没有方法可以检索自动生成的刻度标记(AbsoluteOptions[graphics, Ticks] 返回 Automatic)。我记得很久以前曾经尝试过这样做,但是失败了。您必须想出自己的算法来找到刻度密度。 - Szabolcs
@akk 我不确定我是否理解你的意思。我无法访问Mathematica默认生成的刻度标记。我无法告诉它选择{10,20,30,40}并在同一位置显示我的自定义标记。 - Szabolcs
通常是2D图形。不过,现在想起来,通常使用的是FrameTicks而不是普通的轴线(我认为带边框的绘图通常比带坐标轴的绘图更好看)。 - Eli Lansey
此外,我强烈推荐使用CustomTicks包来更好地控制各种Ticks - Eli Lansey
显示剩余6条评论

2

如果aRowbRow中相邻元素的差值是恒定的,你可以像下面这样操作:

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];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接