我有一个大小为(i x j)的矩阵mat
,其中包含实验数据。
如果我使用ListPlot3D[mat]
,我可以在三维图中可视化它。
我还有两个数组,一个大小为i(aRow
),另一个大小为j(aCol
),它们是从我的实验中确定的。
如何用aRow
和aCol
替换ListPlot3D[mat]
显示的默认x和y轴?
我有一个大小为(i x j)的矩阵mat
,其中包含实验数据。
如果我使用ListPlot3D[mat]
,我可以在三维图中可视化它。
我还有两个数组,一个大小为i(aRow
),另一个大小为j(aCol
),它们是从我的实验中确定的。
如何用aRow
和aCol
替换ListPlot3D[mat]
显示的默认x和y轴?
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}]
在二维中绘制它。默认情况下,ListDensityPlot
具有 Frame
(而不是 Axes
),因此我们使用 FrameTicks
。
ListDensityPlot[mat,
FrameTicks -> {
Transpose[{Range@Length[aRow], aRow}][[;; ;; 10]],
Transpose[{Range@Length[aCol], aCol}][[;; ;; 10]],
None, None},
Mesh -> Automatic]
更新
如果您不需要任意刻度,只需要线性间隔刻度标记的不同范围,则可以使用DataRange
选项,如下所示:
ListPlot3D[mat, DataRange -> {{0, 1}, {0, 1}}]
如果您仍需要以{x,y,z}
格式获取数据(因为坐标不是均匀分布的),则可以使用以下方法构建:
Join @@ MapThread[Append, {Outer[List, aRow, aCol], mat}, 2]
如果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];
AbsoluteOptions[graphics, Ticks]
返回Automatic
)。我记得很久以前曾经尝试过这样做,但是失败了。您必须想出自己的算法来找到刻度密度。 - Szabolcs{10,20,30,40}
并在同一位置显示我的自定义标记。 - SzabolcsFrameTicks
而不是普通的轴线(我认为带边框的绘图通常比带坐标轴的绘图更好看)。 - Eli LanseyTicks
。 - Eli Lansey