使用 pgfplot 在外部数据文件中查找极值

使用 pgfplot 在外部数据文件中查找极值

基本上,我在伪 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}

相关内容