如何将矩阵数据(2d 函数)从 matlab 导入到 pgfplots?

如何将矩阵数据(2d 函数)从 matlab 导入到 pgfplots?

这个问题出现在多条曲线的光谱色彩图,但由于它引起了普遍的兴趣,因此我在这里添加了一个单独的问题和我的答案。

假设您有一个需要转换为的 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,则需要先转置XY和 ,Z然后再将它们导出到pgfplots

在此处输入图片描述

相关内容