这是我在这里的第一篇帖子。我想使用 pgfplots(非常棒的软件/代码)来显示实验中的一些数据(A、B、C)。在某些图表中,我想绘制 x=A 和 y=B,但只针对特定 C 范围内的一些点。
可以使用
restrict expr to domain
在一种情况下,如果我使用此功能,所有绘图选项都会被忽略。请参阅示例 (myData2.csv)。当我使用略有不同的数据(myData 和 myData3)时,它会起作用。我确实尽了一切努力,但我没有解开这个谜团。
在下面的例子中,我有三个图,它们都具有相同的选项。但只有在两种情况下,这些选项才被认为是正确的。
我的错误在哪里?
\documentclass{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=newest}
\usepackage{filecontents}
\begin{filecontents}{myData.csv}
A;B;C
0.02;20;2
0.03;20;2
0.00;20;3
0.03;20;3
\end{filecontents}
\begin{filecontents}{myData2.csv}
A;B;C
0.02;1;40
0.02;2;40
0.02;3;40
0.02;4;40
0.02;5;40
0.01;0;40
0.01;1;40
0.3;2;40
0.3;3;40
0.01;4;40
0.01;5;40
\end{filecontents}
\begin{filecontents}{myData3.csv}
A;B;C
0.02;2;20
0.03;2;20
0.1;3;20
0.2;3;20
\end{filecontents}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
xlabel={xlabel},
ylabel={ylabel},
xmin=0,
xmax=0.3,
ymin=0,
ymax=100,
width =100mm,
height = 70mm,
]
\addplot
[
% Optionen
mark=*,
draw=red,
line width=1.5pt
]
table
[
x=A,
y=B,
col sep=semicolon,
row sep = newline,
restrict expr to domain={\thisrow{C}}{2.1:3.1},
] {myData.csv};
\addlegendentry{C = 3, file myData}
\addplot
[
% Optionen
mark=*,
draw=red,
line width=1.5pt
]
table
[
x=A,
y=C,
col sep=semicolon,
row sep = newline,
restrict expr to domain={\thisrow{B}}{2.1:3.1},
] {myData3.csv};
\addlegendentry{B = 3, file myData3}
\addplot
[
% Optionen
mark=*,
draw=red,
line width=0.5pt
]
table
[
x=A,
y=C,
col sep=semicolon,
row sep = newline,
restrict expr to domain={\thisrow{B}}{2.1:3.1},
] {myData2.csv};
\addlegendentry{B = 3, file myData2}
\end{axis}
\end{tikzpicture}
\end{document}
解决方案
\documentclass{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=newest}
\usepackage{filecontents}
\begin{filecontents}{myData2.csv}
A;B;C
0.0;3;40
0.0;2;40
0.1;3;40
0.1;2;40
0.2;3;40
0.2;2;40
0.3;3;40
0.3;2;40
0.4;3;40
0.4;2;40
\end{filecontents}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
xlabel={xlabel},
ylabel={ylabel},
xmin=0,
xmax=0.3,
ymin=0,
ymax=100,
width =100mm,
height = 70mm,
]
\addplot
[
% Optionen
mark=*,
draw=blue,
line width=0.5pt
]
table
[
x=A,
y=C,
col sep=semicolon,
row sep = newline,
restrict expr to domain={\thisrow{B}}{2.1:3.1},
unbounded coords=discard % <-- important
] {myData2.csv};
\addlegendentry{correct (points connected, using \texttt{unbounded coords=discard})}
\addplot
[
% Optionen
mark=o,
draw=red,
line width=1.5pt
]
table
[
x=A,
y=C,
col sep=semicolon,
row sep = newline,
restrict expr to domain={\thisrow{B}}{2.1:3.1},
%unbounded coords=discard % <-- important
] {myData2.csv};
\addlegendentry{not correct (points not connected)}
\end{axis}
\end{tikzpicture}
\end{document}
答案1
正如 percusse 和 user14649 指出的那样,问题源于过滤后只剩下两个坐标,并且没有绘制连接线。
要解决此问题,您应该设置键unbounded coords=discard
,这将处理绘图,就好像过滤掉的坐标从未出现过一样。默认行为是jump
,当坐标被丢弃时,绘图会中断。
下面是一个稍微简单的例子来解释这些键是如何工作的。如果不应用任何过滤器,图可能如下所示:
如果你只想使用C
1 处的坐标,则可以使用restrict expr to domain={\thisrow{C}}{0.5:1.5}
,从而
为了获得连通图,您还必须设置unbounded coords=discard
:
如果您设置了restrict expr to domain*={\thisrow{C}}{0.5:1.5}
(带有星号),则所有 x 坐标的值C
大于 1.5 的都会被设置为 1.5:
\documentclass[border=5mm]{standalone}
\usepackage{pgfplots}
\usepackage{filecontents}
\begin{filecontents}{myData2.csv}
A;B;C
1;10;1
2;20;1
3;30;2
4;20;1
5;10;2
\end{filecontents}
\begin{document}
\begin{tikzpicture}
\begin{axis}[xmin=1,xmax=5,ymin=0]
\addplot[
mark=*,
red,
line width=0.5pt
]
table
[
x=A,
y=B,
col sep=semicolon
] {myData2.csv};
\end{axis}
\end{tikzpicture}
\end{document}