如何使用 pgfplot 正确排列条形图的组图?

如何使用 pgfplot 正确排列条形图的组图?

我在 Latex 中使用 pgfplot 进行绘图。我想实现这种图表

在此处输入图片描述

这是目前我能做的最好的事情了。更新 #4],

在此处输入图片描述

这是我的乳胶代码[更新 #4]:

\begin{tikzpicture}
\begin{groupplot}[
       group name=plot,
       group size=2 by 1,
       xlabels at=edge bottom,
       ylabels at=edge left,
       horizontal sep=-10pt,
       vertical sep=0pt,
      /pgf/bar width=12pt},
legend columns=-1,
legend  style={at={(6.5 ,3.6)}},
legend entries={{\color{black}{\footnotesize Win}},{\color{black}{\footnotesize Lose}}},
legend to name=CombinedLegendBar,
ybar legend,
ylabel={Participant},
major x tick style=transparent,
ybar= 1*\pgflinewidth,
ymax=6,
width=6cm,
x axis line style={opacity=0},
x tick label style={rotate=0, anchor=center},
symbolic x coords={{Task 1}, {Task 2}, {Task 3}},
xticklabel style={yshift=-2mm,xshift={ifthenelse(\ticknum==2,0,0)}}, 
xtick=data,
ymajorgrids=true,
grid style=dashed,
nodes near coords,
scale only axis,
point meta=explicit symbolic
]

%modifier
\nextgroupplot[
     xlabel=Multiplayer,
     width=0.2\textwidth,
     height=0.2\textwidth,
     enlarge x limits = 0.5]
\addplot[draw=green,thick,fill=green,fill opacity=0.6] coordinates {
  (Task 1,4)[\textcolor{blue!60}{4}]
  (Task 2,4)[\textcolor{blue!60}{4}]
  (Task 3,4)[\textcolor{blue!60}{4}]};

\addplot[draw=orange,thick,fill=orange,fill opacity=0.6] coordinates {
  (Task 1,2)[\textcolor{orange!100}{2}]
  (Task 2,1)[\textcolor{orange!100}{1}]
  (Task 3,3)[\textcolor{orange!100}{3}]};
  
\nextgroupplot[
     xlabel=Single Player,
     yticklabels={,,},
     width=0.13\textwidth,
     height=0.2\textwidth,
     enlarge x limits = 0.5]
\addplot[draw=green,thick,fill=green,fill opacity=0.6] coordinates {
  (Task 1,4)[\textcolor{blue!60}{4}]
  (Task 2,4)[\textcolor{blue!60}{4}]};

\addplot[draw=orange,thick,fill=orange,fill opacity=0.6] coordinates {
  (Task 1,2)[\textcolor{orange!100}{2}]
  (Task 2,1)[\textcolor{orange!100}{1}]};
\end{groupplot}

\end{tikzpicture}
\ref{CombinedLegendBar}

我现在的问题是:

  1. 我的图看起来很乱,每个组图之间的空间也不好看。我的解决方案:为每个组图 (\nextgroupplot) 设置宽度、高度和放大 x 限制,而不是在全局设置 (组图设置) 中设置。不要忘记“仅缩放轴”以帮助正确修改宽度和高度。

  2. 虚线在两个组图之间重叠。所以我注意到网格的刻度在结尾和开头都是实线,这就是为什么当它与另一条虚线重叠时,看起来不太好看。

  3. 图表标题。我尝试用它\node来放置我的标题(所有子图的标题)。但效果不佳。

  4. 我可以将图例放在图表内部上方的空白处吗? 完成!使用图例设置并用 \ref 调用它

    有什么建议吗?

答案1

  1. 您或许可以进行一些计算来获得有用的宽度,见下面的示例。不确定它们是否“正确”,但结果看起来不错。
  2. ytick pos=left对于第一个组图,ytick pos=right对于第二个组图。
  3. 不知道您说的“无法正常工作”是什么意思,在有用的位置添加节点可以正常工作。但是,当然,如果您想要编号标题,请使用\caption
  4. 您真的需要legend to name这些吗?似乎只需添加legend columns=-1就足够了(假设图表的高度足够)。

还有一些其他的修改,比如制​​作自定义的cycle list,并设置样式,nodes near coords而不是到处使用\textcolor

也就是说,只用一个就可以做到这一点axis,请参见tikzpicture下面代码中的第二个。

\documentclass[tikz,border=5mm]{standalone}
\usepackage{pgfplots}
\usepgfplotslibrary{groupplots}
\pgfplotsset{compat=1.16}
\begin{document}
\begin{tikzpicture}

\pgfmathsetmacro{\NPlotsFirstAx}{3}
\pgfmathsetmacro{\NPlotsSecondAx}{2}
\pgfmathsetmacro{\SumPlots}{\NPlotsFirstAx+\NPlotsSecondAx+2}
\pgfmathsetmacro{\WdFirst}{\NPlotsFirstAx/\SumPlots}
\pgfmathsetmacro{\WdSecond}{\NPlotsSecondAx/\SumPlots}
\begin{groupplot}[
       group style={
       group name=plot,
       group size=2 by 1,
       xlabels at=edge bottom,
       ylabels at=edge left,
       horizontal sep=0pt,
       vertical sep=0pt,
       /pgf/bar width=10pt},
ylabel={Participant},
major x tick style=transparent,
ybar= \pgflinewidth,
ymax=6,
%width=6cm,
x axis line style={opacity=0},
x tick label style={rotate=0, anchor=center},
%symbolic x coords={{Task 1}, {Task 2}, {Task 3}},
xticklabel style={yshift=-2mm,xshift={ifthenelse(\ticknum==2,0,0)}}, 
xtick=data,
xticklabels={Task 1, Task 2, Task 3},
ymajorgrids=true,
grid style=dotted,
nodes near coords,
scale only axis,
point meta=explicit symbolic,
enlarge x limits = {abs=1},
cycle list={
  draw=blue,thick,fill=blue,fill opacity=0.6,nodes near coords style={blue!60}\\
  draw=orange,thick,fill=orange,fill opacity=0.6,nodes near coords style={orange}\\
  },
legend columns=-1,
height=0.3\textwidth,
]

%modifier
\nextgroupplot[
     xlabel=Color,
     width=\WdFirst\textwidth,
     ytick pos=left
      ]
\addplot  coordinates {
  (1,4)[4]
  (2,4)[4]
  (3,4)[4]};

\addplot  coordinates {
  (1,2)[2]
  (2,1)[1]
  (3,3)[3]};

\nextgroupplot[
     xlabel=Brightness,
     yticklabels={},
     width=\WdSecond\textwidth,
     ytick pos=right
     ]
\addplot coordinates {
  (1,4)[4]
  (2,4)[4]};

\addplot coordinates {
  (1,2)[2]
  (2,1)[1]};

\legend{Win, Lose}
\end{groupplot}


\node [above] at (current bounding box.north) {Title of entire thing};

\end{tikzpicture}

\begin{tikzpicture}
\begin{axis}[
  xticklabels={Task 1, Task 2, Task 3, Task 1, Task 2},
  xtick=data,
  ylabel={Participant},
  major x tick style=transparent,
  ybar= \pgflinewidth,
  ymax=6,
  x axis line style={opacity=0},
  x tick label style={rotate=0, anchor=center},
  xticklabel style={yshift=-2mm}, 
  xtick=data,
  ymajorgrids=true,
  grid style=dotted,
  nodes near coords,
  scale only axis,
  point meta=explicit symbolic,
  enlarge x limits = {abs=1},
  cycle list={
    draw=blue,thick,fill=blue,fill opacity=0.6,nodes near coords style={blue!60}\\
    draw=orange,thick,fill=orange,fill opacity=0.6,nodes near coords style={orange}\\
  },
  legend columns=-1,
  legend pos=north east,
  height=0.3\textwidth,
  width=0.7\textwidth,
  extra x ticks={2, 5.5},
  extra x tick labels={Color,Brightness},
  extra x tick style={yshift=-15pt},
  title={Title of entire thing}
]

\addplot  coordinates {
  (1,4)[4]
  (2,4)[4]
  (3,4)[4]
  (5,4)[4]
  (6,4)[4]};


\addplot  coordinates {
  (1,2)[2]
  (2,1)[1]
  (3,3)[3]
  (5,2)[2]
  (6,1)[1]};

\legend{Win,Lose}
\end{axis}
\end{tikzpicture}
\end{document}

在此处输入图片描述

答案2

最后结果 :

在此处输入图片描述

解决我的问题:

  1. 我的情节看起来很乱,每个情节之间的空间groupplot也不好看。我的解决方案:设置widthheightenlarge x limits为每个组图(\nextgroupplot)而不是全局设置(组图设置)。不要忘记scale only axis帮助正确修改宽度和高度。

    \nextgroupplot[
        xlabel=Single Player,
        yticklabels={,,},
        width=0.13\textwidth,
        height=0.2\textwidth,
        enlarge x limits = 0.5]
    
  2. 虚线在两个组图之间重叠。所以我注意到网格的刻度在结尾和开头都是实线,这就是为什么当它与另一条虚线重叠时,看起来不太好看。我将每个组图的尺寸调整到尽可能小。实际上现在看起来并不那么糟糕。

  3. 图表标题。我尝试使用 \node 来放置我的标题(所有子图的标题)。但效果不佳。包装 tikzpicture\begin{figure}然后\end{figure}我可以使用我的标题\caption

  4. 我可以将图例放在图表内部上方的空白处吗?完成!!使用图例设置并用 调用它\ref{CombinedLegendBar}

    图例设置:

    legend columns=-1,
    legend  style={at={(6.5 ,3.5)}, draw=none, column sep=0.2cm},
    legend entries={{\small \color{black}{Succeed}},{\small \color{black}{Fail}}},
    legend to name=CombinedLegendBar,
    ybar legend,
    footnotesize
    

相关内容