0

I want to plot two bar plots with more space next to each other (now the yaxis label overlaps on first figure). Also I want to add x axis label and a caption for each figure. Can anyone help me to solve the problem? Code:

 \documentclass[tikz]{standalone}
\usepackage{pgfplots}
\usepgfplotslibrary{groupplots}

\pgfplotsset{compat=1.16}

\begin{document} \begin{tikzpicture} \begin{groupplot}[group style={group size=2 by 1},width=12cm,height=8cm] \nextgroupplot[ %legend style={at={(mygroup.south)},anchor=north,legend columns=-1}, symbolic x coords={Precision,Recall,F1-Score,Accuracy}, major tick length=0cm, xtick=data, ymin=50.0, ylabel = {y}, xlabel = {x}, enlarge x limits=0.2, enlarge y limits={upper,value=0.2}, nodes near coords, ybar, every node near coord/.append style={rotate=90, anchor=west}, bar width = 8pt, ]

    \addplot coordinates {(Precision,86.6) (Recall,86.0) (F1-Score,86.3) (Accuracy,98.4)};
    \addplot coordinates {(Precision,87.6) (Recall,86.2) (F1-Score,86.5) (Accuracy,97.5)};
    \addplot coordinates {(Precision,85.9) (Recall,86.3) (F1-Score,86.1) (Accuracy,98.6)};
    \addplot coordinates {(Precision,87.1) (Recall,86.8) (F1-Score,87.0) (Accuracy,99.2)};
    \addplot coordinates {(Precision,85.5) (Recall,82.8) (F1-Score,83.7) (Accuracy,97.4)};
    \addplot coordinates {(Precision,77.9) (Recall,77.7) (F1-Score,75.9) (Accuracy,87.8)};
    %\legend{KNN,Neural Networks,Decision Tree,Random Forest,SVM,Naive Bayes}

    \nextgroupplot[
        legend style={at={(-\pgfkeysvalueof{/pgfplots/group/horizontal sep}/2,-0.1)},
                anchor=north,legend columns=-1},
        symbolic x coords={Precision,Recall,F1-Score,Accuracy},
        major tick length=0cm,
        xtick=data,
        ymin=50.0,
        ylabel = {y},
        enlarge x limits=0.2,
        enlarge y limits={upper,value=0.2},
        nodes near coords,
        ybar,
        every node near coord/.append style={rotate=90, anchor=west},
        bar width = 8pt,
    ]

    \addplot coordinates {(Precision,86.6) (Recall,86.0) (F1-Score,86.3) (Accuracy,98.4)};
    \addplot coordinates {(Precision,87.6) (Recall,86.2) (F1-Score,86.5) (Accuracy,97.5)};
    \addplot coordinates {(Precision,85.9) (Recall,86.3) (F1-Score,86.1) (Accuracy,98.6)};
    \addplot coordinates {(Precision,87.1) (Recall,86.8) (F1-Score,87.0) (Accuracy,99.2)};
    \addplot coordinates {(Precision,85.5) (Recall,82.8) (F1-Score,83.7) (Accuracy,97.4)};
    \addplot coordinates {(Precision,77.9) (Recall,77.7) (F1-Score,75.9) (Accuracy,87.8)};




    \legend{KNN,Neural Networks,Decision Tree,Random Forest,SVM,Naive Bayes}
\end{groupplot}



\end{tikzpicture}

\end{document}

enter image description here

2 Answers2

1

I recommend to have a look at the manual of pgfplots (5.8 Grouping plots). The passages in italics are taken directly from the manual.

1. Space

With

  • group/horizontal sep=<dimension>
  • group/vertical sep=<dimension>

we set the spacing between the plots in the horizontal and vertical direction, respectively. If you thus want them to be glued together you should set them both to a length of 0pt.

2. X label

With

  • group/x descriptions at=all|edge top|edge bottom
  • group/y descriptions at=all|edge left|edge right

we can set the position of the x and y label. These are simply a short hand for using both xticklabels at and xlabels at simultaneously. The problem is that we placed the titles above and the legend below. So we can only put the x label to the right of each x axes. To do that we first set group/group name={<name>} in the groupplot environment. After that we can refer the plots:

% bar chart 1
\node[xshift=.75cm, yshift=-.2cm] at (myResults c1r1.south east) {x-Label};
% bar chart 2
\node[xshift=.75cm, yshift=-.2cm] at (myResults c2r1.south east) {x-Label};

3. Title

To set the titles we can add the option title={<title>} to each \nextgroupplot.

Complete Code:

\documentclass[tikz]{standalone}
\usepackage{pgfplots}
\usepgfplotslibrary{groupplots}

\pgfplotsset{compat=1.16}

\begin{document} \begin{tikzpicture} \begin{groupplot}[group style={group name=myResults, group size=2 by 1, horizontal sep=2.5cm},width=12cm,height=8cm, ylabel = {y}] \nextgroupplot[ title={Title 1}, %legend style={at={(mygroup.south)},anchor=north,legend columns=-1}, symbolic x coords={Precision,Recall,F1-Score,Accuracy}, major tick length=0cm, xtick=data, ymin=50.0, enlarge x limits=0.2, enlarge y limits={upper,value=0.2}, nodes near coords, ybar, every node near coord/.append style={rotate=90, anchor=west}, bar width = 8pt ]

    \addplot coordinates {(Precision,86.6) (Recall,86.0) (F1-Score,86.3) (Accuracy,98.4)};
    \addplot coordinates {(Precision,87.6) (Recall,86.2) (F1-Score,86.5) (Accuracy,97.5)};
    \addplot coordinates {(Precision,85.9) (Recall,86.3) (F1-Score,86.1) (Accuracy,98.6)};
    \addplot coordinates {(Precision,87.1) (Recall,86.8) (F1-Score,87.0) (Accuracy,99.2)};
    \addplot coordinates {(Precision,85.5) (Recall,82.8) (F1-Score,83.7) (Accuracy,97.4)};
    \addplot coordinates {(Precision,77.9) (Recall,77.7) (F1-Score,75.9) (Accuracy,87.8)};
    %\legend{KNN,Neural Networks,Decision Tree,Random Forest,SVM,Naive Bayes}

    \nextgroupplot[
        title={Title 2},
        legend style={at={(-\pgfkeysvalueof{/pgfplots/group/horizontal sep}/2,-0.1)},
                anchor=north,legend columns=-1},
        symbolic x coords={Precision,Recall,F1-Score,Accuracy},
        major tick length=0cm,
        xtick=data,
        ymin=50.0,
        enlarge x limits=0.2,
        enlarge y limits={upper,value=0.2},
        nodes near coords,
        ybar,
        every node near coord/.append style={rotate=90, anchor=west},
        bar width = 8pt,
    ]

    \addplot coordinates {(Precision,86.6) (Recall,86.0) (F1-Score,86.3) (Accuracy,98.4)};
    \addplot coordinates {(Precision,87.6) (Recall,86.2) (F1-Score,86.5) (Accuracy,97.5)};
    \addplot coordinates {(Precision,85.9) (Recall,86.3) (F1-Score,86.1) (Accuracy,98.6)};
    \addplot coordinates {(Precision,87.1) (Recall,86.8) (F1-Score,87.0) (Accuracy,99.2)};
    \addplot coordinates {(Precision,85.5) (Recall,82.8) (F1-Score,83.7) (Accuracy,97.4)};
    \addplot coordinates {(Precision,77.9) (Recall,77.7) (F1-Score,75.9) (Accuracy,87.8)};




    \legend{KNN,Neural Networks,Decision Tree,Random Forest,SVM,Naive Bayes}
\end{groupplot}

% x axis label
\node[xshift=.75cm, yshift=-.2cm] at (myResults c1r1.south east) {x-Label};
\node[xshift=.75cm, yshift=-.2cm] at (myResults c2r1.south east) {x-Label};

\end{tikzpicture}

\end{document}

Two bar charts side by side.

Unknown
  • 822
1

One more solution with a small bit more concise diagrams code:

\documentclass[margin=3mm]{standalone}
\usepackage{pgfplots}
\usepgfplotslibrary{groupplots}
\pgfplotsset{compat=1.18}

\begin{document} \begin{tikzpicture} \begin{groupplot}[ group style={ group size=2 by 1, horizontal sep=2cm, % <----- distance between plots }, width=12cm, height=8cm, major tick length=0cm, xtick=data, enlarge x limits=0.2, enlarge y limits={upper,value=0.2}, ybar, ymin=60.0, symbolic x coords={Precision,Recall,F1-Score,Accuracy}, nodes near coords, every node near coord/.append style={rotate=90, anchor=west}, % legend style={at={(-\pgfkeysvalueof{/pgfplots/group/horizontal sep}/2,-0.1)}, anchor=north, legend columns=-1, /tikz/every even column/.append style={column sep=1em}},
] \nextgroupplot[ bar width = 9pt, title = {Title 1}, ylabel= $y$ ] \addplot coordinates {(Precision,86.6) (Recall,86.0) (F1-Score,86.3) (Accuracy,98.4)}; \addplot coordinates {(Precision,87.6) (Recall,86.2) (F1-Score,86.5) (Accuracy,97.5)}; \addplot coordinates {(Precision,85.9) (Recall,86.3) (F1-Score,86.1) (Accuracy,98.6)}; \addplot coordinates {(Precision,87.1) (Recall,86.8) (F1-Score,87.0) (Accuracy,99.2)}; \addplot coordinates {(Precision,85.5) (Recall,82.8) (F1-Score,83.7) (Accuracy,97.4)}; \addplot coordinates {(Precision,77.9) (Recall,77.7) (F1-Score,75.9) (Accuracy,87.8)};

\nextgroupplot[ bar width = 9pt, title = {Title 2}, ylabel= $y$ ] \addplot coordinates {(Precision,86.6) (Recall,86.0) (F1-Score,86.3) (Accuracy,98.4)}; \addplot coordinates {(Precision,87.6) (Recall,86.2) (F1-Score,86.5) (Accuracy,97.5)}; \addplot coordinates {(Precision,85.9) (Recall,86.3) (F1-Score,86.1) (Accuracy,98.6)}; \addplot coordinates {(Precision,87.1) (Recall,86.8) (F1-Score,87.0) (Accuracy,99.2)}; \addplot coordinates {(Precision,85.5) (Recall,82.8) (F1-Score,83.7) (Accuracy,97.4)}; \addplot coordinates {(Precision,77.9) (Recall,77.7) (F1-Score,75.9) (Accuracy,87.8)};

\legend{KNN,Neural Networks, Decision Tree,Random Forest,SVM,Naive Bayes} \end{groupplot} \end{tikzpicture} \end{document}

enter image description here

Edit: In cases, when diagrams has different x and y axis, than their definitions should be moved from options of groupplot to options of \nextgroupplot.

Zarko
  • 296,517