我想知道是否有办法在 \addplot 参数中过滤数据点。我有一个数据集(参见下面的 MWE),其值对应于三个条件(C)之一。我希望能够使用 pgfplots 读取完整的数据集,使用三个单独的 \addplot 命令(每个 C 值一个),每个命令都会过滤掉与该 C 值不对应的线,用单独的标记绘制每个条件等。这可能吗?
我已经看过skip coords between index
and x filter
/filter point
选项,但由于这些是函数的参数axis
(因此会改变整个情节),所以它们似乎并没有达到我想要的效果。
这是一个显示我想要实现的目标的 MWE:
\documentclass{standalone}
\usepackage{pgfplots}
\usepackage{filecontents}
\begin{filecontents}
C P1 P2 P3 sigP3
1 1.12E-4 0.06189 0.1865 0.0080
1 6.03E-3 0.00000 0.2517 0.0046
1 2.64E-2 0.00000 0.2247 0.0165
2 6.49E-5 0.00000 0.1906 0.0043
2 1.27E-5 0.00296 0.2120 0.0039
2 3.34E-4 0.00865 0.1709 0.0050
3 1.59E-2 0.01857 0.1596 0.0216
3 7.10E-4 0.01857 0.2547 0.0316
3 3.23E-5 0.00526 0.1557 0.0051
3 2.33E-4 0.01857 0.2008 0.0136
3 5.80E-4 0.01857 0.2389 0.0172
\end{filecontents}
\begin{document}
\begin{tikzpicture}
\pgfplotsset{legend cell align=right,legend style={font=\footnotesize,legend pos=outer north east}};
\begin{semilogxaxis}[
enlargelimits=false,axis on top,
width=12cm,height=8cm,
xlabel={$\Pi_1$},
ylabel={$\Pi_3$},
ymin=0.1,ymax=0.35,
xmin=1E-5,xmax=1E-1,
]
%% PLOT ONLY IF C = 1
\addplot+[only marks,error bars/.cd,y dir=both,y explicit] coordinates {
(1.12E-4,0.1865) +- (0,0.0080)
(6.03E-3,0.2517) +- (0,0.0046)
(2.64E-2,0.2247) +- (0,0.0165)
};
\addlegendentry{Cond. 1}
%% PLOT ONLY IF C = 2
\addplot+[only marks,error bars/.cd,y dir=both,y explicit] coordinates {
(6.49E-5,0.1906) +- (0,0.0043)
(1.27E-5,0.2120) +- (0,0.0039)
(3.34E-4,0.1709) +- (0,0.0050)
};
\addlegendentry{Cond. 2}
%% PLOT ONLY IF C = 3
\addplot+[only marks,error bars/.cd,y dir=both,y explicit] coordinates {
(1.59E-2,0.1596) +- (0,0.0216)
(7.10E-4,0.2547) +- (0,0.0316)
(3.23E-5,0.1557) +- (0,0.0051)
(2.33E-4,0.2008) +- (0,0.0136)
(5.80E-4,0.2389) +- (0,0.0172)
};
\addlegendentry{Cond. 3}
\end{semilogxaxis}
\end{tikzpicture}
\end{document}
答案1
您可以使用restrict expr to domain
:
\begin{filecontents*}{mydata.dat}
C P1 P2 P3 sigP3
1 1.12E-4 0.06189 0.1865 0.0080
1 6.03E-3 0.00000 0.2517 0.0046
1 2.64E-2 0.00000 0.2247 0.0165
2 6.49E-5 0.00000 0.1906 0.0043
2 1.27E-5 0.00296 0.2120 0.0039
2 3.34E-4 0.00865 0.1709 0.0050
3 1.59E-2 0.01857 0.1596 0.0216
3 7.10E-4 0.01857 0.2547 0.0316
3 3.23E-5 0.00526 0.1557 0.0051
3 2.33E-4 0.01857 0.2008 0.0136
3 5.80E-4 0.01857 0.2389 0.0172
\end{filecontents*}
\documentclass[margin=10pt]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.12}
\begin{document}
\begin{tikzpicture}
\pgfplotsset{
legend cell align=right,
legend style={font=\footnotesize,legend pos=outer north east}}
\begin{semilogxaxis}[
enlargelimits=false,axis on top,
width=12cm,height=8cm,
xlabel={$\Pi_1$},
ylabel={$\Pi_3$},
ymin=0.1,ymax=0.35,
xmin=1E-5,xmax=1E-1,
log basis x=10,
]
\addplot+[only marks,error bars/.cd,y dir=both,y explicit]
table[x=P1,y=P3,y error=sigP3,
restrict expr to domain={\thisrow{C}}{1:1}
]{mydata.dat};
\addlegendentry{Cond. 1}
\addplot+[only marks,error bars/.cd,y dir=both,y explicit]
table[x=P1,y=P3,y error=sigP3,
restrict expr to domain={\thisrow{C}}{2:2}
]{mydata.dat};
\addlegendentry{Cond. 2}
\addplot+[only marks,error bars/.cd,y dir=both,y explicit]
table[x=P1,y=P3,y error=sigP3,
restrict expr to domain={\thisrow{C}}{3:3}
]{mydata.dat};
\addlegendentry{Cond. 3}
\end{semilogxaxis}
\end{tikzpicture}
\end{document}
或者\pgfplotsinvokeforeach
\documentclass[margin=10pt]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.12}
\begin{document}
\begin{tikzpicture}
\pgfplotsset{
legend cell align=right,
legend style={font=\footnotesize,legend pos=outer north east}}
\begin{semilogxaxis}[
enlargelimits=false,axis on top,
width=12cm,height=8cm,
xlabel={$\Pi_1$},
ylabel={$\Pi_3$},
ymin=0.1,ymax=0.35,
xmin=1E-5,xmax=1E-1,
log basis x=10,
]
\pgfplotsinvokeforeach{1,2,3}{
\addplot+[only marks,error bars/.cd,y dir=both,y explicit]
table[x=P1,y=P3,y error=sigP3,
restrict expr to domain={\thisrow{C}}{#1:#1}
]{mydata.dat};
\addlegendentry{Cond. #1};
}
\end{semilogxaxis}
\end{tikzpicture}
\end{document}