Grafici a torta con pgf-tikz

  • Creatore
    Topic
  • #45312
    Up
    0
    Down
    ::


    Buongiorno a tutti 🙂
    Sto aiutando un’amica a scrivere la tesi in LaTeX ed è nata la necessità di tirare fuori qualche grafico a torta. Ho provato a farli in pgf-tikz; incollo il codice di seguito, che è modificato direttamente da un esempio trovato online.

    Viene bene, con un unico inconveniente: non ho capito come posso inserire delle percentuali decimali anzichè intere. Ho provato in vari modi a modificare il codice ma con nessun risultato. Qualcuno ha già avuto esperienze simili e riesce a darmi una mano?

    Grazie 🙂

    `% Pie chart

    % Author: Robert Vollmert
    \documentclass{article}

    \usepackage{calc}
    \usepackage{ifthen}
    \usepackage{tikz}
    %%%< \usepackage{verbatim} \usepackage[active,floats,tightpage]{preview} \PreviewEnvironment{tikzpicture} \setlength\PreviewBorder{5pt}% %%%>

    \begin{document}
    \begin{comment}
    :Title: Pie chart
    :Tags: Charts, Foreach

    This example shows how to draw a basic pie chart. Note that labels are automatically
    aligned and placed in a smart way. This makes the code more complicated. However,
    charts can now bee drawn without worrying about overlapping labels.

    :Author: Robert Vollmert
    \end{comment}

    \newcommand{\slice}[4]{
    \pgfmathparse{0.5*#1+0.5*#2}
    \let\midangle\pgfmathresult

    % slice
    \draw[thick,fill=black!10] (0,0) — (#1:1) arc (#1:#2:1) — cycle;

    % outer label
    \node[label=\midangle:#4] at (\midangle:1) {};

    % inner label
    \pgfmathparse{min((#2-#1-10)/110*(-0.3),0)}
    \let\temp\pgfmathresult
    \pgfmathparse{max(\temp,-0.5) + 0.8}
    \let\innerpos\pgfmathresult
    \node at (\midangle:\innerpos) {#3};
    }

    \begin{tikzpicture}[scale=3]
    \newcounter{a}
    \newcounter{b}
    \foreach \p/\t in {7/\textit{ante 1200}, 7/tra 1201 e 1300, 11/tra 1301 e 1400, 75/tra 1401 e 1600}
    {

    \setcounter{a}{\value{b}}
    \addtocounter{b}{\p}
    \slice{\thea/100*360}
    {\theb/100*360}
    {\p\%}{\t}
    }

    \end{tikzpicture}
    \end{document}`

Visualizzazione 8 filoni di risposte
  • Autore
    Risposte
    • #45313
      Up
      0
      Down
      ::


      Ciao.

      A questa pagina c’è un libro sul TikZ dove sono trattate i grafici a torta.

      http://math.et.info.free.fr/TikZ/Exemples.html

      a pag 91 del file.

      Saluti

      Michele

    • #45314
      Up
      0
      Down
      ::


      Grazie mille, non conoscevo questa risorsa, anche se il francese lo capisco solo ad orecchio, mi orienterò con un pò di codice 😀

      Che dire, grazie ancora 😉

    • #45315
      Up
      0
      Down
      ::


      se ho ben capito cosa vuoi ottenere, ecco cosa devi modificare:

      `% Pie chart

      % Author: Robert Vollmert
      \documentclass{article}

      \usepackage{calc}
      \usepackage{ifthen}
      \usepackage{tikz}
      %%%< \usepackage{verbatim} \usepackage[active,floats,tightpage]{preview} \PreviewEnvironment{tikzpicture} \setlength\PreviewBorder{5pt}% %%%>

      \begin{document}
      \begin{comment}
      :Title: Pie chart
      :Tags: Charts, Foreach

      This example shows how to draw a basic pie chart. Note that labels are automatically
      aligned and placed in a smart way. This makes the code more complicated. However,
      charts can now bee drawn without worrying about overlapping labels.

      :Author: Robert Vollmert
      \end{comment}

      \newcommand{\slice}[4]{
      \pgfmathparse{0.5*#1+0.5*#2}
      \let\midangle\pgfmathresult

      % slice
      \draw[thick,fill=black!10] (0,0) — (#1:1) arc (#1:#2:1) — cycle;

      % outer label
      \node[label=\midangle:#4] at (\midangle:1) {};

      % inner label
      \pgfmathparse{min((#2-#1-10)/110*(-0.3),0)}
      \let\temp\pgfmathresult
      \pgfmathparse{max(\temp,-0.5) + 0.8}
      \let\innerpos\pgfmathresult
      \node at (\midangle:\innerpos) {#3};
      }

      \begin{tikzpicture}[scale=3]
      \newcounter{a}
      \newcounter{b}
      % \setlength{myp}{0pt}
      \foreach \p/\t in {7/\textit{ante 1200}, 7/tra 1201 e 1300, 11/tra 1301 e 1400, 75/tra 1401 e 1600}
      {

      \setcounter{a}{\value{b}}
      \addtocounter{b}{\p}
      \pgfmathparse{\p/100}
      \let\myp\pgfmathresult

      \slice{\thea/100*360}
      {\theb/100*360}
      {\myp}{\t}
      }

      \end{tikzpicture}
      \end{document}`

    • #45316
      Up
      0
      Down
      ::


      Ciao capitalaslash,
      grazie della risposta.

      Le tue modifiche mi permettono di visualizzare i numeri decimali (e questo è un passo avanti), ma il mio obiettivo è non essere costretto ad utilizzare numeri interi per rappresentare le percentuali.

      Esempio, vorrei plottare queste percentuali:
      8,5 %
      5,5 %
      11 %
      75 %

      Solo che se inserisco delle virgole nei numeri la compilazione da errore. Purtroppo non mi sono mai cimentato con i calcoli in LaTeX e non riesco ancora ad orientarmi bene con l’eventuale sintassi.

    • #45317
      Up
      0
      Down
      ::


      `% Pie chart

      % Author: Robert Vollmert
      \documentclass{article}

      \usepackage{calc}
      \usepackage{ifthen}
      \usepackage{tikz}
      %%%< \usepackage{verbatim} \usepackage[active,floats,tightpage]{preview} \PreviewEnvironment{tikzpicture} \setlength\PreviewBorder{5pt}% %%%>

      \begin{document}
      \begin{comment}
      :Title: Pie chart
      :Tags: Charts, Foreach

      This example shows how to draw a basic pie chart. Note that labels are automatically
      aligned and placed in a smart way. This makes the code more complicated. However,
      charts can now bee drawn without worrying about overlapping labels.

      :Author: Robert Vollmert
      \end{comment}

      \newcommand{\slice}[4]{
      \pgfmathparse{0.5*#1+0.5*#2}
      \let\midangle\pgfmathresult

      % slice
      \draw[thick,fill=black!10] (0,0) — (#1:1) arc (#1:#2:1) — cycle;

      % outer label
      \node[label=\midangle:#4] at (\midangle:1) {};

      % inner label
      \pgfmathparse{min((#2-#1-10)/110*(-0.3),0)}
      \let\temp\pgfmathresult
      \pgfmathparse{max(\temp,-0.5) + 0.8}
      \let\innerpos\pgfmathresult
      \node at (\midangle:\innerpos) {#3};
      }

      \begin{tikzpicture}[scale=3]
      \newcounter{a}
      \newcounter{b}
      \foreach \p/\t in {85/\textit{ante 1200}, 55/tra 1201 e 1300, 110/tra 1301 e 1400, 750/tra 1401 e 1600}
      {

      \setcounter{a}{\value{b}}
      \addtocounter{b}{\p}
      \pgfmathparse{\p/10}
      \let\myp\pgfmathresult
      \slice{\thea/1000*360}
      {\theb/1000*360}
      {\myp\%}{\t}
      }

      \end{tikzpicture}
      \end{document}`

      quello che ho fatto e’ trasformare le percentuali in centesimi in percentuali in millesimi (che e’ un ossimoro… a quest’ora non so se c’e’ una parola italiana corretta per quest’espressione).
      comunque, se vuoi altre cifre decimali passa ai perdecimillesimi, ecc.

    • #45318
      Up
      0
      Down
      ::

      Ciao capitalaslash,
      grazie della risposta.

      Le tue modifiche mi permettono di visualizzare i numeri decimali (e questo è un passo avanti), ma il mio obiettivo è non essere costretto ad utilizzare numeri interi per rappresentare le percentuali.

      Esempio, vorrei plottare queste percentuali:
      8,5 %
      5,5 %
      11 %
      75 %

      Solo che se inserisco delle virgole nei numeri la compilazione da errore. Purtroppo non mi sono mai cimentato con i calcoli in LaTeX e non riesco ancora ad orientarmi bene con l’eventuale sintassi.

      Moltiplica per 10 (usa quindi 85, 55, 110 e 750); dove nella macro dell’esempio c’è 100, scrivi 1000.

      Questo esempio funziona solo con numeri interi, come hai visto, ma basta ricordare che 8.5 = 85/10. 🙂

      Ciao
      Enrico

    • #45319
      Up
      0
      Down
      ::


      che sciocco, non ci avevo pensato. come vedete a quest’ora siamo un pò tutti devastati 😀

      Potrei dichiarare il mio problema risolto, grazie mille!

    • #45320
      Up
      0
      Down
      ::


      Aggiungo: qualcuno ha anche idea di come colorare le varie fette del grafico? Ho provato a vedere il codice di alcuni grafici riportati in pgfmanual, ma quello da me postato sembra essere generato in maniera ricorsiva, mentre quello di pgfmanual imposta manualmente fetta per fetta tutti i colori… qualche idea? Devo proprio cambiare l’intero approccio del codice?

    • #45321
      Up
      0
      Down
      ::


      aggiungi un ulteriore paremetro nella slice per il colore del fill e impostalo con una lista.

Visualizzazione 8 filoni di risposte
  • Devi essere connesso per rispondere a questo topic.

Go to top