我有一个大小为 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 手册规定“这里没有定义使用哪个顶点”,这使得它成为一个有点不稳定的解决方案,依赖于它出现使用我想要的点。