8

I want to create a pie chart with labels (one blank an one with percentage for the teacher, the mwe is the teachers version) so that my students have to fill the percentage in by themselves.

So far I created a pie chart using the code given in the answer here

How to draw Bar & Pie Chart

and then I used labels from the code given in the answer here

Create a ring diagram in TeX

Now I have this

enter image description here

The node in the violett part is the one I created manually and the other ones are implemented in the code, but I don't know what to change so that the automatic generated ones look like the one I created manually

My MWE

    \documentclass[11pt]{article}


\usepackage{tikz}
\usetikzlibrary{arrows}

\usepackage{xcolor}

\usepackage[utf8]{inputenc}

\definecolor{rosso}{RGB}{220,57,18}
\definecolor{giallo}{RGB}{255,153,0}
\definecolor{blu}{RGB}{102,140,217}
\definecolor{verde}{RGB}{16,150,24}
\definecolor{viola}{RGB}{153,0,153}

\makeatletter

\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 * -(.5/50) + 1) ,1)}


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






        \global\let\curA\nextA
    }
    \end{scope}
}

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


\begin{document}


\begin{tikzpicture}
[
    pie chart,
    slice type={comet}{blu},
    slice type={legno}{rosso},
    slice type={coltello}{giallo},
    slice type={sedia}{viola},
    slice type={caffe}{verde},
    pie values/.style={font={\small}},
    scale=2
]

\pie{Sommerjobs in Österreich}{52/comet,12/legno,20/sedia,16/coltello}


\legend[shift={(-1cm,-1cm)}]{{Eisverkäufer}/comet, {Schwimmbad}/legno, {Zettelverteiler}/coltello}
\legend[shift={(1cm,-1cm)}]{{Kellner}/sedia}




\draw [*-,thin] (0.6,-0.2)  -- (0.7,-0.2 + 0.5ex) -- (2,0.5ex) node[above, near end]{20\%};



\end{tikzpicture}


\end{document}

2 Answers 2

8

Does this look OK? I calculate coefficients \xsign/\ysign that have the value 1 or -1, and use those to determine the direction in which the lines are drawn.

output of code

\documentclass[11pt]{article}
\usepackage{tikz} % loads xcolor
\usetikzlibrary{arrows}


\usepackage[utf8]{inputenc}

\definecolor{rosso}{RGB}{220,57,18}
\definecolor{giallo}{RGB}{255,153,0}
\definecolor{blu}{RGB}{102,140,217}
\definecolor{verde}{RGB}{16,150,24}
\definecolor{viola}{RGB}{153,0,153}


\tikzset{
  chart/.style={
    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}},
  },
  pie chart/.style={
    chart,
    slice/.style={line cap=round, line join=round, very thick,draw=white},
    pie title/.style={font={\bfseries}},
    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{\radius}{1}
    \def\Centre{(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] \Centre
            -- +(\curA:\radius)
            arc (\curA:\nextA:\radius)
            -- cycle;

   % to determine direction of lines (left/right, up/down
   \pgfmathsetmacro{\ysign}{ifthenelse(mod(\midA,360)<=180,1,-1)}
   \pgfmathsetmacro{\xsign}{ifthenelse(mod(\midA-90,360)<=180,-1,1)}

   \begin{pgfonlayer}{foreground}
        \draw[*-,thin] \Centre ++(\midA:\radius/2) -- 
                               ++(\xsign*0.07*\radius,\ysign*0.2*\radius) -- 
                               ++(\xsign*\radius,0) 
                      node[above,near end,pie values,values of \s]{$\v\%$};
   \end{pgfonlayer}


        \global\let\curA\nextA
    }
    \end{scope}
}

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


\begin{document}


\begin{tikzpicture}
[
    pie chart,
    slice type={comet}{blu},
    slice type={legno}{rosso},
    slice type={coltello}{giallo},
    slice type={sedia}{viola},
    slice type={caffe}{verde},
    pie values/.style={font={\small}},
    scale=2
]

\pie{Sommerjobs in Österreich}{52/comet,12/legno,20/sedia,16/coltello}


\legend[shift={(-1cm,-1cm)}]{{Eisverkäufer}/comet, {Schwimmbad}/legno, {Zettelverteiler}/coltello}
\legend[shift={(1cm,-1cm)}]{{Kellner}/sedia}


\end{tikzpicture}
\end{document}
0

The wheelchart package, which I wrote, can be used.

The percentage is obtained with \WCperc.

The gap between the slices is obtained with the key gap=0.03.

The legend is determined by the key legend. This is a tabular which is placed in a \node. The rows are determined by the key legend row. The result of all rows can be obtained with \WClegend.

The sloped lines are obtained with the key lines. The horizontal extensions of the lines are obtained with the key lines ext.

The dots at the start of the lines are obtained with a decoration given to the key lines style.

The starting point of the lines in the first and third slice are shifted with respectively the keys lines angle shift{1} and lines angle shift{3}.

enter image description here

\documentclass[border=6pt]{standalone}
\usepackage{wheelchart}
\usetikzlibrary{decorations.markings}
\usepackage{siunitx}
\begin{document}
\definecolor{blu}{RGB}{102,140,217}
\definecolor{giallo}{RGB}{255,153,0}
\definecolor{rosso}{RGB}{220,57,18}
\definecolor{viola}{RGB}{153,0,153}
\begin{tikzpicture}
\wheelchart[
  counterclockwise,
  data=\WCperc,
  data style={shift={(0,0.1)}},
  gap=0.03,
  legend columns=2,
  legend row={\tikz\fill[\WCvarB,draw=black] (0,0) rectangle (0.3,0.3); & \WCvarC},
  legend={
    \node[anchor=north] at (0,-2.5) {%
      \begin{tabular}{*{2}{l@{ }l}}%
      \WClegend%
      \end{tabular}%
    };
  },
  lines=0.5,
  lines angle shift{1}=20,
  lines angle shift{3}=-20,
  lines ext=2,
  lines ext left anchor=base west,
  lines ext right anchor=base east,
  lines sep=-1,
  lines style={
    postaction=decorate,
    decoration={
      markings,
      mark=at position 0 with {
        \fill (0,0) circle[radius=0.1];
      }
    }
  },
  radius={0}{2},
  title=Sommerjobs in Österreich,
  title style={font=\bfseries}
]{%
  52/blu/Eisverkäufer,
  12/rosso/Schwimmbad,
  20/viola/Kellner,
  16/giallo/Zettelverteiler%
}
\end{tikzpicture}
\end{document}

You must log in to answer this question.

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