![如何从表格制作“冷/热”图形?](https://linux22.com/image/397173/%E5%A6%82%E4%BD%95%E4%BB%8E%E8%A1%A8%E6%A0%BC%E5%88%B6%E4%BD%9C%E2%80%9C%E5%86%B7%2F%E7%83%AD%E2%80%9D%E5%9B%BE%E5%BD%A2%EF%BC%9F.png)
我有一张 1200 行 x 900 列的表格,各行之间用分号(;)分隔
每个位置都是一个坐标 x,y。示例为 10 x 10
0;0;0;0;0;0;0;0;0;0
1;0;3;3;2;0;1;0;0;0
0;5;6;3;5;0;0;0;0;0
3;5;0;0;0;0;0;5;6;3
1;0;1;0;0;1;0;2;1;300
55;2;3;5;0;0;0;0;27;1
2;2;2;0;0;0;3;2;0;1;2
0;3;2;2;2;3;2;3;2;1;1
1;3;2;1;1;5;1;1;0;0;2
31;3;1;1;3;0;4;99;10;11
在这种情况下,第 1 行是“冷”(每列都是 0)。第 6 行有坐标“热”。每列的范围可以从 1 到 65000(在我的模拟中,最大值是 ~15000)。
我想到使用表面图...可以吗?
我以为我会得到类似下面的图表。
答案1
您可以读取数据并将其转换为 pgfplots 可以绘制的格式。
\documentclass[tikz,border=3.14mm]{standalone}
\usepackage{pgfplots}
\usetikzlibrary{pgfplots.colormaps}
\pgfplotsset{compat=1.16}
\usepackage{pgfplotstable}
\usepackage{filecontents}
\begin{filecontents*}{entries.dat}
0;0;0;0;0;0;0;0;0;0
1;0;3;3;2;0;1;0;0;0
0;5;6;3;5;0;0;0;0;0
3;5;0;0;0;0;0;5;6;3
1;0;1;0;0;1;0;2;1;300
55;2;3;5;0;0;0;0;27;1
2;2;2;0;0;0;3;2;0;1
0;3;2;2;2;3;2;3;2;1
1;3;2;1;1;5;1;1;0;0
31;3;1;1;3;0;4;99;10;11
\end{filecontents*}
\newcommand*{\ReadOutElement}[4]{%
\pgfplotstablegetelem{#2}{[index]#3}\of{#1}%
\let#4\pgfplotsretval
}
\begin{document}
\pgfplotstableread[header=false,col sep=semicolon]{entries.dat}\datatable
\pgfplotstablegetrowsof{\datatable}
\pgfmathtruncatemacro{\numrows}{\pgfplotsretval}
\pgfplotstablegetcolsof{\datatable}
\pgfmathtruncatemacro{\numcols}{\pgfplotsretval}
\typeout{\numcols,\numrows}
\xdef\LstX{}
\xdef\LstY{}
\xdef\LstC{}
\foreach \Y [evaluate=\Y as \PrevY using {int(\Y-1)},count=\nY] in {1,...,\numrows}
{\pgfmathtruncatemacro{\newY}{\numrows-\Y}
\foreach \X [evaluate=\X as \PrevX using {int(\X-1)},count=\nX] in {1,...,\numcols}
{
\ReadOutElement{\datatable}{\PrevY}{\PrevX}{\Current}
\pgfmathtruncatemacro{\nZ}{\nX+\nY}
\ifnum\nZ=2
\xdef\LstX{\PrevX}
\xdef\LstY{\PrevY}
\xdef\LstC{\Current}
\else
\xdef\LstX{\LstX,\PrevX}
\xdef\LstY{\LstY,\PrevY}
\xdef\LstC{\LstC,\Current}
\fi
}
}
\edef\temp{\noexpand\pgfplotstableset{
create on use/x/.style={create col/set list={\LstX}},
create on use/y/.style={create col/set list={\LstY}},
create on use/color/.style={create col/set list={\LstC}},}}
\temp
\pgfmathtruncatemacro{\strangenum}{\numrows*\numcols}
\pgfplotstablenew[columns={x,y,color}]{\strangenum}\strangetable
%\pgfplotstabletypeset[empty cells with={---}]\strangetable
\begin{tikzpicture}
\begin{axis}[]
\addplot3 [surf] table [meta=color,col sep=comma] \strangetable;
\end{axis}
\end{tikzpicture}
\end{document}
然而,呈现此类数据的通常方式是热图/矩阵图。
\documentclass[border=3.14mm,tikz]{standalone}
\usepackage{pgfplots}
\usetikzlibrary{pgfplots.colormaps}
\pgfplotsset{compat=1.16}
\usepackage{pgfplotstable}
\usepackage{filecontents}
\begin{filecontents*}{entries.dat}
0;0;0;0;0;0;0;0;0;0
1;0;3;3;2;0;1;0;0;0
0;5;6;3;5;0;0;0;0;0
3;5;0;0;0;0;0;5;6;3
1;0;1;0;0;1;0;2;1;300
55;2;3;5;0;0;0;0;27;1
2;2;2;0;0;0;3;2;0;1
0;3;2;2;2;3;2;3;2;1
1;3;2;1;1;5;1;1;0;0
31;3;1;1;3;0;4;99;10;11
\end{filecontents*}
\newcommand*{\ReadOutElement}[4]{%
\pgfplotstablegetelem{#2}{[index]#3}\of{#1}%
\let#4\pgfplotsretval
}
\begin{document}
\pgfplotstableread[header=false,col sep=semicolon]{entries.dat}\datatable
\pgfplotstablegetrowsof{\datatable}
\pgfmathtruncatemacro{\numrows}{\pgfplotsretval}
\pgfplotstablegetcolsof{\datatable}
\pgfmathtruncatemacro{\numcols}{\pgfplotsretval}
\xdef\LstX{}
\xdef\LstY{}
\xdef\LstC{}
\foreach \Y [evaluate=\Y as \PrevY using {int(\Y-1)},count=\nY] in {1,...,\numrows}
{\pgfmathtruncatemacro{\newY}{\numrows-\Y}
\foreach \X [evaluate=\X as \PrevX using {int(\X-1)},count=\nX] in {1,...,\numcols}
{
\ReadOutElement{\datatable}{\PrevY}{\PrevX}{\Current}
\pgfmathtruncatemacro{\nZ}{\nX+\nY}
\ifnum\nZ=2
\xdef\LstX{\PrevX}
\xdef\LstY{\PrevY}
\xdef\LstC{\Current}
\else
\xdef\LstX{\LstX,\PrevX}
\xdef\LstY{\LstY,\PrevY}
\xdef\LstC{\LstC,\Current}
\fi
}
}
\edef\temp{\noexpand\pgfplotstableset{
create on use/x/.style={create col/set list={\LstX}},
create on use/y/.style={create col/set list={\LstY}},
create on use/color/.style={create col/set list={\LstC}},}}
\temp
\pgfmathtruncatemacro{\strangenum}{\numrows*\numcols}
\pgfplotstablenew[columns={x,y,color}]{\strangenum}\strangetable
%\pgfplotstabletypeset[empty cells with={---}]\strangetable
\begin{tikzpicture}
% \pgfplotsset{%
% colormap={WhiteRedBlack}{%
% rgb255=(255,255,255)
% rgb255=(255,0,0)
% rgb255=(0,0,0)
% },
% }
\begin{axis}[%
point meta=explicit,
%
%colorbar sampled,
colorbar as palette,
colorbar style={samples=3},
%colormap name=WhiteRedBlack,
scale mode=scale uniformly,
]
\draw (axis description cs:0,0) -- (axis description cs:1,0);
\addplot [
matrix plot,
%mesh/cols=4,
point meta=explicit,
] table [meta=color,col sep=comma] \strangetable;
\end{axis}
\end{tikzpicture}
\end{document}
顺便说一句,第 7-9 行在 OP 的数据中有一个多余的元素,当人们想要写另一个答案时,必须将其删除。