我尝试使用 latex 中的 tikz/pgfplots 创建热图,但得到的是空图。我使用与 GNUplot 中相同的命令,即
plot 'heat-data.txt' matrix with image;
在 GNUplot 中,这将产生所需的图像 其中“heat-data.txt”文件包含 z 坐标。
6 5 4 3 1 0
3 2 2 0 0 1
0 0 0 0 1 0
0 0 0 0 2 3
0 0 1 1 1 0
0 1 0 1 1 0
因为我想在报告中生成数据集的热图,所以我想以与报告其余部分相同的样式来执行此操作,因此使用 Tikz/Pgfplots。我试过
\addplot3[raw gnuplot]
gnuplot{
set view map;
plot 'heat-data.txt' matrix with image};
并尝试过
\addplot3[raw gnuplot,surf,shader=flat]gnuplot{
plot 'heat-data.txt' matrix with image;
};
梅威瑟:
\documentclass[tikz, crop]{standalone}
\usepackage{tikz}
\usepackage{pgfplots}
\pgfplotsset{compat=newest}
\pgfplotsset{plot coordinates/math parser=false}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
colorbar right,
colormap/viridis,
view={0}{90}
]
%\addplot3[raw gnuplot]gnuplot{
%plot 'heat-data.txt' matrix with image;
%};
\addplot3[raw gnuplot,surf,shader=flat]gnuplot{
plot 'heat-data.txt' matrix with image;
};
\end{axis}
\end{tikzpicture}
\end{document}
答案1
我对这方面没有太多经验gnuplot
。我能提供的是将您的数据转换为可以用普通矩阵图绘制的内容。
\documentclass[border=3.14mm,tikz]{standalone}
\usepackage{filecontents}
\begin{filecontents*}{heat-data.txt}
6 5 4 3 1 0
3 2 2 0 0 1
0 0 0 0 1 0
0 0 0 0 2 3
0 0 1 1 1 0
0 1 0 1 1 0
\end{filecontents*}
\usepackage{pgfplots}
\usetikzlibrary{pgfplots.colormaps}
\pgfplotsset{compat=1.16}
\usepackage{pgfplotstable}
\newcommand*{\ReadOutElement}[4]{%
\pgfplotstablegetelem{#2}{[index]#3}\of{#1}%
\let#4\pgfplotsretval
}
\begin{document}
\pgfplotstableread[header=false]{heat-data.txt}\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}
\begin{axis}[colorbar]
\addplot [
matrix plot,
point meta=explicit,
] table [meta=color,col sep=comma] \strangetable;
\end{axis}
\end{tikzpicture}
\end{document}