我有\pgfplotstable
一个像这样的数据(从文件加载):
\pgfplotstableread{
s f
0.0 95.9638
0.2380665 160.565
0.511 190.435
0.705 270.435
1.0 455.9638
}\data
我需要生成\pgfplotstable
重新排列的行和列\data
:
\pgfplotstableread{
s f
1.0 270.435
0.705 190.435
0.511 160.565
0.2380665 95.9638
0.0 <95.9638 or any other value>
}\customdata
行按相反顺序排列,并且第二列向上移动 1 个元素。
请问有什么建议吗?
答案1
您可以使用内置方法来反转顺序并创建包含移位值的新列,从而使此操作更简单一些:
\documentclass{article}
\usepackage{pgfplotstable}
\usepackage{pgfplots}
\begin{document}
\pgfplotstableread{
s f
0.0 95.9638
0.2380665 160.565
0.511 190.435
0.705 270.435
1.0 455.9638
}\originaldata
\pgfplotstablegetcolumnnamebyindex{1}\of{\originaldata}\to{\secondcolumnname}
\pgfplotstablesort[sort cmp=float >]{\data}{\originaldata}
\pgfplotstableset{
create on use/shifted/.style={
create col/expr={\nextrow{\secondcolumnname}*1}}
}
\pgfplotstabletypeset{\originaldata}\hspace*{1cm}
\pgfplotstabletypeset[columns={[index]0,shifted},
columns/shifted/.style={column name=\secondcolumnname}]\data
\begin{tikzpicture}
\begin{axis}
\addplot table {\originaldata};
\addplot table [y=shifted] {\data};
\end{axis}
\end{tikzpicture}
\end{document}
答案2
我做到了!
\pgfplotstablegetcolumnnamebyindex{0}\of{\data}\to{\firstcolumnname}
\pgfplotstablegetcolumnnamebyindex{1}\of{\data}\to{\secondcolumnname}
\pgfplotstablegetrowsof{\data}
\pgfmathsetmacro\ymax{\pgfmathresult - 1}
\pgfplotstablevertcat{\customdata}{\data};
\pgfplotstablemodifyeachcolumnelement\firstcolumnname\of\customdata\as\cell{
\pgfmathsetmacro\newrow{\ymax - \pgfplotstablerow}
\pgfplotstablegetelem{\newrow}{\firstcolumnname}\of\data
\edef\cell{\pgfplotsretval}
}
\pgfplotstablemodifyeachcolumnelement\secondcolumnname\of\customdata\as\cell{
\ifnum \pgfplotstablerow < \ymax
\pgfmathsetmacro\filaant{\ymax - \pgfplotstablerow - 1}
\pgfplotstablegetelem{\newrow}{\secondcolumnname}\of\data
\edef\cell{\pgfplotsretval}
\fi
}