基本上,我在伪 3D 中绘制了许多堆叠在一起的曲线,以显示瞬态行为。我需要每个 x 轴都位于同一位置,因此我使用了一个ymin
可选的环境ymax
条目axis
。到目前为止,我使用了一个手动更改的变量,但我想知道是否有办法从几个外部表(这里是 18 个)中找到最小值和最大值,并在我的情况下将其用作变量。
答案1
您可以使用\pgfplotstablevertcat{<newmacro>}{<filename>}
来连接数据表,然后使用\pgfplotstablesort{<newmacro>}{<table macro>}
对连接表进行排序,并通过使用 提取排序表的第一个元素来获取最大(或最小)值\pgfplotstablegetelem{<row>}{<col>}\of{<table macro>}
。
下面是两个脚本,\findmax
它们\findmin
采用逗号分隔的文件名列表,连接这些文件中的表并返回最大值/最小值。
\documentclass{article}
\usepackage{pgfplots}
\usepackage{pgfplotstable}
\usepackage{filecontents}
\newcommand{\findmax}[1]{
\pgfplotsforeachungrouped \table in {#1} {%
\pgfplotstablevertcat{\concatenated}{\table}%
}%
\pgfplotstablesort[sort key={1},sort cmp={float >}]{\sorted}{\concatenated}%
\pgfplotstablegetelem{0}{1}\of{\sorted}%
\let\ymax=\pgfplotsretval%
}
\newcommand{\findmin}[1]{
\pgfplotsforeachungrouped \table in {#1} {%
\pgfplotstablevertcat{\concatenated}{\table}%
}%
\pgfplotstablesort[sort key={1},sort cmp={float <}]{\sorted}{\concatenated}%
\pgfplotstablegetelem{0}{1}\of{\sorted}%
\let\ymin=\pgfplotsretval%
}
\begin{filecontents}{dataA.dat}
1 5
2 3
3 6
4 4
5 0
6 1
\end{filecontents}
\begin{filecontents}{dataB.dat}
1 2
2 3
3 2
4 2
5 3
6 2
\end{filecontents}
\begin{filecontents}{dataC.dat}
1 -2
2 0
3 -1
4 -1
5 -2
6 0
\end{filecontents}
\begin{document}
\findmax{dataA.dat,dataB.dat,dataC.dat}
\findmin{dataA.dat,dataB.dat,dataC.dat}
\pgfplotstabletypeset{dataA.dat} \hfill \pgfplotstabletypeset{dataB.dat} \hfill \pgfplotstabletypeset{dataC.dat} \hspace{4cm}\\[0.5cm]
\noindent
Maximum value: \ymax\\
Minimum value: \ymin\\[0.5cm]
\pgfplotsset{ymin=\ymin,ymax=\ymax,width=3cm,scale only axis}
\begin{tikzpicture}
\begin{axis}[at={(0,0)}]
\addplot table {dataA.dat};
\end{axis}
\begin{axis}[at={(4cm,0)}]
\addplot table {dataB.dat};
\end{axis}
\begin{axis}[at={(8cm,0)}]
\addplot table {dataC.dat};
\end{axis}
\end{tikzpicture}
\end{document}