3

I'm trying to plot lots of ternary plots and pie charts. Ideally it should look smth like this: enter image description here enter image description here

The pie-chart (ternary plot) on the left-hand side serves as an explanation of what is happening, whereas on the right-hand side are the actual plots with data. I need to plot pie-charts (ternary plots) for 72 benchmark, so in total 72 pie-charts and 72 ternary plots. The current approach that I'm using implies a lot of code duplication and manual adjustment. Is there a smarter way of organizing it? Smth akin to grouplots? Moreover, my knowledge in pgfplots is very little, therefore the code needs a lot of polishing. In particular, I've no clue how to change font size in titles in pie-charts and how to move titles closer to the charts in ternary plots. Here's the MWE:

\documentclass{article}
\usepackage{pgfplots, pgfplotstable}
\usepgfplotslibrary{ternary, units}
\usepackage{tikz}
\begin{document}
\newcommand{\legend}[2][]{
 \begin{scope}[#1]
 \path
    \foreach \n/\s in {#2}
        {
              ++(0,-10pt) node[\s,legend box] {} +(5pt,0) node[legend label] {\n}
        }
;
\end{scope}
}
\tikzstyle{chart}=[
legend label/.style={font={\scriptsize},anchor=west,align=left},
legend box/.style={rectangle, draw, minimum size=5pt},
axis/.style={black,semithick,->},
axis label/.style={anchor=east,font={\tiny}},
]
\tikzstyle{pie chart}=[
chart,
slice/.style={line cap=round, line join=round, very thick,draw=white},
pie title/.style={font={\bf}},
slice type/.style 2 args={
    ##1/.style={fill=##2},
    values of ##1/.style={}
}
]
\pgfdeclarelayer{background}
\pgfdeclarelayer{foreground}
\pgfsetlayers{background,main,foreground}
\newcommand{\pie}[3][]{
\begin{scope}[#1]
\pgfmathsetmacro{\curA}{90}
\pgfmathsetmacro{\r}{1}
\def\c{(0,0)}
\node[pie title] at (90:1.3) {#2};
\foreach \v/\s in{#3}{
    \pgfmathsetmacro{\deltaA}{\v/100*360}
    \pgfmathsetmacro{\nextA}{\curA + \deltaA}
    \pgfmathsetmacro{\midA}{(\curA+\nextA)/2}

    \path[slice,\s] \c
        -- +(\curA:\r)
        arc (\curA:\nextA:\r)
        -- cycle;
    \pgfmathsetmacro{\d}{max((\deltaA * -(.4/50) + 1) , .5)}

    \begin{pgfonlayer}{foreground}
    \path \c -- node[pos=\d,pie values,values of \s]{$\v\%$} +(\midA:\r);
    \end{pgfonlayer}

    \global\let\curA\nextA
}
\end{scope}
}
\begin{figure}
\begin{minipage}{0.3\linewidth}
\begin{tikzpicture}
[
pie chart,
slice type={inlined}{lightgray},
slice type={noninlined}{darkgray},
pie values/.style={font={\tiny}},
scale=1.5
]
\pie{benchmark}{41/inlined,13/noninlined}
\legend[shift={(-1cm,-1cm)}]{{Inlined}/inlined, {Not inlined}/noninlined}

\end{tikzpicture}
\end{minipage}
\begin{minipage}{0.12\linewidth}
\begin{tikzpicture}
[
pie chart,
slice type={inlined}{lightgray},
slice type={noninlined}{darkgray},
pie values/.style={font={\tiny}},
scale=0.7
]
\pie{benchmark1}{14/inlined,43/noninlined}

\end{tikzpicture}
\end{minipage}
\begin{minipage}{0.2\linewidth}
\begin{tikzpicture}
[
pie chart,
slice type={inlined}{lightgray},
slice type={noninlined}{darkgray},
pie values/.style={font={\tiny}},
scale=0.7
]
\pie{benchmark2}{34/inlined,9/noninlined}
\end{tikzpicture}
\end{minipage}
\begin{minipage}{0.12\linewidth}
\begin{tikzpicture}
[
pie chart,
slice type={inlined}{lightgray},
slice type={noninlined}{darkgray},
pie values/.style={font={\tiny}},
scale=0.7
]
\pie{benchmark3}{14/inlined,43/noninlined}
\end{tikzpicture}
\end{minipage}
\begin{minipage}{0.12\linewidth}
\begin{tikzpicture}
[
pie chart,
slice type={inlined}{lightgray},
slice type={noninlined}{darkgray},
pie values/.style={font={\tiny}},
scale=0.7
]
\pie{benchmark4}{34/inlined,9/noninlined}

 \end{tikzpicture}
 \end{minipage}
 \end{figure}

\begin{figure}
\begin{minipage}{0.4\linewidth}
\pgfplotsset{width=5cm}
\begin{tikzpicture}
\begin{ternaryaxis}[ 
xmin=0,
xmax=100,
ymin=0,
ymax=100,
zmin=0,
zmax=100, 
font=\scriptsize,
xlabel=frequency,
ylabel=size,
zlabel=monomorphism,
minor tick num=3,
grid=both, 
title={\textbf{benchmark}},
cycle list={{fill=darkgray, mark = triangle*}, 
{fill=lightgray, mark=*}},
legend cell align=left,
legend entries={Inlined, Not inlined},
legend style={mark size=2.6pt, at={(0,1)},
font=\scriptsize,
anchor=south,at={(axis description cs:0.5,-0.8)}},
mark size=2.6pt,
]
\addplot3+[only marks] 
 coordinates {
 (20, 20, 40)
 };
 \addplot3+[only marks] 
 coordinates {
 (10, 80, 10)
 };
\end{ternaryaxis}
\end{tikzpicture}
\end{minipage}
\pgfplotsset{width=3.3cm}
\begin{minipage}{0.1\linewidth}
\begin{tikzpicture}
 \begin{ternaryaxis}[
ticks=none,
 xmin=0,
 xmax=100,
 ymin=0,
 ymax=100,
 zmin=0,
 zmax=100, 
 mark size=2pt,
 font=\tiny,
 minor tick num=0,
 cycle list={{fill=darkgray, mark = triangle*}, 
 {fill=lightgray, mark=*}},
 title={\bf{benchmark1}},
 grid=both,
 minor tick num=2,
]
\addplot3+[only marks] 
 coordinates {
 (20, 40, 20)
 };
 \addplot3+[only marks] 
 coordinates {
 (10, 10, 80)
 };
\end{ternaryaxis}
\end{tikzpicture}
\end{minipage}
 \pgfplotsset{width=3.3cm}
  \begin{minipage}{0.1\linewidth}
  \begin{tikzpicture}
  \begin{ternaryaxis}[
  ticks=none,
 xmin=0,
xmax=100,
ymin=0,
ymax=100,
zmin=0,
zmax=100, 
mark size=2pt,
font=\tiny,
 minor tick num=2,
 grid=both,
 cycle list={{fill=darkgray, mark = triangle*}, 
 {fill=lightgray, mark=*}},
 title={\bf{benchmark2}}
 ]
\addplot3+[only marks] 
 coordinates {
 (15, 45, 40)
 };
 \addplot3+[only marks] 
 coordinates {
 (33, 33, 33)
 };
\end{ternaryaxis}
\end{tikzpicture}
\end{minipage}
\begin{minipage}{0.1\linewidth}
\begin{tikzpicture}
\begin{ternaryaxis}[
ticks=none,
 xmin=0,
 xmax=100,
 ymin=0,
 ymax=100,
 zmin=0,
 zmax=100, 
 mark size=2pt,
 font=\tiny,
 minor tick num=2,
 grid=both,
 cycle list={{fill=darkgray, mark = triangle*}, 
{fill=lightgray, mark=*}},
title={\bf{benchmark3}}
]
\addplot3+[only marks] 
 coordinates {
 (15, 45, 40)
 };
 \addplot3+[only marks] 
 coordinates {
 (33, 33, 33)
 };
 \end{ternaryaxis}
 \end{tikzpicture}
\end{minipage}
\begin{minipage}{0.1\linewidth}
\begin{tikzpicture}
\begin{ternaryaxis}[
 ticks=none,
xmin=0,
xmax=100,
ymin=0,
ymax=100,
zmin=0,
zmax=100, 
mark size=2pt,
font=\tiny,
minor tick num=2,
grid=both,
cycle list={{fill=darkgray, mark = triangle*}, 
{fill=lightgray, mark=*}},
title={\bf{benchmark4}}
]
\addplot3+[only marks] 
 coordinates {
 (15, 45, 40)
 };
 \addplot3+[only marks] 
 coordinates {
 (33, 33, 33)
 };
\end{ternaryaxis}
\end{tikzpicture}
\end{minipage}
\end{figure}
\end{document}
  • I believe that your example would be easier if you would use styles. A style can be defined by means of \pgfplotsset{the name/.style={xmin=0,xmax=100, cycle list=...}} in the preamble. Then, you could use \begin{ternaryaxis}[the name]. In addition, you could write macros which simplify the setup. You should also consider writing % after each \end{tikzpicture}, i.e. \end{tikzpicture}%. This removes spurious spaces. – Christian Feuersänger Jan 4 '14 at 19:34

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Browse other questions tagged or ask your own question.