![按序列的第 i 个值进行归一化](https://linux22.com/image/380758/%E6%8C%89%E5%BA%8F%E5%88%97%E7%9A%84%E7%AC%AC%20i%20%E4%B8%AA%E5%80%BC%E8%BF%9B%E8%A1%8C%E5%BD%92%E4%B8%80%E5%8C%96.png)
我有一个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}