如何将多个箱线图以组的形式组合成一个图形?

如何将多个箱线图以组的形式组合成一个图形?

目前我有以下 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合适的线条样式。

相关内容