我有一个简单的 .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}