创建一个新的 pgfplotstable,它是另一个 pgfplotstable 的子集

创建一个新的 pgfplotstable,它是另一个 pgfplotstable 的子集

我正在使用 pgfplots 绘制数据集,我想为数据子集添加局部回归线。我可以计算回归线并绘制子集,但 pgfplots 仍使用完整数据集来计算回归线。

我还可以打印一个仅包含我想要绘制回归线的数据的表格。我想将这个子集放在一个新表中,并在该表上估计回归线,但我不知道该怎么做。或者,我想直接限制 pgfplots 仅使用子集来估计回归。

下面是一个 MWE。我首先打印我想要估计回归线的数据子集(本例中只有两个观测值)。然后我绘制我想要的图形,但其中回归线显然是使用完整数据集估计的。

\documentclass{article}

\usepackage{pgfplots}
    \pgfplotsset{compat=1.11}
\usepackage{pgfplotstable}

\begin{document}

\pgfplotstableread{
    X   Y
    9   8.5555553
    27.5    9.6833334
    45.5    9.015625
    63.5    8.0161295
    81.5    8.6268654
    100 9.9777775
    118.5   10.681818
    136.5   9.5500002
    154.5   10.106061
    172.5   9.8783779
    191 9.8529415
    209.5   10.940298
    227.5   10.075758
    246 10.089552
    263.5   10.526316
    282 11.934066
    300.5   11.708333
    318.5   11.807693
    336.5   11.791667
    355 12.036586
}\datapoints

\pgfplotstabletypeset[
  row predicate/.code={
    \pgfplotstablegetelem{#1}{X}\of{\datapoints}
    \pgfmathparse{\pgfplotsretval>210 && \pgfplotsretval<250}
    \ifnum \pgfmathresult = 1
      \else \pgfplotstableuserowfalse
    \fi}
]{\datapoints}

\begin{figure}
    \begin{tikzpicture}
        \begin{axis}
            \addplot[only marks] table {\datapoints};
            \addplot[restrict x to domain=210:250] table[y={create col/linear regression={y=Y}}]{\datapoints};
        \end{axis}
    \end{tikzpicture}
\end{figure}

\end{document}

答案1

我自己找到了一个答案,尽管我对此并不十分满意。可以将受限数据集写入磁盘,然后将其读入新表,并在新表上运行回归。我在下面附上了一个 MWE。我更希望这可以在不写入磁盘的情况下完成,但这个解决方案至少是可行的。

\documentclass{article}

\usepackage{pgfplots}
    \pgfplotsset{compat=1.11}
\usepackage{pgfplotstable}

\begin{document}

\pgfplotstableread{
    X   Y
    9   8.5555553
    27.5    9.6833334
    45.5    9.015625
    63.5    8.0161295
    81.5    8.6268654
    100 9.9777775
    118.5   10.681818
    136.5   9.5500002
    154.5   10.106061
    172.5   9.8783779
    191 9.8529415
    209.5   10.940298
    227.5   10.075758
    246 10.089552
    263.5   10.526316
    282 11.934066
    300.5   11.708333
    318.5   11.807693
    336.5   11.791667
    355 12.036586
}\datapoints


\pgfplotstablesave[row predicate/.code={
    \pgfplotstablegetelem{#1}{X}\of{\datapoints}
    \pgfmathparse{\pgfplotsretval>210 && \pgfplotsretval<250}
    \ifnum \pgfmathresult = 1
      \else \pgfplotstableuserowfalse
    \fi}]{\datapoints}{temp.dat}

\pgfplotstableread{temp.dat}\datapointstrimmed

\begin{figure}
    \begin{tikzpicture}
        \begin{axis}
            \addplot[only marks] table {\datapoints};
            \addplot[restrict x to domain=210:250] table[x=X,y={create col/linear regression={y=Y}}]{\datapointstrimmed};
        \end{axis}
    \end{tikzpicture}
\end{figure}

\end{document}

相关内容