Istogramma con pgfplots: non mi crea le barre agli estremi

  • Creatore
    Topic
  • #76211
    Up
    0
    Down
    ::


    Ciao a tutti.

    Nella tesi dovrò inserire alcuni istogrammi, e ho deciso di farli con pgfplots; ho usato l’articolo di Lorenzo Pantieri come guida.

    Tuttavia dovrei assegnare a ciascuna barra un colore diverso; non ho trovato sul manuale come farlo (quindi penso non si possa fare), perciò ho pensato che bastava scorporare i dati in diversi \addplot, invece di metterli tutti in uno (esattamente come si farebbe con un grafico a linee).

    Peccato che, compilando, le etichette sull’asse x mi vengono stampate tutte, mentre mancano le barre agli estremi (infatti 9 etichette, 7 barre centrali), e le barre che mi vengono stampate sono anche spostate rispetto alla loro etichetta.

    Questo è l’esempio minimo:

    `
    % !TEX encoding = UTF-8
    % !TEX TS-program = pdflatex
    % !TEX spellcheck = it-IT

    \documentclass[10pt, a4paper]{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}

    \areaset[current]{336pt}{750pt}
    \setlength{\marginparwidth}{7em}
    \setlength{\marginparsep}{2em}

    \begin{document}

    \begin{figure}
    \centering
    \begin{tikzpicture}
    \begin{axis}[
    width=\textwidth,
    ybar,
    ymin=0,ymax=100,
    %xtick=data,
    ymajorgrids=true,
    ylabel={\% di inibizione},
    xtick pos=left,
    x tick label style=%
    {rotate=60,anchor=east},
    %xticklabel interval boundaries,
    xtick={
    A,
    B,
    C,
    D,
    E,
    F,
    G,
    H,
    I,
    %L
    },
    symbolic x coords={
    A,
    B,
    C,
    D,
    E,
    F,
    G,
    H,
    I,
    %L
    },
    title={PBMC}
    ]

    \addplot+[
    %ybar interval,
    fill=cyan,
    draw=black]
    coordinates{
    (A, 10)};

    \addplot+[
    %ybar interval,
    fill=green,
    draw=black]
    coordinates{
    (B, 20)};

    \addplot+[
    %ybar interval,
    fill=gray,
    draw=black]
    coordinates{
    (C, 30)};

    \addplot+[
    %ybar interval,
    fill=orange,
    draw=black]
    coordinates{
    (D, 40)};

    \addplot+[
    %ybar interval,
    fill=cyan,
    draw=black]
    coordinates{
    (E, 50)};

    \addplot+[
    %ybar interval,
    fill=purple,
    draw=black]
    coordinates{
    (F, 60)};

    \addplot+[
    %ybar interval,
    fill=olive,
    draw=black]
    coordinates{
    (G, 70)};

    \addplot+[
    %ybar interval,
    fill=white,
    draw=black]
    coordinates{
    (H, 80)};

    \addplot+[
    %ybar interval,
    fill=red,
    draw=black]
    coordinates{
    (I, 90)};

    %\addplot[
    %%ybar interval,
    %fill=red,
    %draw=black]
    %coordinates{
    %(L, 0)};

    \end{axis}
    \end{tikzpicture}
    \caption{Inibizione}
    \label{fig:inibizione}
    \end{figure}

    \end{document}
    `

    Il bello è che:

    • non sembra dipendere dal numero di barre (e quindi da un problema di dimensioni del grafico): qualsiasi sia il numero, quelle agli estremi sono sempre tagliate
    • togliendo ybar e passando da istogramma a punti, i punti vengono stampati tutti!

    Sinceramente non saprei proprio cosa fare a questo punto. Qualcuno saprebbe aggiustare il problema?

    Grazie!

Visualizzazione 3 filoni di risposte
  • Autore
    Risposte
    • #76212
      Up
      0
      Down
      ::


      Ciao,
      ho giocato un po’ col tuo codice ed ho capito che pgfplots ragiona così: ad ogni comando [tt]\addplot[/tt] lui si aspetta gli ingressi per tutte le etichette, quindi ogni [tt]\addplot[/tt] in più fa si che ogni etichetta abbia bisogno di più spazio e quindi le barre esterne vengono spinte fuori dal grafico. Per farle comparire ti basta inserire come opzione degli assi [tt]enlarge x limits=0.5[/tt]. Quindi sicuramente questo non è il modo corretto per risolvere il problema. Cercando sul manuale non ho trovato molto, ma credo che un istogramma con una sola serie di dati (cioè quello che hai tu) rappresenti concettualmente un insieme, quindi credo sia sbagliato, dal punto di vista della visualizzazione dell’informazione, mettere barre con colore diverso.
      Comunque non sono però riuscito a capire come distanziare le etichette in modo uniforme, in teoria dovrebbe farlo in automatico ma non riesco.

      Magari aspettiamo qualche altro contributo
      Ciao
      Fra

      EDIT: sono riuscito, bastava giocare con il valore passato a [tt]enlarge x limits[/tt], la larghezza del grafico e delle barre:
      `\documentclass[10pt, a4paper]{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}

      \areaset[current]{336pt}{750pt}
      \setlength{\marginparwidth}{7em}
      \setlength{\marginparsep}{2em}

      \begin{document}

      \begin{figure}
      \centering
      \begin{tikzpicture}
      \begin{axis}[enlarge x limits=0.1,bar width=3pt,
      width=1.3\textwidth,%ybar interval,x tick label as interval=false,
      ybar,
      ymin=0,ymax=100,
      %xtick=data,
      %ymajorgrids=true,
      ylabel={\% di inibizione},
      xtick pos=left,
      x tick label style={rotate=60,anchor=east},
      %xticklabel interval boundaries,
      xtick={A,B,C,D,E,F,G,H,I},
      symbolic x coords={A,B,C,D,E,F,G,H,I},
      title={PBMC}]

      \addplot+[
      %ybar interval,
      fill=cyan,
      draw=black]
      coordinates{
      (A, 10) (B,4) (C,7) (D,6) (E,40) (F,20) (G,30) (H,50) (I,22)};
      \addplot+[
      %ybar interval,
      fill=cyan,
      draw=black]
      coordinates{
      (A, 10) (B,4) (C,7) (D,6) (E,40) (F,20) (G,30) (H,50) (I,22)};
      \addplot+[
      %ybar interval,
      fill=cyan,
      draw=black]
      coordinates{
      (A, 10) (B,4) (C,7) (D,6) (E,40) (F,20) (G,30) (H,50) (I,22)};
      \addplot+[
      %ybar interval,
      fill=cyan,
      draw=black]
      coordinates{
      (A, 10) (B,4) (C,7) (D,6) (E,40) (F,20) (G,30) (H,50) (I,22)};
      \addplot+[
      %ybar interval,
      fill=cyan,
      draw=black]
      coordinates{
      (A, 10) (B,4) (C,7) (D,6) (E,40) (F,20) (G,30) (H,50) (I,22)};

      \end{axis}
      \end{tikzpicture}
      \caption{Inibizione}
      \label{fig:inibizione}
      \end{figure}

      \end{document}
      `
      ovviamente non risolve il problema, è solo per mostrare perchè pgfplots si comporta così.

    • #76213
      Liverpool
      Partecipante
        Up
        0
        Down
        ::


        In fondo gli istogrammi non sono altro che rettangoli, che possono essere definiti attraverso i due vertici in alto. Nel codice che segue non ci sono le tacche, perché mi sembrano superflue. Se ci tieni, si possono aggiungere, ma il codice si complica per via della griglia orizzontale.
        `\begin{tikzpicture}
        \begin{axis}[width=\textwidth, title=PBMC, ylabel={\% di inibizione}, ymajorgrids=true,
        xtick={1,…,9}, xticklabels={A,B,C,D,E,F,G,H,I}, xtick pos=left,
        x tick label style={rotate=60}, draw=black,
        % inserisci qui sotto i colori di riempimento in ordine di ascissa
        cycle list={fill=cyan, fill=green, fill=gray, fill=orange, fill=cyan, fill=purple,
        fill=olive, fill=white, fill=red}]
        \def\D{0.4} % è la semiampiezza delle barre (da 0 a 0.5)
        % inserisci qui gli ordinali delle barre e i rispettivi valori separati da una /
        \foreach \x/\y in {1/10,2/20,3/30,4/40,5/50,6/60,7/70,8/80,9/90}
        \addplot+ coordinates {(\x-\D,\y) (\x+\D,\y)} \closedcycle;
        \end{axis}
        \end{tikzpicture}`
        Ciao

        P.S. per Lorenzo: ecco un esempio in cui [tt]\addplot+[/tt] è necessario, se non vuoi ripetere 9 volte la riga di addplot per cambiare colore.

      • #76214
        lorenzo.pantieri
        Partecipante
          Up
          0
          Down
          ::

          Liverpool” post=75378P.S. per Lorenzo: ecco un esempio in cui [tt]\addplot+[/tt] è necessario, se non vuoi ripetere 9 volte la riga di addplot per cambiare colore.

          Certo, in quell’esempio \addplot+ è utilissimo; del resto, non ho mai detto che sia inutile, ho detto solo che è un comando relativamente avanzato. Del resto, anche l’esempio di codice che proponi lo è (per dirne una, c’è \foreach, di cui non facciamo menzione nell’articolo).

          Ciao,
          L.

        • #76215
          Up
          0
          Down
          ::


          Scusate l’assenza ma Internet singhiozza e la tesi chiama…

          Il codice di Liverpool funziona a meraviglia, ottengo proprio quello che dovevo riprodurre. Grazie!
          Alla fine arrovellandomi e spulciando un po’ su tex.stackexchange avevo intuito che bisognava mettere mano ad un \foreach, ma non sapevo poi come organizzare il codice.

          Grazie anche a Spike, che mi ha fatto scoprire l’utilissima chiave enlarge x limits, e a Lorenzo per avermi permesso, condensando l’impegnativo manuale di pgfplots in un agile “bigino”, di fare dei signori grafici senza più dover importare niente.

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

      Go to top