![创建一个新的 pgfplotstable,它是另一个 pgfplotstable 的子集](https://linux22.com/image/300053/%E5%88%9B%E5%BB%BA%E4%B8%80%E4%B8%AA%E6%96%B0%E7%9A%84%20pgfplotstable%EF%BC%8C%E5%AE%83%E6%98%AF%E5%8F%A6%E4%B8%80%E4%B8%AA%20pgfplotstable%20%E7%9A%84%E5%AD%90%E9%9B%86.png)
我正在使用 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}