pgfplots:使用索引绘制表中的数据子集

pgfplots:使用索引绘制表中的数据子集

我有一个简单的 .txt 文件,其中包含 2 列(x 和 y 坐标)。使用 pgfplots,可以轻松绘制 x 与 y 的关系(即,第一列的所有元素与第二列的所有元素的关系),但如何使用索引绘制 x 的子集与 y 的子集的关系?

这是我想做的一个例子,写在矩阵代码:

x=(1:1:10).';
y=x.^2;

T=table(x,y);
writetable(T,'data.txt');

figure
hold on;
plot(x,y,'k');                       % <-- easy
plot(x(1:3:10),y(1:3:10),'r');       % <-- how to do this?
plot([x(1) x(10)],[y(1) y(10)],'b'); % <-- how to do this?
xlabel('x');
ylabel('y');

上述Matlab代码生成的图如下:

在此处输入图片描述

上述 Matlab 代码生成的 data.txt 文件包含以下内容:

x,y
1,1
2,4
3,9
4,16
5,25
6,36
7,49
8,64
9,81
10,100

最小工作示例pgf图

\begin{tikzpicture}

\begin{axis}[
    width=5cm,
    height=5cm,
    xlabel={$x$},
    ylabel={$y$},
    grid=both,
]

\addplot[line width=1pt, black]
table [x=x, y=y, col sep=comma] 
{data.txt};
    
\end{axis}

\end{tikzpicture}

答案1

您可以使用filter

\documentclass[border=10pt]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=newest}

\begin{filecontents}{data.txt}
x,y 
1,1 
2,4 
3,9 
4,16
5,25 
6,36 
7,49 
8,64 
9,81 
10,100
\end{filecontents}

\begin{document}
\begin{tikzpicture}

\begin{axis}[
    %width=5cm,
    %height=5cm,
    xlabel={$x$},
    ylabel={$y$},
    grid=both,
]

\addplot[line width=1pt, black] table [x=x, y=y, col sep=comma] {data.txt};

\addplot[line width=1pt, red, 
    x filter/.expression={(mod(x - 1, 3) == 0 ? \pgfmathresult : NaN)}
] table [x=x, y=y, col sep=comma] {data.txt};

\addplot[line width=1pt, blue, 
    x filter/.expression={(x == 1 || x == 10 ? \pgfmathresult : NaN)}
] table [x=x, y=y, col sep=comma] {data.txt};

\end{axis}

\end{tikzpicture}
\end{document}

在此处输入图片描述

如果您喜欢保留 Matlab 的冒号符号,您可以创建自定义样式:

\documentclass[border=10pt]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=newest}

\begin{filecontents}{data.txt}
x,y 
1,1 
2,4 
3,9 
4,16
5,25 
6,36 
7,49 
8,64 
9,81 
10,100
\end{filecontents}

\begin{document}
\begin{tikzpicture}

\tikzset{
    colon notation/.style args={#1(#2:#3:#4)}{
        /pgfplots/#1 filter/.expression={(mod(#1 - #2, #3) == 0 && #1 <= #4 ? \pgfmathresult : NaN)}
    }
}

\begin{axis}[
    %width=5cm,
    %height=5cm,
    xlabel={$x$},
    ylabel={$y$},
    grid=both,
]

\addplot[line width=1pt, black] table [x=x, y=y, col sep=comma] {data.txt};

\addplot[line width=1pt, red, colon notation={x(1:3:10)}] table [x=x, y=y, col sep=comma] {data.txt};

\end{axis}

\end{tikzpicture}
\end{document}

在此处输入图片描述


如果需要根据元素的索引而不是元素的值来过滤元素,则可以使用\coordindex以 0 开头的元素:

\documentclass[border=10pt]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=newest}

\begin{filecontents}{data.txt}
x,y 
1,1 
2,4 
3,9 
4,16
5,25 
6,36 
7,49 
8,64 
9,81 
10,100
\end{filecontents}

\begin{document}
\begin{tikzpicture}

\begin{axis}[
    %width=5cm,
    %height=5cm,
    xlabel={$x$},
    ylabel={$y$},
    grid=both,
]

\addplot[line width=1pt, black] table [x=x, y=y, col sep=comma] {data.txt};

\addplot[line width=1pt, red, 
    x filter/.expression={(mod(\coordindex, 3) == 0 ? \pgfmathresult : NaN)}
] table [x=x, y=y, col sep=comma] {data.txt};

\addplot[line width=1pt, blue, 
    x filter/.expression={(\coordindex == 0 || \coordindex == 9 ? \pgfmathresult : NaN)}
] table [x=x, y=y, col sep=comma] {data.txt};

\end{axis}

\end{tikzpicture}
\end{document}

相关内容