使用 pgfplots,如何排列数据矩阵以绘制曲面图,以便矩阵中的每个单元格都绘制为正方形?

使用 pgfplots,如何排列数据矩阵以绘制曲面图,以便矩阵中的每个单元格都绘制为正方形?

我有一个大小为 MxN 的矩阵,我想从上方直接绘制一个表面图,以便将矩阵中的每个单元格绘制为正方形。所有 pgfplots 着色器都无法真正满足我的要求,因为它们绘制的是正方形之间矩阵的单元格(即,3x3 矩阵在绘制时最终为 2x2 单元格)。希望这个例子能更清楚地说明这一点:

\documentclass{article}

\usepackage{fullpage}
\usepackage{tikz}
\usepackage{pgfplots}
\usepackage{pgfplotstable}

\pgfplotstableread{
        0 0 0
        0 1 1
        0 2 2

        1 0 3
        1 1 4
        1 2 5

        2 0 6
        2 1 7
        2 2 8
}\data

\begin{document}
\foreach \shader in {interp, flat, flat corner} {
\begin{tikzpicture}
\begin{axis}[
        title={\texttt{\shader}},
        title style={
                at={(0.5, 1.5)},
                anchor=north,
        },
        width=.3\linewidth,
        view={0}{90},
        colormap/hot2,
        colorbar horizontal,
        colorbar style={
                at={(0.5, 1.02)},
                anchor=south,
                xticklabel pos=upper,
        },
]
\addplot3 [surf, shader=\shader] table {\data};
\end{axis}
\end{tikzpicture}
}
\end{document}

在此处输入图片描述

我该如何安排我的数据以便矩阵中的每个单元格在输出中绘制为单独的单元格?

编辑:输入问题后我意识到答案很简单,所以我就自己回答吧。

答案1

使用matrix plot*PGFPlots v1.13 的功能应该可以满足您的要求(请参阅手册第 164 页第 4.6.12 节)。

\documentclass[border=2mm]{standalone}
\usepackage{tikz}
\usepackage{pgfplots}
    \pgfplotsset{
        compat=1.13,
    }
\begin{document}
    \begin{tikzpicture}
        \begin{axis}[
            axis on top,
            xmin=0,
            xmax=2,
            ymin=0,
            ymax=2,
            enlargelimits={abs=0.5},
            point meta=explicit,
            colormap/viridis,
            colorbar,
        ]
            \addplot [
                matrix plot*,
            ] table [meta index=2] {
                0 0 0
                0 1 1
                0 2 2

                1 0 3
                1 1 4
                1 2 5

                2 0 6
                2 1 7
                2 2 8
            };
        \end{axis}
    \end{tikzpicture}
\end{document}

该图显示了上述代码的结果

答案2

查看flat corner问题中的图,很明显,一种解决方案是使用flat corner并简单地向表中添加一个额外的虚拟行和一个额外的虚拟列。它们的实际值不会影响图,因为flat corner只使用点的值在原始矩阵内。

然而,我仍然对了解其他解决方案感兴趣,因为 pgfplots 手册规定“这里没有定义使用哪个顶点”,这使得它成为一个有点不稳定的解决方案,依赖于它出现使用我想要的点。

相关内容