目前我有以下 MWE:
\documentclass[a4paper]{standalone}
\usepackage{pgfplots}
\usepgfplotslibrary{external,colormaps,groupplots,statistics}
\pgfplotsset{compat=1.8}
\usepackage{tikz}
\usetikzlibrary{arrows,shapes,positioning}
\begin{document}
\begin{tikzpicture}
\begin{groupplot}[
boxplot/draw direction=y,
ylabel={segmentation time (secs)},
xtick={1,2},
width=6cm,
height=8cm,
boxplot/box extend=0.5,
xticklabels={visualization disabled,visualization enabled},
x tick label style={
text width=2.5cm,
align=center
},
group style={
group size=2 by 2,
horizontal sep=2cm,vertical sep=2cm
},
]
\nextgroupplot[title=dataset 1]
\addplot+[boxplot]
table[row sep=\\,y index=0] {
data\\
60\\
516\\
710\\
503\\
1253\\
};
\addplot+[boxplot]
table[row sep=\\,y index=0] {
data\\
759\\
419\\
309\\
883\\
299\\
};
\nextgroupplot[title=dataset 2]
\addplot+[boxplot]
table[row sep=\\,y index=0] {
data\\
516\\
480\\
1356\\
200\\
736\\
};
\addplot+[boxplot]
table[row sep=\\,y index=0] {
data\\
684\\
340\\
700\\
325\\
377\\
};
\nextgroupplot[title=dataset 3]
\addplot+[boxplot]
table[row sep=\\,y index=0] {
data\\
956\\
320\\
811\\
330\\
381\\
};
\addplot+[boxplot]
table[row sep=\\,y index=0] {
data\\
280\\
749\\
392\\
870\\
488\\
};
\nextgroupplot[title=dataset 4]
\addplot+[boxplot]
table[row sep=\\,y index=0] {
data\\
658\\
579\\
891\\
545\\
558\\
};
\addplot+[boxplot]
table[row sep=\\,y index=0] {
data\\
514\\
630\\
416\\
559\\
462\\
};
\end{groupplot}
\end{tikzpicture}
\end{document}
这给了我以下输出(我猜是可用的):
不过,我希望将它们全部放在一张图片中。有点像在箱线图中对箱子进行分组的方式。因此,更准确地描述它:
- X 刻度表示数据集 1 至 4
- 每个 x 刻度上都有两个箱形图,一个表示禁用,一个表示启用
- 为了清晰起见,每对箱线图应该在视觉上分组在一起(也许将它们相互移动?)
我已经搜索了 PGFPlots 手册和网络,但到目前为止还没有找到任何有用的方法。有人能帮帮我吗?
答案1
箱线图始终放置在用 指定的坐标处boxplot/draw position
。默认值为1+\plotnumofactualtype
,但可以自定义为其他值。
就您而言,您只需将所有图放到一个轴上,并boxplot/draw position
为每个图分配一个单独的图即可。
这里有一种方法,它定义了一个数学表达式,它看起来接近您的需要(注释在代码中):
\documentclass[a4paper]{standalone}
\usepackage{pgfplots}
\usepgfplotslibrary{statistics}
\pgfplotsset{compat=1.8}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
boxplot/draw direction=y,
ylabel={segmentation time (secs)},
height=8cm,
boxplot={
%
% Idea:
% place the
% group 1 at 0.3333 and 0.6666
% group 2 at 1.3333 and 1.6666
% group 3 at 2.3333 and 2.6666
% ...
% in a formular:
draw position={1/3 + floor(\plotnumofactualtype/2) + 1/3*mod(\plotnumofactualtype,2)},
%
% that means the box extend must be at most 0.33333 :
box extend=0.3,
},
% ... it also means that 1 unit in x controls the width:
x=2cm,
% ... and it means that we should describe intervals:
xtick={0,1,2,...,10},
x tick label as interval,
xticklabels={%
{Data set 1\\{\tiny off/on}},%
{Data set 2\\{\tiny off/on}},%
{Data set 3\\{\tiny off/on}},%
{Data set 4\\{\tiny off/on}},%
},
x tick label style={
text width=2.5cm,
align=center
},
]
\addplot
table[row sep=\\,y index=0] {
data\\
60\\
516\\
710\\
503\\
1253\\
};
\addplot
table[row sep=\\,y index=0] {
data\\
759\\
419\\
309\\
883\\
299\\
};
\addplot
table[row sep=\\,y index=0] {
data\\
516\\
480\\
1356\\
200\\
736\\
};
\addplot
table[row sep=\\,y index=0] {
data\\
684\\
340\\
700\\
325\\
377\\
};
\addplot
table[row sep=\\,y index=0] {
data\\
956\\
320\\
811\\
330\\
381\\
};
\addplot
table[row sep=\\,y index=0] {
data\\
280\\
749\\
392\\
870\\
488\\
};
\addplot
table[row sep=\\,y index=0] {
data\\
658\\
579\\
891\\
545\\
558\\
};
\addplot
table[row sep=\\,y index=0] {
data\\
514\\
630\\
416\\
559\\
462\\
};
\end{axis}
\end{tikzpicture}
\end{document}
您可能需要采用cycle list
合适的线条样式。