0

I’m trying to place two pie charts side by side but they overlap.

\documentclass{article}

\usepackage{graphicx}
\usepackage{subcaption}
\usepackage{tikz}

\begin{document}

\begin{figure}
  \begin{subfigure}{0.45\textwidth}
  \centering
%\adjustbox{trim=0 .01\height{} 0 .07\height{}, clip, width=.91\linewidth}
%  \includegraphics[page=1, width=\textwidth]{{sinus.gender}.pdf}
\def\angle{0}
\def\radius{3}
\def\cyclelist{{"orange","blue","red","green"}}
\newcount\cyclecount \cyclecount=-1
\newcount\ind \ind=-1
\begin{tikzpicture}[nodes = {font=\sffamily}]
  \foreach \percent/\name in {
      72/Female (13),
         28/Male (5)
    } {
      \ifx\percent\empty\else               % If \percent is empty, do nothing
        \global\advance\cyclecount by 1     % Advance cyclecount
        \global\advance\ind by 1            % Advance list index
        \ifnum3<\cyclecount                 % If cyclecount is larger than list
          \global\cyclecount=0              %   reset cyclecount and
          \global\ind=0                     %   reset list index
        \fi
        \pgfmathparse{\cyclelist[\the\ind]} % Get color from cycle list
        \edef\color{\pgfmathresult}         %   and store as \color
        % Draw angle and set labels
        \draw[fill={\color!50},draw={\color}] (0,0) -- (\angle:\radius)
          arc (\angle:\angle+\percent*3.6:\radius) -- cycle;
        \node at (\angle+0.5*\percent*3.6:0.7*\radius) {\percent\,\%};
        \node[pin=\angle+0.5*\percent*3.6:\name]
          at (\angle+0.5*\percent*3.6:\radius) {};
        \pgfmathparse{\angle+\percent*3.6}  % Advance angle
        \xdef\angle{\pgfmathresult}         %   and store in \angle
      \fi
    };
\end{tikzpicture}
  \caption{Sinus.}
  \end{subfigure}
  \begin{subfigure}{0.45\textwidth}
  \centering
%\adjustbox{trim=0 .02\height{} 0 .01\height{}, clip, width=.91\linewidth}
%  \includegraphics[width=\textwidth, page=1]{{arr.gender}.pdf}

\def\angle{0}
\def\radius{3}
\def\cyclelist{{"orange","blue","red","green"}}
\newcount\cyclecount \cyclecount=-1
\newcount\ind \ind=-1
\begin{tikzpicture}[nodes = {font=\sffamily}]
  \foreach \percent/\name in {
      47/Female (22),
        53/Male (25)
    } {
      \ifx\percent\empty\else               % If \percent is empty, do nothing
        \global\advance\cyclecount by 1     % Advance cyclecount
        \global\advance\ind by 1            % Advance list index
        \ifnum3<\cyclecount                 % If cyclecount is larger than list
          \global\cyclecount=0              %   reset cyclecount and
          \global\ind=0                     %   reset list index
        \fi
        \pgfmathparse{\cyclelist[\the\ind]} % Get color from cycle list
        \edef\color{\pgfmathresult}         %   and store as \color
        % Draw angle and set labels
        \draw[fill={\color!50},draw={\color}] (0,0) -- (\angle:\radius)
          arc (\angle:\angle+\percent*3.6:\radius) -- cycle;
        \node at (\angle+0.5*\percent*3.6:0.7*\radius) {\percent\,\%};
        \node[pin=\angle+0.5*\percent*3.6:\name]
          at (\angle+0.5*\percent*3.6:\radius) {};
        \pgfmathparse{\angle+\percent*3.6}  % Advance angle
        \xdef\angle{\pgfmathresult}         %   and store in \angle
      \fi
    };
\end{tikzpicture}
\end{subfigure}

\end{figure}

\end{document}

Output

enter image description here

It would be really great to be able to \input or \include the tikz document to my code such that I do not need keep all codes in one document.

Testing hhh's captions

% http://tex.stackexchange.com/questions/127227/subcaption-having-two-subfigures-captions-on-the-same-line
\begin{figure}
   \centering
   \subcaptionbox{Sinus}%
     [.4\linewidth]{\firstPic}}
    \subcaptionbox{Arr.}%
    [.4\linewidth]{\secondPic}
\caption{Gender proportions in populations.}
\label{figure:gender}
\end{figure}

Output

enter image description here

TeXLive: 2016
OS: Debian 8.5

  • There is a legend present in this image. I don’t see the problem. – Henri Menke Nov 23 '16 at 22:25
4

I would go with Tikz, a remix of this here below.

enter image description here

\documentclass{article}
\usepackage{graphicx}  
\usepackage{tikz}

\begin{document}

\def\angle{0}
\def\radius{3}
\def\cyclelist{{"orange","blue","red","green"}}
\newcount\cyclecount \cyclecount=-1
\newcount\ind \ind=-1
\begin{tikzpicture}[nodes = {font=\sffamily}]
  \foreach \percent/\name in {
      72.2/Female (13),
        27.8/Male (5)
    } {
      \ifx\percent\empty\else               % If \percent is empty, do nothing
        \global\advance\cyclecount by 1     % Advance cyclecount
        \global\advance\ind by 1            % Advance list index
        \ifnum3<\cyclecount                 % If cyclecount is larger than list
          \global\cyclecount=0              %   reset cyclecount and
          \global\ind=0                     %   reset list index
        \fi
        \pgfmathparse{\cyclelist[\the\ind]} % Get color from cycle list
        \edef\color{\pgfmathresult}         %   and store as \color
        % Draw angle and set labels
        \draw[fill={\color!50},draw={\color}] (0,0) -- (\angle:\radius)
          arc (\angle:\angle+\percent*3.6:\radius) -- cycle;
        \node at (\angle+0.5*\percent*3.6:0.7*\radius) {\percent\,\%};
        \node[pin=\angle+0.5*\percent*3.6:\name]
          at (\angle+0.5*\percent*3.6:\radius) {};
        \pgfmathparse{\angle+\percent*3.6}  % Advance angle
        \xdef\angle{\pgfmathresult}         %   and store in \angle
      \fi
    };
\end{tikzpicture}



\end{document}

Other possibilites exist such as pgf-pie package in Google Code by this here:

\begin{tikzpicture}
    \pie{10/A, 20/B, 30/C, 40/D}
\end{tikzpicture}

Related


For having two pie charts side-by-side

Firstly, use the macros. Then use the showframe package to see what kind of thing you are playing with.

enter image description here

and so we will scale the Tikz pictures

enter image description here

and then we will use hfill to add some extra space between the two pictures, success!

enter image description here

\documentclass{article}
\usepackage{graphicx}
\usepackage{subcaption}
\usepackage{tikz}
%\usepackage{showframe}


\newcommand{\firstPic}{
\def\angle{0}
\def\radius{3}
\def\cyclelist{{"orange","blue","red","green"}}
\newcount\cyclecount \cyclecount=-1
\newcount\ind \ind=-1
\begin{tikzpicture}[scale=0.45,nodes = {font=\sffamily}]
  \foreach \percent/\name in {
      72/Female (13),
         28/Male (5)
    } {
      \ifx\percent\empty\else               % If \percent is empty, do nothing
        \global\advance\cyclecount by 1     % Advance cyclecount
        \global\advance\ind by 1            % Advance list index
        \ifnum3<\cyclecount                 % If cyclecount is larger than list
          \global\cyclecount=0              %   reset cyclecount and
          \global\ind=0                     %   reset list index
        \fi
        \pgfmathparse{\cyclelist[\the\ind]} % Get color from cycle list
        \edef\color{\pgfmathresult}         %   and store as \color
        % Draw angle and set labels
        \draw[fill={\color!50},draw={\color}] (0,0) -- (\angle:\radius)
          arc (\angle:\angle+\percent*3.6:\radius) -- cycle;
        \node at (\angle+0.5*\percent*3.6:0.7*\radius) {\percent\,\%};
        \node[pin=\angle+0.5*\percent*3.6:\name]
          at (\angle+0.5*\percent*3.6:\radius) {};
        \pgfmathparse{\angle+\percent*3.6}  % Advance angle
        \xdef\angle{\pgfmathresult}         %   and store in \angle
      \fi
    };
\end{tikzpicture}
}
\newcommand{\secondPic}{
\def\angle{0}
\def\radius{3}
\def\cyclelist{{"orange","blue","red","green"}}
\newcount\cyclecount \cyclecount=-1
\newcount\ind \ind=-1
\begin{tikzpicture}[scale=0.45,nodes = {font=\sffamily}]
  \foreach \percent/\name in {
      47/Female (22),
        53/Male (25)
    } {
      \ifx\percent\empty\else               % If \percent is empty, do nothing
        \global\advance\cyclecount by 1     % Advance cyclecount
        \global\advance\ind by 1            % Advance list index
        \ifnum3<\cyclecount                 % If cyclecount is larger than list
          \global\cyclecount=0              %   reset cyclecount and
          \global\ind=0                     %   reset list index
        \fi
        \pgfmathparse{\cyclelist[\the\ind]} % Get color from cycle list
        \edef\color{\pgfmathresult}         %   and store as \color
        % Draw angle and set labels
        \draw[fill={\color!50},draw={\color}] (0,0) -- (\angle:\radius)
          arc (\angle:\angle+\percent*3.6:\radius) -- cycle;
        \node at (\angle+0.5*\percent*3.6:0.7*\radius) {\percent\,\%};
        \node[pin=\angle+0.5*\percent*3.6:\name]
          at (\angle+0.5*\percent*3.6:\radius) {};
        \pgfmathparse{\angle+\percent*3.6}  % Advance angle
        \xdef\angle{\pgfmathresult}         %   and store in \angle
      \fi
    };
\end{tikzpicture}
}



\begin{document}

\begin{figure}
  \centering
  \begin{subfigure}{0.45\textwidth}
    \centering
    \firstPic
  \caption{Frist picture}
  \end{subfigure}
  \hfill
  \begin{subfigure}{0.45\textwidth}
    \centering
    \secondPic
  \caption{Second picture}
  \end{subfigure}

\caption{MAIN caption}
\end{figure}

\end{document}

Subcaptionbox aligning the subfigure subcaptions properly

The first is with subfigures while the other is with subcaptionbox.

enter image description here

\documentclass{article}
\usepackage{graphicx}
\usepackage{subcaption}
\usepackage{tikz}
%\usepackage{showframe}


\newcommand{\firstPic}{
\def\angle{0}
\def\radius{3}
\def\cyclelist{{"orange","blue","red","green"}}
\newcount\cyclecount \cyclecount=-1
\newcount\ind \ind=-1
\begin{tikzpicture}[scale=0.45,nodes = {font=\sffamily}]
  \foreach \percent/\name in {
      72/Female (13),
         28/Male (5)
    } {
      \ifx\percent\empty\else               % If \percent is empty, do nothing
        \global\advance\cyclecount by 1     % Advance cyclecount
        \global\advance\ind by 1            % Advance list index
        \ifnum3<\cyclecount                 % If cyclecount is larger than list
          \global\cyclecount=0              %   reset cyclecount and
          \global\ind=0                     %   reset list index
        \fi
        \pgfmathparse{\cyclelist[\the\ind]} % Get color from cycle list
        \edef\color{\pgfmathresult}         %   and store as \color
        % Draw angle and set labels
        \draw[fill={\color!50},draw={\color}] (0,0) -- (\angle:\radius)
          arc (\angle:\angle+\percent*3.6:\radius) -- cycle;
        \node at (\angle+0.5*\percent*3.6:0.7*\radius) {\percent\,\%};
        \node[pin=\angle+0.5*\percent*3.6:\name]
          at (\angle+0.5*\percent*3.6:\radius) {};
        \pgfmathparse{\angle+\percent*3.6}  % Advance angle
        \xdef\angle{\pgfmathresult}         %   and store in \angle
      \fi
    };
\end{tikzpicture}
}
\newcommand{\secondPic}{
\def\angle{0}
\def\radius{3}
\def\cyclelist{{"orange","blue","red","green"}}
\newcount\cyclecount \cyclecount=-1
\newcount\ind \ind=-1
\begin{tikzpicture}[scale=0.45,nodes = {font=\sffamily}]
  \foreach \percent/\name in {
      47/Female (22),
        53/Male (25)
    } {
      \ifx\percent\empty\else               % If \percent is empty, do nothing
        \global\advance\cyclecount by 1     % Advance cyclecount
        \global\advance\ind by 1            % Advance list index
        \ifnum3<\cyclecount                 % If cyclecount is larger than list
          \global\cyclecount=0              %   reset cyclecount and
          \global\ind=0                     %   reset list index
        \fi
        \pgfmathparse{\cyclelist[\the\ind]} % Get color from cycle list
        \edef\color{\pgfmathresult}         %   and store as \color
        % Draw angle and set labels
        \draw[fill={\color!50},draw={\color}] (0,0) -- (\angle:\radius)
          arc (\angle:\angle+\percent*3.6:\radius) -- cycle;
        \node at (\angle+0.5*\percent*3.6:0.7*\radius) {\percent\,\%};
        \node[pin=\angle+0.5*\percent*3.6:\name]
          at (\angle+0.5*\percent*3.6:\radius) {};
        \pgfmathparse{\angle+\percent*3.6}  % Advance angle
        \xdef\angle{\pgfmathresult}         %   and store in \angle
      \fi
    };
\end{tikzpicture}
}



\begin{document}

\begin{figure}
  \centering
  \begin{subfigure}{0.45\textwidth}
    \centering
    \firstPic
  \caption{Frist subfigure}
  \end{subfigure}
  \hfill
  \begin{subfigure}{0.45\textwidth}
    \centering
    \secondPic
  \caption{Second subfigure}
  \end{subfigure}
\caption{MAIN caption for SUBFIGURES}
\end{figure}


\begin{figure}
  \centering
        \subcaptionbox{First subcaptionbox}[0.45\textwidth]{\centering \firstPic}
          \hfill
        \subcaptionbox{Second subcaptionbox}[0.45\textwidth]{\centering \secondPic}
\caption{MAIN caption for SUBCAPTIONBOX}
\end{figure}

\end{document}

P.s. I am thankful to Tor for helping me in the chat here.

  • 1
    Can (a) and (b) be on the same line? – Léo Léopold Hertz 준영 Nov 23 '16 at 23:26
  • @Masi that is already answered here, you can solve it with \subcaptionbox. – hhh Nov 23 '16 at 23:39
  • Please, see the body for my attempt with \subcaptionbox. – Léo Léopold Hertz 준영 Nov 24 '16 at 0:00
  • @Masi see the newest update for the solution. – hhh Nov 24 '16 at 0:12

Not the answer you're looking for? Browse other questions tagged or ask your own question.