pgfplots,使用“将 expr 限制到域”时忽略绘图选项

pgfplots,使用“将 expr 限制到域”时忽略绘图选项

这是我在这里的第一篇帖子。我想使用 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,当坐标被丢弃时,绘图会中断。

下面是一个稍微简单的例子来解释这些键是如何工作的。如果不应用任何过滤器,图可能如下所示:

如果你只想使用C1 处的坐标,则可以使用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}

相关内容