[Risolto] “Marcatura” dei grafici a barre con pgfplots

  • Questo topic ha 6 risposte, 3 partecipanti ed è stato aggiornato l'ultima volta 14 anni fa da Liverpool.
  • Creatore
    Topic
  • #78433
    Up
    0
    Down
    ::


    Ciao a tutti!
    Ho prodotto diversi grafici a barre con pgfplots per la tesi, e adesso dovrei marcare le singole barre con un simbolino in cima per indicare la significatività statistica di ciascuna (riportata poi in caption): così su una barra ci sarà un *, su un’altra un #, su un’altra ancora un § e così via.
    Le opzioni nodes near coords e point meta=explicit symbolic permettono questo, specificando poi il simbolo fra parentesi quadre alla coordinata desiderata.

    Peccato che il simbolo viene prodotto ad una distanza fissa dal bordo superiore della barra; e questo è un problema grosso perchè le barre hanno la deviazione standard, e finisce che simbolo e deviazione standard collidono.

    L’esempio minimo spiegherà meglio:

    `
    \documentclass[10pt, a4paper, twoside,openright, BCOR5mm]{scrbook}

    \usepackage{etex}

    \usepackage[T1]{fontenc}
    \usepackage[utf8]{inputenc}
    \usepackage[italian]{babel}

    \usepackage{mparhack}
    \usepackage[eulermath]{classicthesis}
    \usepackage{arsclassica}

    \usepackage{pgfplots}
    \pgfplotsset{/pgf/number format/use comma, compat=newest}

    \usepackage{siunitx}

    \begin{document}

    \begin{figure}[htbp]
    \centering
    \begin{tikzpicture}
    \begin{axis}[
    %enlarge x limits=0.40,
    legend style={at={(0.5,-0.12)}, anchor=north,legend columns=-1},
    %width=0.75\textwidth,
    bar width=24,
    ybar,
    ymin=0, ymax=10,
    minor y tick num=3,
    xtick=data,
    ymajorgrids=true,
    ylabel={Area (\si{\square\micro\meter})},
    xtick pos=left,
    symbolic x coords={NUCLEO},
    ]

    \addplot+[nodes near coords, point meta=explicit symbolic,
    nodes near coords align={anchor= south},
    error bars/.cd, y dir=both, y explicit]
    coordinates{
    (NUCLEO, 7.17) +- (0.26, 0.26) [§]
    };

    \addplot+[nodes near coords, point meta=explicit symbolic, error bars/.cd, y dir=both, y explicit]
    coordinates{
    (NUCLEO, 7.5) +- (0.36, 0.36) [\#]
    };

    \legend{CTRL, BTZ, FU}
    \end{axis}
    \end{tikzpicture}
    \caption{§:~$p<0,0006$; \#:~$p<0,05$}
    \end{figure}
    \end{document}
    `

    La cosa assurda è che non c’è modo di regolare a piacere la distanza (o almeno non l’ho trovato), e pgfplots non sembra accorgersi che c’è anche la deviazione standard regolandosi di conseguenza. Il meglio che si può fare è mettere il simbolo sui lati della barra (cambiando la anchor), ma lo trovo veramente brutto

    Si riesce a sistemare la cosa? Perchè è veramente comoda la funzione, altrimenti dovrei metterli a mano sul pdf.

    Grazie!

    PS: ho provato anche le indicazioni del punto 4.16 Custom Annotations della guida di pgfplots, ma mi da un’altra serie di problemi (magari ne parlo dopo se viene fuori il discorso)

Visualizzazione 5 filoni di risposte
  • Autore
    Risposte
    • #78434
      robitex
      Amministratore del forum
        Up
        0
        Down
        ::


        Ciao.
        Non puoi semplicemente usare comandi \draw con il sistema di coordinate axis cs?
        Un saluto.
        R.

      • #78435
        Liverpool
        Partecipante
          Up
          0
          Down
          ::


          Seguendo la strada delle annotazioni personalizzate, potresti fare una cosa del genere:
          `\documentclass{standalone}

          \usepackage{pgfplots}
          \usetikzlibrary{calc}
          \pgfplotsset{/pgf/number format/use comma, compat=newest}
          \usepackage{siunitx}

          \begin{document}
          \begin{tikzpicture}
          \begin{axis}[
          %enlarge x limits=0.40,
          legend style={at={(0.5,-0.12)}, anchor=north,legend columns=-1},
          %width=0.75\textwidth,
          bar width=24pt,
          ybar,
          ymin=0, ymax=10,
          minor y tick num=3,
          ymajorgrids=true,
          ylabel={Area (\si{\square\micro\meter})},
          xtick pos=left,
          xtick={1}, xticklabel={NUCLEO},
          ]

          \addplot+ [error bars/.cd, y dir=both, y explicit]
          coordinates{(1, 7.17) +- (0.26, 0.26)};
          \draw ($(axis cs:1,7.43) + (-13pt,0)$) node [blue, anchor=south] {\S};

          \addplot+ [error bars/.cd, y dir=both, y explicit]
          coordinates{(1, 7.5) +- (0.36, 0.36)};
          \draw ($(axis cs:1,7.86) + (13pt,0)$) node [red, anchor=south] {\#};

          \legend{CTRL, BTZ}
          \end{axis}
          \end{tikzpicture}
          \end{document}`
          [tt]13pt[/tt] sono la somma di mezza larghezza delle barre (24 pt) + mezzo bar shift (2 pt). Nota come ho dovuto trattare la tacchetta sull’asse orizzontale diversamente da te.
          Indicati con \(x\) l’ascissa comune alle barre, con \(w\) la larghezza delle barre, con \(d\) lo scostamento tra barre adiacenti, con \(n\) il numero di barre con la stessa tacca e con \(i\) la i-esima barra a partire dalla più a sinistra, la formula generale per trovare l’ascissa delle etichette è
          \[x-\frac{n-1}{2}(w+d)+(i-1)(w+d)=x+\left(i-\frac{n+1}{2}\right)(w+d)\;,\quad i=1,\ldots,n\]
          Il secondo addendo corrisponde a [tt]-13pt[/tt] e [tt]13pt[/tt] nel mio codice.

          Ciao

        • #78436
          Up
          0
          Down
          ::

          robitex” post=77541Ciao.
          Non puoi semplicemente usare comandi \draw con il sistema di coordinate axis cs?
          Un saluto.
          R.

          Infatti è quello che proponeva, più o meno, il paragrafo sulle Custom Annotations; il problema è che l’ho trovato spiegato veramente male e sopratutto con pochi esempi (invece mi sembra una funzione molto utile), e i comandi di Tikz non li so proprio usare.

          Il suo manuale poi mi scoraggia: infatti ho cercato lì qualche info su \draw, ma non ci ho cavato un ragno dal buco.Se non era per l’articolo di Lorenzo e Tommaso poi non mi sarei mai sognato di crearmi i grafici, ma li avrei senz’altro importati.

          Con la conoscenza empirica dell’esempio di Liverpool magari ci capirò di più.

        • #78437
          Liverpool
          Partecipante
            Up
            0
            Down
            ::


            Non ti scoraggiare! Ti allego anche un esempio di automazione che può essere migliorato. In particolare, i colori vanno inseriti manualmente (non ho capito come recuperarli automaticamente dalla lista di pgfplots). Se usi la mappa dei colori predefinita, l’ordine lo trovi sul manuale nel codice all’inizio di pag. 144. Inoltre non riesco ad usare alcuni caratteri speciali come etichette (ad esempio §). Qui qualcun altro ci potrà aiutare 😉

            Ricordati di aggiornare il valore di n in [tt]\def\n{3}[/tt] se cambi il numero di barre.
            `\documentclass{standalone}

            \usepackage{pgfplots}
            \usetikzlibrary{calc}
            \pgfplotsset{/pgf/number format/use comma, compat=newest}
            \usepackage{siunitx}

            \begin{document}
            \begin{tikzpicture}
            \def\x{1}
            \def\n{3}
            \def\w{24pt}
            \def\d{2pt}

            \begin{axis}[ymin=0, ymax=10, bar width=\w, ybar=\d, xtick={\x}, xticklabel={NUCLEO}, xtick pos=left,
            ymajorgrids=true, minor y tick num=3, ylabel={Area (\si{\square\micro\meter})},
            legend style={at={(0.5,-0.12)}, anchor=north,legend columns=-1}]

            \foreach [count=\i] \y/\e/\tx/\colore in {7.17/0.26/\%/blue, 7.5/0.36/\#/red, 4/1/a/brown!60!black}
            {
            \addplot+ [error bars/.cd, y dir=both, y explicit]
            coordinates {(\x,\y) +- (\e,\e)};
            \pgfmathparse{\y+\e}
            \let\z\pgfmathresult
            \edef\temp
            {\noexpand\draw ($(axis cs:\x,\z) + {\i-0.5*\n-0.5}*(\w+\d,0)$) node [\colore, anchor=south] {\tx};}
            \temp
            }
            \legend{CTRL, BTZ, booh?}
            \end{axis}
            \end{tikzpicture}
            \end{document}`
            Ciao

            P.S: Ho dimenticato di dirti che ogni elemento separato da virgola del foreach dichiara una ordinata/relativo errore/relativa etichetta/relativo colore.

          • #78438
            Up
            0
            Down
            ::

            Liverpool” post=77542Seguendo la strada delle annotazioni personalizzate, potresti fare una cosa del genere:
            `\begin{document}
            \begin{tikzpicture}
            \begin{axis}[
            %enlarge x limits=0.40,
            legend style={at={(0.5,-0.12)}, anchor=north,legend columns=-1},
            %width=0.75\textwidth,
            bar width=24pt,
            ybar,
            ymin=0, ymax=10,
            minor y tick num=3,
            ymajorgrids=true,
            ylabel={Area (\si{\square\micro\meter})},
            xtick pos=left,
            xtick={1}, xticklabel={NUCLEO},
            ]

            \addplot+ [error bars/.cd, y dir=both, y explicit]
            coordinates{(1, 7.17) +- (0.26, 0.26)};
            \draw ($(axis cs:1,7.45) + (-13pt,0)$) node [blue, anchor=south] {\S};

            \addplot+ [error bars/.cd, y dir=both, y explicit]
            coordinates{(1, 7.5) +- (0.36, 0.36)};
            \draw ($(axis cs:1,7.88) + (13pt,0)$) node [red, anchor=south] {\#};

            \legend{CTRL, BTZ}
            \end{axis}
            \end{tikzpicture}
            \end{document}`
            [tt]13pt[/tt] sono la somma di mezza larghezza delle barre (24 pt) + mezzo bar shift (2 pt). Nota come ho dovuto trattare la tacchetta sull’asse orizzontale diversamente da te.
            Indicati con \(x\) l’ascissa comune alle barre, con \(w\) la larghezza delle barre, con \(d\) lo scostamento tra barre adiacenti, con \(n\) il numero di barre con la stessa tacca e con \(i\) la i-esima barra a partire dalla più a sinistra, la formula generale per trovare l’ascissa delle etichette è
            \[x-\frac{n-1}{2}(w+d)+(i-1)(w+d)=x+\left(i-\frac{n+1}{2}\right)(w+d)\;,\quad i=1,\ldots,n\]
            Il secondo addendo corrisponde a [tt]-13pt[/tt] e [tt]13pt[/tt] nel mio codice.

            Ciao

            Grazie Liverpool, il tuo codice funziona a meraviglia; l’unico inconveniente, richiedeva la libreria \usetikzlibrary{calc}, ma me l’ha segnalato l’editor.

          • #78439
            Liverpool
            Partecipante
              Up
              0
              Down
              ::

              Matteo Colombo” post=77564Grazie Liverpool, il tuo codice funziona a meraviglia; l’unico inconveniente, richiedeva la libreria \usetikzlibrary{calc}, ma me l’ha segnalato l’editor.

              Prego. Hai ragione: non so perché nel copia-incolla era saltato il preambolo. Ora l’ho corretto a beneficio degli altri utenti.

              Ciao

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

          Go to top