我绘制了示例 xyz 矩阵的轮廓。
\documentclass[border=5pt]{standalone}
\usepackage{pgfplots}
\usepackage{filecontents}
\pgfplotsset{compat=newest}
\usepgfplotslibrary{colormaps}
\pgfplotsset{/pgfplots/colormap={colmap}{
rgb255=(0,0,102)
rgb255=(0,0,255)
rgb255=(0,255,255)
rgb255=(255,255,255)
rgb255=(255,255,0)
rgb255=(255,0,0)
rgb255=(102,0,0)
}
}
\begin{filecontents}{test.txt}
1000 1000 1.29403
1001 1000 -0.95088
1002 1000 -0.30126
1003 1000 -0.40809
1004 1000 -2.75751
1005 1000 0.09494
1006 1000 0.3524
1007 1000 -0.22458
1008 1000 0.07528
1009 1000 -0.18389
1010 1000 -1.22863
1000 1005 0.37092
1001 1005 0.82494
1002 1005 -0.38305
1003 1005 0.55881
1004 1005 -0.86485
1005 1005 -1.22789
1006 1005 -2.14137
1007 1005 0.17896
1008 1005 -0.99818
1009 1005 -0.4235
1010 1005 1.06234
1000 1010 0.0401
1001 1010 1.29255
1002 1010 -0.9097
1003 1010 1.51249
1004 1010 -0.38255
1005 1010 0.99011
1006 1010 -0.192
1007 1010 0.01934
1008 1010 0.17867
1009 1010 0.69037
1010 1010 -0.8169
\end{filecontents}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
view={0}{90},
colorbar,
]
\addplot3[
surf,
shader=interp,
mesh/rows=3,
mesh/cols=11,
mesh/check=false,
]
table[
x index=0,
y index=1,
z index=2,
] {test.txt};
\end{axis}
\end{tikzpicture}
\end{document}
现在,我的目标是围绕零创建一个统一的色彩图。因此,可以为相应的负值和正值定义两个单独的色彩图,但我想到的最简单的方法是找到所有 z 值的绝对值的最大值,并将其用作point meta min
色彩point meta max
图。
由于我还不太熟悉 LaTeX 中的编码,也许有人可以帮助我解决我的问题。
编辑:我看了pdfplotstable 文档并开始计算z值的绝对值。
\documentclass{article}
\usepackage{pgfplots}
\usepackage{pgfplotstable}
\pgfplotsset{compat=newest}
\usepackage{filecontents}
\begin{filecontents}[overwrite]{test.txt}
1000 1000 1.29403
1001 1000 -0.95088
1002 1000 -0.30126
1003 1000 -0.40809
1004 1000 -2.75751
1005 1000 0.09494
1006 1000 0.3524
1007 1000 -0.22458
1008 1000 0.07528
1009 1000 -0.18389
1010 1000 -1.22863
1000 1005 0.37092
1001 1005 0.82494
1002 1005 -0.38305
1003 1005 0.55881
1004 1005 -0.86485
1005 1005 -1.22789
1006 1005 -2.14137
1007 1005 0.17896
1008 1005 -0.99818
1009 1005 -0.4235
1010 1005 1.06234
1000 1010 0.0401
1001 1010 1.29255
1002 1010 -0.9097
1003 1010 1.51249
1004 1010 -0.38255
1005 1010 0.99011
1006 1010 -0.192
1007 1010 0.01934
1008 1010 0.17867
1009 1010 0.69037
1010 1010 -0.8169
\end{filecontents}
\pgfplotstableread{test.txt}{\testdata}
\begin{document}
\pgfplotstableset{
create on use/abs/.style={
create col/expr={abs(\thisrowno{2})}},
}
\pgfplotstabletypeset[
columns={abs},
]
{\testdata}
\end{document}
现在我需要计算这个表的最大值并保存该值。但是我又卡在这里了,因为我不知道如何“保存”结果表以供进一步计算。
所以我的新问题是:如何使结果表可用于其他计算?
答案1
好吧,我会尝试一下。首先,我通过添加标题修改了您的输入文件(以便更好地理解发生了什么)。
\begin{filecontents}[overwrite]{test.txt}
x y z
1000 1000 1.29403
...
\end{filecontents}
然后我深入研究了文档pgfplotstable
并使用了搜索功能。所以最后:这对你有用吗?
\documentclass[tikz]{standalone}
\usepackage{pgfplots}
\usepackage{pgfplotstable}
\pgfplotsset{compat=newest}
\usepackage{filecontents}
\newcommand{\findMinMax}[4]{%
% Input arguments:
% 1: Filename
% 2: Name of column to search
% Output argument:
% 3: Minimum value
% 4: Maximum value
\pgfplotstableread[col sep=space]{#1}\intable%
%
\pgfplotstablegetrowsof{\intable}
\pgfmathsetmacro{\nRowsTab}{\pgfplotsretval-1}
\pgfplotstablegetcolsof{\intable}
\pgfmathsetmacro{\nCols}{\pgfplotsretval-1}
%
\pgfplotstablegetelem{0}{#2}\of{\intable}%
\pgfmathsetmacro{\maxval}{\pgfplotsretval}%
\pgfmathsetmacro{\minval}{\pgfplotsretval}%
%
\pgfplotsinvokeforeach {1,...,\nRowsTab}{%
\pgfplotstablegetelem{##1}{#2}\of{\intable}%
%
\pgfmathsetmacro{\currVal}{\pgfplotsretval}%
%
\ifdim \currVal pt > \maxval pt%
\pgfmathsetmacro{\maxval}{\pgfplotsretval}%
\fi%
%
\ifdim \currVal pt < \minval pt%
\pgfmathsetmacro{\minval}{\pgfplotsretval}%
\fi%
}%
\let#3\minval%
\let#4\maxval%
}
\begin{document}
\pgfmathsetmacro{\pMax}{0}
\pgfmathsetmacro{\pMin}{0}
\findMinMax{test.txt}{z}{\pMin}{\pMax}
\pgfmathsetmacro{\pLim}{abs(\pMin) > abs(\pMax) ? abs(\pMin) : abs(\pMax)} % 1st EDIT
\begin{tikzpicture}
\begin{axis}[
view={0}{90},
xlabel={\pMax},% only to show an output
ylabel={\pMin},
colorbar,
colorbar style={
point meta max=\pLim, % 1st EDIT
point meta min=-\pLim,
},
colormap name=viridis, % nope, i won't use Jet - nobody should
]
\addplot3[surf, shader=interp, mesh/rows=3, mesh/cols=11, mesh/check=false,
point meta=\thisrow{z},
]
table[x=x, y=y, z=z] {test.txt};
\end{axis}
\end{tikzpicture}
\end{document}