通过 y=(y-min(Y))/(max(Y)-min(Y)) 对 Y 轴进行标准化

通过 y=(y-min(Y))/(max(Y)-min(Y)) 对 Y 轴进行标准化

我是新手pgfplots,希望您能帮我解答这个问题。基本上,我需要从仅包含数据列表(一列)的文件中读取 y 值,通过 y=(y-min(Y))/(max(Y)-min(Y)) 对每个值进行归一化,其中 max(Y) 是列表中的最大值,min(Y) 是列表中的最小值,然后绘制它们。例如,如果我有 {1,2,3,4},那么在绘图上,y 的值将是 {0, 1/3, 2/3,1}。

我使用\addplot table [x expr=\coordindex, y index = 0] {filename};在图表上绘制 x 和 y。y 的规范化表达式是什么?是否有现有函数可以执行此操作?如果没有,我们可以提取其中的 max(Y) 和 min(Y) 吗pgfplots

答案1

正如下面的评论中已经讨论过的,当您拥有大量数据时,在外部预处理数据是最好的解决方案。

这里有一个pgfplots借助的解决方案pgfplotstable

\documentclass[border=2pt]{standalone}
\usepackage{pgfplots}
\usepackage{pgfplotstable}      % needed to sort the data table
    % store data in TXT file
    \begin{filecontents}{data.txt}
        y
        2
        1
        4
        3
    \end{filecontents}
\begin{document}
    \begin{tikzpicture}
            % store sorted data in `\data'
            \pgfplotstablesort[sort key=y]{\data}{data.txt}
            % store the first and last value of the (sorted) `\data' table
            % which correspond to the min and max values
            \pgfplotstablegetelem{0}{y}\of{\data}
                \pgfmathsetmacro{\Min}{\pgfplotsretval}
            \pgfplotstablegetrowsof{\data}
                    \pgfmathsetmacro{\Max}{\pgfplotsretval-1}
                \pgfplotstablegetelem{\Max}{y}\of{\data}
                    \pgfmathsetmacro{\Max}{\pgfplotsretval}
        \begin{axis}[
            only marks,
        ]
            \addplot
                table [
                    x expr=\coordindex,
                    y expr=(\thisrow{y}-\Min)/(\Max-\Min),
                ] {data.txt};
        \end{axis}
    \end{tikzpicture}
\end{document}

该图显示了上述代码的结果

相关内容