我有两个数据文件,一个包含测量值 (data.dat),另一个包含模型数据,该模型数据描述了 data.dat 中的值预期如何表现 (model.dat)。data.dat 中的值会不时地添加。
model.dat 中的值比 data.dat 中的测量值跨度大得多。目前,我通过设置适当的 xmax 值“手动”限制 x 轴以适应 data.dat 值。但是,如果 x 轴范围可以根据 data.dat 值自动计算,那就太好了
- 忽略轴范围计算的 model.dat 值或
- 告诉 pgfplots 根据某个图或数据文件计算轴范围。
pgfplots 中有这样的功能吗?
评论:从文件或表格绘图时为不同的数据集定义不同的范围可能松散相关或可能是解决方法。
\begin{filecontents}{model.dat}
x y
0 1
1 0.8
2 0.75
3 0.72
4 0.7
5 0.69
\end{filecontents}
\begin{filecontents}{data.dat}
x y
0 0.99
1 0.81
2 0.74
3 0.70
\end{filecontents}
\documentclass{minimal}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
\begin{axis}[xmax=4]
\addplot table[x=x,y=y] {data.dat};
\addplot table[x=x,y=y] {model.dat};
\end{axis}
\end{tikzpicture}
\end{document}
答案1
这个答案定义了两个可以在这里(及以后)使用的函数:maxvalueofcolumnintable
和minvalueofcolumnintable
。例如,
\pgfmathsetmacro{\mymax}{maxvalueofcolumnintable("x","data.dat")}
确定表中 x 列的最大值"data.dat"
,并将其存储在宏中\mymax
。然后可以使用它来定义xmax
。
\begin{filecontents}{model.dat}
x y
0 1
1 0.8
2 0.75
3 0.72
4 0.7
5 0.69
\end{filecontents}
\begin{filecontents}{data.dat}
x y
0 0.99
1 0.81
2 0.74
3 0.70
\end{filecontents}
\documentclass[tikz, margin=3mm]{standalone}
\usepackage{pgfplots}
\usepackage{pgfplotstable}
\pgfplotsset{compat=1.16}
\pgfmathdeclarefunction{maxvalueofcolumnintable}{2}{%
\begingroup
\pgfplotstablegetrowsof{#2}%
\pgfmathtruncatemacro{\numrows}{\pgfplotsretval-1}%
\pgfplotstablegetelem{0}{#1}\of{#2}%
\edef\pgfmathresult{\pgfplotsretval}%
\pgfplotsforeachungrouped\XX in{1,...,\numrows}{%
\pgfplotstablegetelem{\XX}{#1}\of{#2}%
\begingroup
\pgfkeys{/pgf/fpu,/pgf/fpu/output format=fixed}%
\pgfmathparse{max(\pgfmathresult,\pgfplotsretval)}%
\pgfmathsmuggle\pgfmathresult\endgroup
}%
\pgfmathsmuggle\pgfmathresult\endgroup
}
\pgfmathdeclarefunction{minvalueofcolumnintable}{2}{%
\begingroup
\pgfplotstablegetrowsof{#2}%
\pgfmathtruncatemacro{\numrows}{\pgfplotsretval-1}%
\pgfplotstablegetelem{0}{#1}\of{#2}%
\edef\pgfmathresult{\pgfplotsretval}%
\pgfplotsforeachungrouped\XX in{1,...,\numrows}{%
\pgfplotstablegetelem{\XX}{#1}\of{#2}%
\begingroup
\pgfkeys{/pgf/fpu,/pgf/fpu/output format=fixed}%
\pgfmathparse{min(\pgfmathresult,\pgfplotsretval)}%
\pgfmathsmuggle\pgfmathresult\endgroup
}%
\pgfmathsmuggle\pgfmathresult\endgroup
}
\begin{document}
\begin{tikzpicture}
\pgfmathsetmacro{\mymin}{minvalueofcolumnintable("x","data.dat")}
\pgfmathsetmacro{\mymax}{maxvalueofcolumnintable("x","data.dat")}
% just a test
% \pgfmathsetmacro{\mytestmax}{maxvalueofcolumnintable("y","model.dat")}
% \typeout{\mymax,\mytestmax}
\begin{axis}[xmax=\mymax]
\addplot table[x=x,y=y] {data.dat};
\addplot table[x=x,y=y] {model.dat};
\end{axis}
\end{tikzpicture}
\end{document}
如果需要,这些函数可以轻松地推广到平均值、标准差等等。
答案2
该解决方案覆盖两个轴环境,均使用相同的比例(仅从第一个轴确定)。
\begin{filecontents}{model.dat}
x y
0 1
1 0.8
2 0.75
3 0.72
4 0.7
5 0.69
\end{filecontents}
\begin{filecontents}{data.dat}
x y
0 0.99
1 0.81
2 0.74
3 0.70
\end{filecontents}
\documentclass{standalone}
\usepackage{pgfplots}
\makeatletter
\newcommand\getxycoords[2]{% #1=global macro for x, #2=global macro for y
\pgfgetlastxy{#1}{#2}%
\pgfmathparse{((#1/\pgfplots@x@veclength)+\pgfplots@data@scale@trafo@SHIFT@x)/10^\pgfplots@data@scale@trafo@EXPONENT@x}%
\global\let #1=\pgfmathresult
\pgfmathparse{((#2/\pgfplots@y@veclength)+\pgfplots@data@scale@trafo@SHIFT@y)/10^\pgfplots@data@scale@trafo@EXPONENT@y}
\global\let #2=\pgfmathresult}
\makeatother
\newcommand{\xmin}{}% reserve gobal names
\newcommand{\xmax}{}
\newcommand{\ymin}{}
\newcommand{\ymax}{}
\begin{document}
\begin{tikzpicture}
\begin{axis}[scale only axis]
\addplot table[x=x,y=y] {data.dat};
\pgfplotsextra{%
\path (rel axis cs: 0,0);% lower left corner
\getxycoords{\xmin}{\ymin}%
\path (rel axis cs: 1,1);% upper right corner
\getxycoords{\xmax}{\ymax}}%
\end{axis}
\node[below right] at (current bounding box.south west) {xmin=\xmin, ymin=\ymin, xmax=\xmax, ymax=\ymax};
\begin{axis}[scale only axis, axis x line=none, axis y line=none,
xmin=\xmin, ymin=\ymin, xmax=\xmax, ymax=\ymax]
\addplot coordinates {};% do nothing
\addplot table[x=x,y=y] {model.dat};
\end{axis}
\end{tikzpicture}
\end{document}