2

I am trying to generate a group of bar charts with 3 figures and successfully completed that and the output can be seen below.

Problem: I want the first two bar-charts (a and b) in the same state, but for the third bar-chart ((c) Q loss and P loss), how can I include two bars for each label in the X axis with a legend alone for that chart? To reiterate, I want two bars for 3-6, two bars for 6-12 and two bars for 12-24 with a legend exclusively for the third chart. Also, can someone help me to reduce the space between the bar-charts(a,b,c)?

Output:

enter image description here

Latex code:

\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}

Can anyone help me with this problem?

Thanks!

5
  • Hi! Do you need gnuplot or it is only an accidental choice? I think that everything in the figure can be done with basic TikZ. Would you be interested?
    – Daniel N
    Oct 16, 2022 at 8:23
  • Hello, @DanielN, yes using basic TikZ is fine.
    – Student
    Oct 16, 2022 at 14:39
  • @DanielN Gnuplot isn't used in the OP's code. Oct 16, 2022 at 18:22
  • @PhD_student So you're after something like i.stack.imgur.com/W8VYE.png, only with a legend? I was just wondering who had misunderstood your question ... Oct 16, 2022 at 18:39
  • @TorbjørnT., Yes, I'm looking for that type of chart. with a legend alone for the (c) chart.
    – Student
    Oct 16, 2022 at 18:43

3 Answers 3

2
  • Apparently at the first attempt to answer question I misunderstood it ...
  • Learned from nice @Torbjørn T. answer, now I know, that main problem is adding to the last diagram P set of bars in blue color.
  • This can be relatively ease to do:
    • Q set (in black color) of bars shift with small amount to left
    • add new set of bars P (in blue) and shift it for the same amount to the right
  • In new MWE is preserved diagram styles from the first version of answer definition.
  • For patterns is now used patterns.meta library.
\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}

enter image description here

3

Might require some extra tuning, and I plonked the legend above the plot with placeholder entries. There isn't really room inside an axis for the legend.

The main change is using ybar as an option to the groupplot instead of to each \addplot, and using manual bar shifts to place the bars properly.

horizontal sep in the group style sets the space between the axes.

enter image description here

\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}
1
  • +1! Apparently I didn't understood question correctly ... so my answer actually contain only some off-topic suggestion :-(
    – Zarko
    Oct 16, 2022 at 19:33
2

enter image description here

  • The bars are created through a pic element that depends on three arguments (height, label, and filling pattern).

  • The dimensions are controlled as global variables at the beginning; you can modify them as you wish.

The code

\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}

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .