在 foreach 循环中命名 pgfplotstable 列

在 foreach 循环中命名 pgfplotstable 列

我最近偶然发现pgfplotstable以及处理表格信息和创建新列的能力。为了磨练我的技能,我尝试创建一个脚本,该脚本可以计算不同平滑因子的时间序列的指数平滑预测。

计算和绘图似乎工作得很好,但我无法为表中的每个新列赋予一个新的列名,如果我使用 打印出表格,该列名就会出现\pgfplotstabletypeset

总体而言,分配似乎有效(即,列名从其默认值更改,但是,当我打印表格时,所有列最终都具有相同的列名。附件是我的精简案例:

    \documentclass{article}
    \usepackage{amsmath}
    \usepackage{pgfplots}
    \pgfplotsset{compat=newest,width=10cm,legend style={font=\footnotesize}}
    \usepackage{pgfplotstable}
    \begin{document}

    % read observed time-series
    \pgfplotstableread{
    x   y
    1   4.237485502
    2   5.593257216
    3   6.101509413
    4   5.328536597
    5   6.353556834
    6   5.84178478
    7   5.271878886
    8   6.952802431
    9   4.579257831
    10  7.742456136
    }\mytable

    % get first x-Value as forecast value for period 1
    \pgfplotstablegetelem{0}{y}\of{\mytable}
    \pgfmathsetmacro{\finit}{\pgfplotsretval}
    % iterate through different levels of \alpha
    \pgfplotsforeachungrouped \alph in {10,20,...,50}{
        \pgfplotstablecreatecol[
            expr accum={ % in the first row, do not calculate forecast as linear combination of actual demand and forecast of last period, but just use initial value
                \ifnum\pgfplotstablerow=0
                    \finit
                \else
                    (1-\alph/100)*\pgfmathaccuma+\alph/100*\prevrow{y}
                \fi
            }{\finit}
        ]{\alph}{\mytable}
        % set name for column and display style
        \pgfplotstableset{columns/\expandafter\alph/.style={column name={$ES_{\alph}$},dec sep align={c}}}
    }
    % print forecasted values
    \begin{table}
            \center
            \pgfplotstabletypeset[%
                    header=has colnames
            ]{\mytable}
        \caption{Results of the Exponential Smoothing Excercise (Table)}
    \end{table}

    % plot observed and forecasted timeseries
    \begin{figure}
        \center
        \begin{tikzpicture}
            \begin{axis}[
                    legend cell align=left,legend pos=north west,
                    xlabel=$t$,ylabel=$Y$
                ]
                \addplot[only marks] table[y=y,x=x]{\mytable};
                \addlegendentry{Original Data};
                \pgfplotsinvokeforeach {10,20,...,50}{
                    \addplot +[mark=none,thin] table[y=#1,x=x]{\mytable};
                    \addlegendentry{$\alpha=\pgfmathprintnumber{#1}\%$};
                }
            \end{axis}
        \end{tikzpicture}
        \caption{Results of the Exponential Smoothing Excercise (Plot)}
    \end{figure}

    \end{document}

顺便问一下:您知道我如何才能10,20,...,50仅定义一次 alpha 值(在我的代码中)并重复使用它吗?我知道这是一个不同的问题,但我的第一次尝试没有成功,这些对您来说可能是唾手可得的成果 ;-)

答案1

为了消除此处的威胁:建议的解决方案敲击完美运行!

以下是分配列名的代码行的重要部分\pgfplotsforeachungrouped

\pgfplotstableset{columns/\alph/.estyle={column name={$ES_{\alph}$}}}

相关内容