O último gráfico de um grupo de gráficos de barras deve ter duas colunas

O último gráfico de um grupo de gráficos de barras deve ter duas colunas

Estou tentando gerar um grupo de gráficos de barras com 3 figuras e concluí com sucesso e o resultado pode ser visto abaixo.

Problema: Quero os dois primeiros gráficos de barras (a e b) no mesmo estado, mas para o terceiro gráfico de barras ((c) perda Q e perda P), como posso incluir duas barras para cada rótulo no eixo X com uma legenda apenas para esse gráfico? Para reiterar, quero duas barras para 3-6, duas barras para 6-12 e duas barras para 12-24 com uma legenda exclusiva para o terceiro gráfico. Além disso, alguém pode me ajudar a reduzir o espaço entre os gráficos de barras (a,b,c)?

Saída:

insira a descrição da imagem aqui

Código de látex:

\documentclass[10pt,journal,compsoc,xcolor={dvipsnames}]{IEEEtran}
%[tikz]{standalone}
% If IEEEtran.cls has not been installed into the LaTeX system files,
% manually specify the path to it like:
% \documentclass[10pt,journal,compsoc]{../sty/IEEEtran}

%\usepackage{showframe}
%\renewcommand\ShowFrameLinethickness{0.15pt}
%\renewcommand*\ShowFrameColor{\color{red}}
%---------------------------------------------------------------%
\usepackage{pgfplots}
\usepgfplotslibrary{groupplots}
%\usepackage[dvipsnames]{xcolor}
\pgfplotsset{compat=1.18}
\usepackage{pgfplotstable}
\usepackage{graphicx}
\usepackage{subfig}
\usepackage{multirow}
\usepackage{lipsum}
\usepackage{xspace}
\usetikzlibrary{patterns}
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{amssymb}
\newcommand{\R}{\mathbb{R}}
\newcommand*\circled[1]{\tikz[baseline=(char.base)]{
            \node[shape=circle,draw,inner sep=0.7pt] (char) {#1};}}

\begin{document}




\begin{figure}[!htpb]
        \centering
        \begin{tikzpicture}
            \begin{groupplot}[
                    legend columns=-1,
                    %bar width=0.22, % Width of the bar
                    %, % Distance between the centers of the bars
                    symbolic x coords={3-6, 6-12, 12-24},
                     enlarge x limits={abs=0.4cm},
                     %width=0.25\textwidth,
                    xtick={3-6, 6-12, 12-24},
                    %height=0.6\textheight,
                    ymin=0,
                    ymax=7,
                    xticklabel style={font=\tiny},
                    nodes near coords,
    every node near coord/.append style={font=\tiny},
   nodes near coords align={vertical},
                     xlabel={\tiny Agents~$(N \to \ 2N)$},
                     ylabel={\tiny Growth rate~($N\times$)},
                     % The distance between the center of the first bar and the left edge
                    %enlarge y limits=false
                    legend entries={{\color{olive}{\tiny Random}},{\color{orange}{\tiny ++Cost}},{\color{teal}{\tiny ++FTE}}},
                    legend to name=CombinedLegendBar,
                    footnotesize,
                    ybar legend,
                    width=0.4\columnwidth,
                    legend image code/.code={%
                     \draw[#1] (0cm,-0.1cm) rectangle (0.6cm,0.1cm);
                         },
                    % area legend, % This is the alternate option
                    group style={
                    group size=3 by 1,
                    xlabels at=edge bottom,
                    ylabels at=edge left}]
                \nextgroupplot[title={\tiny (a) Mini-batch sampling}]
                    \addplot[ybar, pattern color=black, pattern=crosshatch dots] coordinates {  (3-6, 3.5)};
                    \addplot[ybar, pattern color=gray, pattern=checkerboard] coordinates { (6-12, 4.1)};
                    \addplot[ybar, pattern color=gray, pattern=north east lines] coordinates {  (12-24, 4.5)};
                \nextgroupplot[title={\tiny (b) Target Q Calculation}]
                 \addplot[ybar, pattern color=black, pattern=crosshatch dots] coordinates {  (3-6, 4.1)};
                    \addplot[ybar, pattern color=gray, pattern=checkerboard] coordinates { (6-12, 4.6)};
                    \addplot[ybar,pattern color=gray, pattern=north east lines] coordinates {  (12-24, 4.6)};
                \nextgroupplot[title={\tiny (c) Q loss \& P loss}]
            `   \addplot[ybar, pattern color=black, pattern=crosshatch dots] coordinates {  (3-6, 3.05)};
                    \addplot[ybar, pattern color=gray, pattern=checkerboard] coordinates { (6-12,3.23)};
                    \addplot[ybar, pattern color=gray, pattern=north east lines] coordinates {  (12-24, 3.42)};
            \end{groupplot}
        \end{tikzpicture}
\vspace{-\baselineskip}
\caption{Update all trainers sub-functions super-linear growth rate for all the three workloads when the number of agents are scaled from $N-2N$.}% The environment is Cooperative Navigation (simple spread).}
\vspace{-\baselineskip}
\label{Figure4}
\end{figure}
\end{document}

Alguém pode me ajudar com esse problema?

Obrigado!

Responder1

  • Aparentemente na primeira tentativa de responder a pergunta eu entendi mal...
  • Aprendi com a bela resposta do @Torbjørn T., agora eu sei, que o principal problema é adicionar ao último diagrama P um conjunto de barras na cor azul.
  • Isso pode ser relativamente fácil de fazer:
    • Conjunto Q (na cor preta) de barras deslocadas com pequena quantidade para a esquerda
    • adicione um novo conjunto de barras P (em azul) e desloque-o na mesma quantidade para a direita
  • No novo MWE são preservados os estilos de diagrama da primeira versão da definição de resposta.
  • Para padrões agora é usada patterns.metaa biblioteca.
\documentclass[journal,compsoc,xcolor={dvipsnames}]{IEEEtran}
\usepackage{pgfplots}
\usepgfplotslibrary{groupplots}
\pgfplotsset{compat=1.18}
\usetikzlibrary{patterns, patterns.meta}

\begin{document}
    \begin{figure}[ht]
    \raggedright
\begin{tikzpicture}[
pattern-A/.style = {pattern={Dots[angle=45, distance=2pt,xshift=1pt]}},
pattern-B/.style = {pattern={Hatch[angle=45,distance=2pt,xshift=1pt]}},
pattern-C/.style = {pattern={Lines[angle=45,distance=2pt]}},
%
pattern-AA/.style = {pattern-A, pattern color=blue},
pattern-BB/.style = {pattern-B, pattern color=blue},
pattern-CC/.style = {pattern-C, pattern color=blue},
                    ]
    \begin{groupplot}[
group style={
    group size=3 by 1,
    ylabels at=edge left,
    horizontal sep=4mm,
            },
    width=0.44\linewidth,
    enlarge x limits=0.4,
%
    title style = {yshift=-1ex, font=\scriptsize, align=center},
    xlabel={Agents~$(N \to \ 2N)$},
    ylabel={Growth rate~($N\times$)},
    label style = {font=\scriptsize},
%
    ybar,                   % <---
    /pgf/bar width=2.4mm,   % <--- common set, overwritten in third \nextgroupplot
    /pgf/bar shift=0pt,     % <--- common set, overwritten in third \nextgroupplot
%
    symbolic x coords={3-6, 6-12, 12-24},
    ticklabel style={font=\scriptsize},
    ymin=0,    ymax=7,
%
    nodes near coords,
    every node near coord/.append style={font=\tiny},
    nodes near coords align={vertical},
%
    legend image code/.code={\draw[#1] (0cm,-1mm) rectangle (4mm,1mm);},
    legend style={legend columns=-1,
                  font=\footnotesize,
                  /tikz/every even column/.append style={column sep=1em}
                  }
                    ]
\nextgroupplot[title={(a) Mini-batch\\ sampling}]
    \addplot[pattern-A] coordinates { (3-6, 3.5)};
    \addplot[pattern-B] coordinates { (6-12, 4.1)};
    \addplot[pattern-C] coordinates { (12-24, 4.5)};
\nextgroupplot[title={(b) Target Q\\ Calculation}]
    \addplot[pattern-A] coordinates { (3-6, 4.1)};
    \addplot[pattern-B] coordinates { (6-12, 4.6)};
    \addplot[pattern-C] coordinates { (12-24, 4.6)};

\nextgroupplot[title={(c) Q loss\\ \& \textcolor{blue}{P loss}},
               nodes near coords style={rotate=90, anchor=west},
               legend to name=CombinedLegendBar,                
               ]
    \addplot[pattern-A,bar shift=-1.4mm] coordinates { (3-6,  3.05)};
    \addplot[pattern-B,bar shift=-1.4mm] coordinates { (6-12, 3.23)};
    \addplot[pattern-C,bar shift=-1.4mm] coordinates { (12-24,3.42)};
    %
    \addplot[pattern-AA,bar shift=+1.4mm] coordinates { (3-6,4.05)};
    \addplot[pattern-BB,bar shift=+1.4mm] coordinates { (6-12,4.23)};
    \addplot[pattern-CC,bar shift=+1.4mm] coordinates { (12-24,4.42)};
\legend{Qa, Qb, Qc, Pa, Pb, Pc}
    
\end{groupplot}
\node [above=2\baselineskip] at (group c2r1.north) {\ref{CombinedLegendBar}};
        \end{tikzpicture}

\caption{Update all trainers sub-functions super-linear growth rate for all the three workloads when the number of agents are scaled from $N-2N$.}% The environment is Cooperative Navigation (simple spread).}
\label{Figure4}
\end{figure}
\end{document}

insira a descrição da imagem aqui

Responder2

Pode exigir alguns ajustes extras, e coloquei a legenda acima do gráfico com entradas de espaço reservado. Na verdade, não há espaço dentro de um eixo para a legenda.

A principal mudança é usar ybarcomo opção to the groupplotem vez de to each \addplot, e usar deslocamentos manuais de barra para posicionar as barras corretamente.

horizontal sepnos group styleconjuntos o espaço entre os eixos.

insira a descrição da imagem aqui

\documentclass[10pt,journal,compsoc,xcolor={dvipsnames}]{IEEEtran}

\usepackage{pgfplotstable}
\usepgfplotslibrary{groupplots}
\pgfplotsset{compat=1.18}
\usetikzlibrary{patterns}
\begin{document}

\begin{figure}[!htpb]
        \centering
        \begin{tikzpicture}
            \begin{groupplot}[
                    legend columns=-1,
                    %bar width=0.22, % Width of the bar
                    %, % Distance between the centers of the bars
                    symbolic x coords={3-6, 6-12, 12-24},
                    enlarge x limits=0.3,
                     %width=0.25\textwidth,
                    xtick={3-6, 6-12, 12-24},
                    %height=0.6\textheight,
                    ymin=0,
                    ymax=7,
                    xticklabel style={font=\tiny},
                    nodes near coords,
                    every node near coord/.append style={font=\tiny},
                    nodes near coords align={vertical},
                    xlabel={\tiny Agents~$(N \to \ 2N)$},
                    ylabel={\tiny Growth rate~($N\times$)},
                     % The distance between the center of the first bar and the left edge
                    %enlarge y limits=false 
                    footnotesize,
                    ybar=-\pgfplotbarwidth,
                    width=0.45\columnwidth,
                    legend image code/.code={%
                     \draw[#1] (0cm,-0.1cm) rectangle (0.2cm,0.2cm);
                         },
                    legend style={cells={font=\scriptsize}},
                    % area legend, % This is the alternate option
                    group style={
                    group name=foo,
                    group size=3 by 1,
                    xlabels at=edge bottom,
                    ylabels at=edge left,
                    horizontal sep=4.5mm
                    },
                    title style={font=\tiny}]
                \nextgroupplot[title={(a) Mini-batch sampling}]
                    \addplot[pattern color=black, pattern=crosshatch dots] coordinates {  (3-6, 3.5)};
                    \addplot[pattern color=gray, pattern=checkerboard] coordinates { (6-12, 4.1)};
                    \addplot[pattern color=gray, pattern=north east lines] coordinates {  (12-24, 4.5)};
                \nextgroupplot[title={(b) Target Q Calculation}]
                 \addplot[pattern color=black, pattern=crosshatch dots] coordinates {  (3-6, 4.1)};
                    \addplot[pattern color=gray, pattern=checkerboard] coordinates { (6-12, 4.6)};
                    \addplot[ybar,pattern color=gray, pattern=north east lines] coordinates {  (12-24, 4.6)};


                \nextgroupplot[
                    title={(c) Q loss \& P loss},
                    bar width=8pt,
                    legend to name=CombinedLegendBar,
]
                
                \pgfmathsetlengthmacro{\MyBarshift}{0.5*\pgfplotbarwidth+1pt}

               \addplot[bar shift=-\MyBarshift,pattern color=black, pattern=crosshatch dots] coordinates {  (3-6, 3.05)};
               \addplot[bar shift=-\MyBarshift,pattern color=gray, pattern=checkerboard] coordinates { (6-12,3.23)};
               \addplot[bar shift=-\MyBarshift,pattern color=gray, pattern=north east lines] coordinates {  (12-24, 3.42)};
                    
                    
               % second set of bars
               \addplot[bar shift=\MyBarshift,pattern color=blue, pattern=crosshatch dots] coordinates {  (3-6, 4.05)};
               \addplot[bar shift=\MyBarshift,pattern color=blue, pattern=checkerboard] coordinates { (6-12,4.23)};
               \addplot[bar shift=\MyBarshift,pattern color=blue, pattern=north east lines] coordinates {  (12-24, 4.42)};
               
               \legend{Qa,Qb,Qc,Pa,Pb,Pc}

            \end{groupplot}
            
            \node [above=12pt] at (foo c2r1.north) {\ref{CombinedLegendBar}};
        \end{tikzpicture}
\vspace{-\baselineskip}
\caption{Update all trainers sub-functions super-linear growth rate for all the three workloads when the number of agents are scaled from $N-2N$.}% The environment is Cooperative Navigation (simple spread).}
\vspace{-\baselineskip}
\label{Figure4}
\end{figure}
\end{document}

Responder3

insira a descrição da imagem aqui

  • As barras são criadas através de um picelemento que depende de três argumentos (altura, rótulo e padrão de preenchimento).

  • As dimensões são controladas como variáveis ​​globais no início; você pode modificá-los como desejar.

O código

\documentclass[11pt, margin=1cm]{standalone}
\usepackage{tikz}
\usetikzlibrary{math, patterns}
\begin{document}

\tikzmath{
  real \w, \dw, \globalW, \globalH, \g1, \g2, \g3;
  \w = 1.5;  % width of a bar
  \dw = .4;  % half inbetween two bars
  \globalW = 3*\w +6*\dw;
  \globalH = 6;
  \g1 = 0;  % position of the first graph
  \g2 = \globalW +1.3*\w;
  \g3 = 2*\globalW +4*\w;
}
\tikzset{
  pics/bar/.style n args={3}{%  height, label, pattern 
    code={%
      \draw[pattern=#3] (0, 0) rectangle (\w, #1/7*\globalH)
      ++ (-\w/2, 1ex) node[above, scale=.8] {#1};
      \path (\w/2, -1ex) node[below, scale=.8] {#2};
    }
  }
}
\begin{tikzpicture}[every node/.style={scale=.9}]
  \begin{scope}[xshift={\g1 cm}]
    \path (\globalW/2, \globalH) node[above] {(a) Mini-batch sampling};
    \draw (0, 0) -- ++(\globalW, 0) ++(-\globalW/2, -4ex)
    node[below] {Agents $(N \to 2N)$};
    \draw (0, 0) -- ++(0, \globalH) ++(-3em, -\globalH/2)
    node[rotate=90] {Growth rate $(N\times)$};
    \foreach \j in {0, 2, 4, 6}{%
      \draw (0, \j/7*\globalH) -- ++(-1ex, 0) node[left] {$\j$};
    }
    \path
    (0, 0) ++(\dw, 0) pic {bar={3.5}{3-6}{dots}}
    ++(\w +2*\dw, 0) pic {bar={4.1}{6-12}{crosshatch}}
    ++(\w +2*\dw, 0) pic {bar={4.5}{12-24}{north east lines}};
  \end{scope}
  \begin{scope}[xshift={\g2 cm}]
    \path (\globalW/2, \globalH) node[above] {(b) Target Q Calculation};
    \draw (0, 0) -- ++(\globalW, 0) ++(-\globalW/2, -4ex)
    node[below] {Agents $(N \to 2N)$};
    \draw (0, 0) -- ++(0, \globalH) ++(-3em, -\globalH/2);
    \foreach \j in {0, 2, 4, 6}{%
      \draw (0, \j/7*\globalH) -- ++(-1ex, 0) node[left] {$\j$};
    }
    \path
    (0, 0) ++(\dw, 0) pic {bar={4.1}{3-6}{dots}}
    ++(\w +2*\dw, 0) pic {bar={4.6}{6-12}{crosshatch}}
    ++(\w +2*\dw, 0) pic {bar={4.6}{12-24}{north east lines}};
  \end{scope}
  \begin{scope}[xshift={\g3 cm}]
    \path (\globalW/2, \globalH) node[above] {(c) Q loss \& P loss};
    \draw (0, 0) -- ++(\globalW, 0) ++(-\globalW/2, -4ex)
    node[below] {Agents $(N \to 2N)$};
    \draw (0, 0) -- ++(0, \globalH) ++(-3em, -\globalH/2)
    node[rotate=90] {Growth rate $(N\times)$};
    \foreach \j in {0, 2, 4, 6}{%
      \draw (0, \j/7*\globalH) -- ++(-1ex, 0) node[left] {$\j$};
    }
    \path
    (0, 0) ++(\dw, 0) pic {bar={3.05}{3-6}{dots}}
    ++(\w +2*\dw, 0) pic {bar={3.25}{6-12}{crosshatch}}
    ++(\w +2*\dw, 0) pic {bar={3.42}{12-24}{north east lines}};
  \end{scope}
\end{tikzpicture}
\end{document}

informação relacionada