我在 CSV 文件中有一些数据,我想用它们来创建多个箱线图。每个样本都有一个标识符“set”,表示属于某个集合,我希望每个集合都有一个箱线图。它尝试使用通用宏discard if not
,但在这种情况下似乎不起作用。
到目前为止
\documentclass[crop,tikz]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=newest}
\usepgfplotslibrary{statistics}
\usepackage{pgfplotstable}
% discard by row label
\pgfplotsset{
discard if not/.style 2 args={
y filter/.code={
\edef\tempa{\thisrow{#1}}
\edef\tempb{#2}
\ifx\tempa\tempb
\else
\def\pgfmathresult{inf}
\fi
}
}
}
\begin{filecontents*}{data.csv}
v,set
0.1,a
0.2,a
0.3,a
0.8,b
0.9,b
1.0,b
\end{filecontents*}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
boxplot/draw direction=y,
]
\addplot+[boxplot]
table [y=v, discard if not={set}{a}, col sep=comma]{data.csv};
\addplot+[boxplot]
table [y=v, discard if not={set}{b}, col sep=comma]{data.csv};
\end{axis}
\end{tikzpicture}
\end{document}
导致
有什么想法可以如何根据列选择样本吗?
答案1
您几乎已经完成了。但您需要使用(不幸的是,目前尚未记录的)/pgfplots/boxplot/data filter/.code
密钥。我如何知道这个密钥?
less /usr/local/texlive/2019/texmf-dist/tex/generic/pgfplots/libs/tikzlibrarypgfplots.statistics.code.tex
结果:
\documentclass[crop,tikz]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=newest}
\usepgfplotslibrary{statistics}
% discard by row label
\pgfplotsset{
discard if not/.style 2 args={
/pgfplots/boxplot/data filter/.code={
\edef\tempa{\thisrow{#1}}
\edef\tempb{#2}
\ifx\tempa\tempb
\else
\def\pgfmathresult{inf}
\fi
}
}
}
\begin{filecontents*}{data.csv}
v,set
0.1,a
0.2,a
0.3,a
0.8,b
0.9,b
1.0,b
\end{filecontents*}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
boxplot/draw direction=y,
]
\addplot+[boxplot]
table [y=v, discard if not={set}{a}, col sep=comma]{data.csv};
\addplot+[boxplot]
table [y=v, discard if not={set}{b}, col sep=comma]{data.csv};
\end{axis}
\end{tikzpicture}
\end{document}
我认为应该有人建议 pgfplots 的开发人员记录此密钥。如果您不想这样做,我很乐意这样做。