按序列的第 i 个值进行归一化

按序列的第 i 个值进行归一化

我有一个data.csv看起来像(请注意没有标题)的图表 0.0, 0.8, 0.5 0.5, 0.4, 0.7 1.0, 1.0, 0.4 ,我想使用它来绘图pgfplots。我希望​​图表根据第一行的值重新缩放第二列(索引 = 1)和第三列(索引 = 2)中的值,以便这些值显示 0.0, 1.0, 1.0 0.5, 0.5, 1.4 1.0, 1.25, 0.8 在图表上。目前,我执行此操作的方式是y expr = \thisrowno{1}/0.8在 y 轴上绘制第二列时进行设置。但是,csv 文件经常更改,并且必须对此进行硬编码,成本很高。我也无法控制 csv 生成,因此在数据生成时重新缩放是不可行的。我可以在绘图之前轻松地用其他语言处理它,但我想知道这是否可以在内完成pgfplots,并且可能使用任意行(第一行和最后一行显然是最有价值的)

梅威瑟:

\documentclass{article}
\usepackage{tikz}
\usepackage{pgfplots}
\usepackage{filecontents}

\begin{filecontents}{data.csv}
0.0, 0.8, 0.5
0.5, 0.4, 0.7
1.0, 1.0, 0.4
\end{filecontents}

\begin{document}
\begin{figure}
\centering
\begin{tikzpicture}
\begin{axis}
\addplot table [
       x index = {0}, y index = {1},
       y expr  = \thisrowno{1}/0.8,
       col sep = comma,
      ] {data.csv};
\end{axis}
\end{tikzpicture}
\end{figure}
\end{document}

答案1

你可以预先读取这些值然后使用它们。此代码基于这个答案那个答案。这些答案也在这里使用, 我认为。

\documentclass{article}
\usepackage{tikz}
\usepackage{pgfplots}
\usepackage{filecontents}

\begin{filecontents}{data.csv}
0.0, 0.8, 0.5
0.5, 0.4, 0.7
1.0, 1.0, 0.4
\end{filecontents}
\newcommand*{\ReadOutElement}[4]{%
    \pgfplotstablegetelem{#2}{[index]#3}\of{#1}%
    \let#4\pgfplotsretval
}
\newcommand{\Normalization}[2]{\ReadOutElement{\datatable}{0}{#1}{#2}}
\newcommand{\NormalizationFromLastRow}[2]{
\pgfplotstablegetrowsof{\datatable}
\pgfmathtruncatemacro{\rownumber}{\pgfplotsretval-1}
\ReadOutElement{\datatable}{\rownumber}{#1}{#2}}
\begin{document}
\pgfplotstableread[header=false,col sep=comma]{data.csv}\datatable
\Normalization{1}{\mynorm}
\NormalizationFromLastRow{1}{\mylastnorm}
\typeout{\mylastnorm}
\begin{figure}
\centering
\begin{tikzpicture}
\begin{axis}
\addplot table [
       x index = {0}, y index = {1},
       y expr  = \thisrowno{1}/\mynorm,
       col sep = comma,
      ] {data.csv};
\end{axis}
\end{tikzpicture}
\end{figure}
\end{document}

相关内容