如何从表格制作“冷/热”图形?

如何从表格制作“冷/热”图形?

我有一张 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 的数据中有一个多余的元素,当人们想要写另一个答案时,必须将其删除。

在此处输入图片描述

相关内容