这个问题出现在多条曲线的光谱色彩图,但由于它引起了普遍的兴趣,因此我在这里添加了一个单独的问题和我的答案。
假设您有一个需要转换为的 matlab 图形pgfplots
。该 matlab 图形包含一个二维函数f(x,y)
,通常以矩阵的形式显示。
假设它被给出为
[X,Y] = meshgrid( linspace(-1,1,3), linspace(4,5,5) );
Z = X + Y;
surf(X,Y,Z)
shading interp
使得
octave:7> Z
Z =
3.0000 4.0000 5.0000
3.2500 4.2500 5.2500
3.5000 4.5000 5.5000
3.7500 4.7500 5.7500
4.0000 5.0000 6.0000
结果是
我想在中重现这一点pgfplots
。为此,我将Z
矩阵保存为 ascii 并将其导入到\addplot3 table
语句中:
\documentclass{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.9}
\begin{document}
\begin{tikzpicture}
\begin{axis}
\addplot3[surf] table {
3.0000 4.0000 5.0000
3.2500 4.2500 5.2500
3.5000 4.5000 5.5000
3.7500 4.7500 5.7500
4.0000 5.0000 6.0000
};
\end{axis}
\end{tikzpicture}
\end{document}
这导致了意想不到的结果
我怎样才能重现我想要的表面图?
答案1
pgfplots
需要不同的输入格式,即表格形式
X Y Z
. . .
. . .
. . .
其中矩阵数据为序列化变成一条长流。它类似于 matlab 的matrix(:)
语法。
因此,您可以通过以下方式导出数据
data = [ X(:) Y(:) Z(:) ]
save -ascii P.dat data
% save P.dat data -ASCII
size(Z)
data =
-1.00000 4.00000 3.00000
-1.00000 4.25000 3.25000
-1.00000 4.50000 3.50000
-1.00000 4.75000 3.75000
-1.00000 5.00000 4.00000
0.00000 4.00000 4.00000
0.00000 4.25000 4.25000
0.00000 4.50000 4.50000
0.00000 4.75000 4.75000
0.00000 5.00000 5.00000
1.00000 4.00000 5.00000
1.00000 4.25000 5.25000
1.00000 4.50000 5.50000
1.00000 4.75000 5.75000
1.00000 5.00000 6.00000
ans =
5 3
并使用
\documentclass{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.9}
\begin{document}
\begin{tikzpicture}
\begin{axis}[colorbar,view={-60}{30}, colormap/jet,shader=interp]
\addplot3[surf,mesh/rows=5,mesh/ordering=y varies] table {
-1.00000000e+00 4.00000000e+00 3.00000000e+00
-1.00000000e+00 4.25000000e+00 3.25000000e+00
-1.00000000e+00 4.50000000e+00 3.50000000e+00
-1.00000000e+00 4.75000000e+00 3.75000000e+00
-1.00000000e+00 5.00000000e+00 4.00000000e+00
0.00000000e+00 4.00000000e+00 4.00000000e+00
0.00000000e+00 4.25000000e+00 4.25000000e+00
0.00000000e+00 4.50000000e+00 4.50000000e+00
0.00000000e+00 4.75000000e+00 4.75000000e+00
0.00000000e+00 5.00000000e+00 5.00000000e+00
1.00000000e+00 4.00000000e+00 5.00000000e+00
1.00000000e+00 4.25000000e+00 5.25000000e+00
1.00000000e+00 4.50000000e+00 5.50000000e+00
1.00000000e+00 4.75000000e+00 5.75000000e+00
1.00000000e+00 5.00000000e+00 6.00000000e+00
};
\end{axis}
\end{tikzpicture}
\end{document}
其中数据表是的内容P.dat
(也可以使用导入\addplot3[...] table {P.dat};
)。关键是我们需要说明pgfplots
如何读取文件:我们需要说明至少一个矩阵维度(mesh/rows=5
此处),我们需要说明它是如何线性化的(mesh/ordering=y varies
在我们的例子中,因为这就是矩阵通过线性化的方式data(:)
)。结果是
观点论证不够精确(我认为在这里它不太重要)。
为了完整起见(原始问题多条曲线的光谱色彩图是关于线图的),我还在这里展示了如何使用,patch type=line
以便将每条扫描线显示为具有单独颜色的线图:
\documentclass{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.9}
\begin{document}
\begin{tikzpicture}
\begin{axis}[colorbar,view={-60}{30}, colormap/jet,shader=interp]
\addplot3[
mesh,
mesh/rows=5,mesh/ordering=y varies,
patch type=line,
point meta=x,
]
table {
-1.00000000e+00 4.00000000e+00 3.00000000e+00
-1.00000000e+00 4.25000000e+00 3.25000000e+00
-1.00000000e+00 4.50000000e+00 3.50000000e+00
-1.00000000e+00 4.75000000e+00 3.75000000e+00
-1.00000000e+00 5.00000000e+00 4.00000000e+00
0.00000000e+00 4.00000000e+00 4.00000000e+00
0.00000000e+00 4.25000000e+00 4.25000000e+00
0.00000000e+00 4.50000000e+00 4.50000000e+00
0.00000000e+00 4.75000000e+00 4.75000000e+00
0.00000000e+00 5.00000000e+00 5.00000000e+00
1.00000000e+00 4.00000000e+00 5.00000000e+00
1.00000000e+00 4.25000000e+00 5.25000000e+00
1.00000000e+00 4.50000000e+00 5.50000000e+00
1.00000000e+00 4.75000000e+00 5.75000000e+00
1.00000000e+00 5.00000000e+00 6.00000000e+00
};
\end{axis}
\end{tikzpicture}
\end{document}
在这里,point meta
扮演着“颜色数据”的角色。在这种情况下,颜色数据来自 列x
:每条扫描线都有相同的颜色。如果要沿 扫描线y
,则需要先转置X
、Y
和 ,Z
然后再将它们导出到pgfplots
。