istogramma con pgfplots e CSV

  • Creatore
    Topic
  • #99637
    Up
    0
    Down
    ::


    Ciao a tutti! Ho bisogno dell’aiuto dei maghi ti TikZ.
    Devo disegnare un istogramma partendo da un file .csv, che trovate nel codice qui sotto, all’interno di filecontents.
    I problemi sono:
    1) sotto le barre dovrei inserire i dati contenuti nella colonna b, tenendo conto che
    2) siccome il grafico è molto largo, per evitare di accalcare i numeri,
    sarebbe bene che ci fosse l’etichetta solo sulla barra relativa al numero seguito da x (ovvero un’etichetta sì e un’etichetta no).
    3) Si dovrebbe riportare in qualche modo le undici lettere della colonna a
    sotto le etichette della colonna b, segnando la posizione con un filetto un po’ più spesso.
    4) Migliorare il grafico, per esempio eliminando il contorno delle barre, diminuire il corpo delle etichette.
    5) Il file va compilato con XeLaTeX e font Junicode. Possibilmente con numeri alti e bassi, ma questo non è tassativo.

    Il codice a cui sono arrivato, dopo una giornata di tentativi è il seguente:
    `
    % !TEX TS-program = XeLaTeX
    \documentclass{standalone}

    \usepackage{mathspec}
    \setprimaryfont[Numbers={OldStyle,Proportional}]{Junicode}

    \usepackage{pgfplots}
    \usepackage{pgfplotstable}
    \pgfplotstableset{col sep=comma}

    \begin{filecontents*}{chart.csv}
    a,b,c
    A,119x,47
    ,119y,45
    ,120x,44
    ,120y,44
    ,121x,42
    ,121y,44
    ,122x,44
    ,122y,44
    ,123x,44
    ,123y,44
    ,124x,44
    ,124y,44
    ,125x,44
    ,125y,43
    ,126x,45
    ,126y,44
    B,127x,43
    ,127y,43
    ,128x,43
    ,128y,43
    ,129x,42
    ,129y,44
    ,130x,43
    ,130y,43
    ,131x,43
    ,131y,43
    ,132x,44
    ,132y,45
    ,133x,43
    ,133y,44
    ,134x,43
    ,134y,43
    D,135x,47
    ,135y,47
    ,136x,47
    ,136y,47
    E,137x,45
    ,137y,45
    ,138x,45
    ,138y,45
    ,139x,45
    ,139y,45
    ,140x,45
    ,140y,45
    ,141x,45
    ,141y,45
    ,142x,45
    ,142y,45
    ,143x,45
    ,143y,45
    ,144x,45
    ,144y,45
    6,145x,46
    ,145y,46
    ,146x,46
    ,146y,46
    ,147x,46
    ,147y,46
    ,148x,46
    ,148y,46
    ,149x,46
    ,149y,46
    ,150x,46
    ,150y,46
    ,151x,46
    ,151y,46
    ,152x,46
    ,152y,46
    F,153x,48
    ,153y,48
    ,154x,48
    ,154y,48
    ,155x,48
    ,155y,48
    ,156x,48
    ,156y,48
    ,157x,48
    ,157y,48
    ,158x,48
    ,158y,48
    ,159x,48
    ,159y,50
    ,160x,48
    ,160y,47
    G,161x,47
    ,161y,47
    ,162x,47
    ,162y,47
    ,163x,47
    ,163y,47
    ,164x,47
    ,164y,47
    ,165x,47
    ,165y,47
    ,166x,47
    ,166y,47
    ,167x,47
    ,167y,47
    ,168x,47
    ,168y,47
    H,169x,46
    ,169y,46
    ,170x,46
    ,170y,46
    ,171x,46
    ,171y,46
    ,172x,46
    ,172y,46
    ,173x,46
    ,173y,46
    ,174x,46
    ,174y,46
    ,175x,46
    ,175y,46
    ,176x,46
    ,176y,46
    I,177x,48
    ,177y,48
    ,178x,48
    ,178y,48
    ,179x,48
    ,179y,48
    ,180x,48
    ,180y,48
    ,181x,48
    ,181y,48
    ,182x,48
    ,182y,48
    ,183x,48
    ,183y,47
    ,184x,48
    ,184y,48
    J,185x,49
    ,185y,49
    ,186x,49
    ,186y,49
    ,187x,49
    ,187y,49
    ,188x,41
    ,188y,51
    ,189x,30
    \end{filecontents*}
    \pgfplotstableread{chart.csv}\loadedtable

    \begin{document}

    \begin{tikzpicture}
    \begin{axis}[
    x post scale=10,
    y post scale =2,
    ybar,
    ymin=0,
    ymax=50,
    xmin=0,
    xtick=data,
    bar width=10pt,
    ybar interval=1,
    xtick pos=left,
    x tick label style={rotate=90,anchor=east},
    ]
    \addplot table[x expr=\coordindex,y expr=\thisrow{c}, col sep=semicolon]{\loadedtable};
    \end{axis}
    \end{tikzpicture}

    \end{document}`

    Grazie in anticipo!

    Ciao
    Ivan

Visualizzazione 6 filoni di risposte
  • Autore
    Risposte
    • #99638
      Liverpool
      Partecipante
        Up
        0
        Down
        ::


        Parti da questo codice (parziale):
        `\pgfplotstableread{chart.csv}\loadedtable

        % riscrive la colonna b cancellando le righe dispari
        \pgfplotstablemodifyeachcolumnelement{b}\of\loadedtable\as\cell{%
        \edef\cell{\ifodd\pgfplotstablerow\else\cell\fi}}

        \begin{document}
        \begin{tikzpicture}
        \begin{axis} [
        x post scale=10,
        y post scale=2,
        ybar,
        ybar interval, % <-- non accetta valori bar width=10pt, xmin=0, ymin=0, ymax=52, % <-- era 50 xtick pos=left, xticklabels from table={\loadedtable}{b}, x tick label style={rotate=90,anchor=east}, ] \addplot+ [draw=none] table [x expr=\coordindex, y expr=\thisrow{c}, col sep=semicolon]{\loadedtable}; \end{axis} \end{tikzpicture} \end{document}`

        ivan” post=993263) Si dovrebbe riportare in qualche modo le undici lettere della colonna a
        sotto le etichette della colonna b, segnando la posizione con un filetto un po’ più spesso.

        Non ho capito cosa vuoi fare. Per sotto le etichette intendi “sotto scritte in orizzontale” oppure, considerando che le etichette sono ruotate, “a destra in verticale”? E poi cos’è quel filetto di cui parli?

        ivan” post=993264) Migliorare il grafico, per esempio eliminando il contorno delle barre, diminuire il corpo delle etichette.

        Il corpo delle etichette si può ridurre, ad esempio con`ticklabel style={font=\footnotesize},`ma a me sembrano già piccole così.

        Ciao

      • #99639
        Up
        0
        Down
        ::


        Ti ringrazio. Quello che vorrei ottenere è questo (attenzione che a livello di codice, ne sono consapevole, è una porcheria):
        `

        % !TEX TS-program = XeLaTeX
        \documentclass{standalone}

        \usepackage{mathspec}
        \setprimaryfont[Numbers={Proportional},Scale=MatchLowercase]{Junicode}

        \usepackage{pgfplots}
        %\pgfplotsset{compat=1.7}
        %\pgfplotsset{xticklabel={\tick},scaled x ticks=false}
        %\pgfplotsset{plot coordinates/math parser=false}
        \usepackage{pgfplotstable}
        \pgfplotstableset{col sep=comma}

        \begin{filecontents*}{chart.csv}
        a,b,c,d
        1,119,47,x
        0,119,45,y
        0,120,44,x
        0,120,44,y
        0,121,42,x
        0,121,44,y
        0,122,44,x
        0,122,44,y
        0,123,44,x
        0,123,44,y
        0,124,44,x
        0,124,44,y
        0,125,44,x
        0,125,43,y
        0,126,45,x
        0,126,44,y
        2,127,43,x
        0,127,43,y
        0,128,43,x
        0,128,43,y
        0,129,42,x
        0,129,44,y
        0,130,43,x
        0,130,43,y
        0,131,43,x
        0,131,43,y
        0,132,44,x
        0,132,45,y
        0,133,43,x
        0,133,44,y
        0,134,43,x
        0,134,43,y
        4,135,47,x
        0,135,47,y
        0,136,47,x
        0,136,47,y
        5,137,45,x
        0,137,45,y
        0,138,45,x
        0,138,45,y
        0,139,45,x
        0,139,45,y
        0,140,45,x
        0,140,45,y
        0,141,45,x
        0,141,45,y
        0,142,45,x
        0,142,45,y
        0,143,45,x
        0,143,45,y
        0,144,45,x
        0,144,45,y
        6,145,46,x
        0,145,46,y
        0,146,46,x
        0,146,46,y
        0,147,46,x
        0,147,46,y
        0,148,46,x
        0,148,46,y
        0,149,46,x
        0,149,46,y
        0,150,46,x
        0,150,46,y
        0,151,46,x
        0,151,46,y
        0,152,46,x
        0,152,46,y
        7,153,48,x
        0,153,48,y
        0,154,48,x
        0,154,48,y
        0,155,48,x
        0,155,48,y
        0,156,48,x
        0,156,48,y
        0,157,48,x
        0,157,48,y
        0,158,48,x
        0,158,48,y
        0,159,48,x
        0,159,50,y
        0,160,48,x
        0,160,47,y
        8,161,47,x
        0,161,47,y
        0,162,47,x
        0,162,47,y
        0,163,47,x
        0,163,47,y
        0,164,47,x
        0,164,47,y
        0,165,47,x
        0,165,47,y
        0,166,47,x
        0,166,47,y
        0,167,47,x
        0,167,47,y
        0,168,47,x
        0,168,47,y
        9,169,46,x
        0,169,46,y
        0,170,46,x
        0,170,46,y
        0,171,46,x
        0,171,46,y
        0,172,46,x
        0,172,46,y
        0,173,46,x
        0,173,46,y
        0,174,46,x
        0,174,46,y
        0,175,46,x
        0,175,46,y
        0,176,46,x
        0,176,46,y
        10,177,48,x
        0,177,48,y
        0,178,48,x
        0,178,48,y
        0,179,48,x
        0,179,48,y
        0,180,48,x
        0,180,48,y
        0,181,48,x
        0,181,48,y
        0,182,48,x
        0,182,48,y
        0,183,48,x
        0,183,47,y
        0,184,48,x
        0,184,48,y
        11,185,49,x
        0,185,49,y
        0,186,49,x
        0,186,49,y
        0,187,49,x
        0,187,49,y
        0,188,41,r
        0,188,51,y
        0,189,30,r
        0,189,0,y
        \end{filecontents*}

        \pgfplotstableread{chart.csv}\loadedtable

        % riscrive la colonna b cancellando le righe dispari
        \pgfplotstablemodifyeachcolumnelement{b}\of\loadedtable\as\cell{%
        \edef\cell{\ifodd\pgfplotstablerow \else\cell\fi}}

        \begin{document}
        \begin{tikzpicture}[quire/.style ={font=\LARGE,yshift=-2cm},]
        \begin{axis} [
        xlabel style = {yshift=-2cm,font=\bfseries},
        % xlabel=Pages and quires,
        x post scale=10,
        y post scale=2,
        ybar,
        ybar interval, % <-- non accetta valori % bar width=2mm, xmin=0, ymin=20, ymax=52, % <-- era 50 xtick pos=left, xticklabels from table={\loadedtable}{b}, x tick label style={rotate=90,anchor=east}, xticklabel style={font=\LARGE,yshift=-2.225mm}, grid=none, xtick align=center, axis x line*=bottom, axis y line=left ] \addplot+ [fill=gray!50,draw=gray] table [x expr=\coordindex, y expr=\thisrow{c}, col sep=semicolon]{\loadedtable}; %\addplot+ [fill=gray,draw=black] % table [x expr=\coordindex, y expr=\thisrow{a}, col sep=semicolon]{\loadedtable}; \end{axis} \foreach \x in {71.20mm,142.40mm,160.2mm,231.4mm,302.6mm,373.8mm,445mm,516.2mm,587.4mm} \draw[draw=gray] (\x,-2) -- (\x,0); \foreach \x in {71.20mm,142.40mm,160.2mm,231.4mm,302.6mm,373.8mm,445mm,516.2mm,587.4mm} \draw[draw=gray,line width=3pt] (\x,-2mm) -- (\x,3mm); \foreach \z in {2.225mm,11.125mm,20.025mm,28.925mm,37.825mm,46.725mm,55.625mm,64.525mm,73.425mm,82.325mm,91.225mm,100.125mm,109.025mm,117.925mm,126.825mm,135.725mm,144.625mm,153.525mm,162.425mm,171.325mm,180.225mm,189.125mm,198.025mm,206.925mm,215.825mm,224.725mm,233.625mm,242.525mm,251.425mm,260.325mm,269.225mm,278.125mm,287.025mm,295.925mm,304.825mm,313.725mm,322.625mm,331.525mm,340.425mm,349.325mm,358.225mm,367.125mm,376.025mm,384.925mm,393.825mm,402.725mm,411.625mm,420.525mm,429.425mm,438.325mm,447.225mm,456.125mm,465.025mm,473.925mm,482.825mm,491.725mm,500.625mm,509.525mm,518.425mm,527.325mm,536.225mm,545.125mm,554.025mm,562.925mm,571.825mm,580.725mm,589.625mm,598.525mm,607.425mm,616.325mm,625.225mm} \node[] at (\z,2mm) {{\LARGE x}}; \foreach \w in {6.675mm,15.575mm,24.475mm,33.375mm,42.275mm,51.175mm,60.075mm,68.975mm,77.875mm,86.775mm,95.675mm,104.575mm,113.475mm,122.375mm,131.275mm,140.175mm,149.075mm,157.975mm,166.875mm,175.775mm,184.675mm,193.575mm,202.475mm,211.375mm,220.275mm,229.175mm,238.075mm,246.975mm,255.875mm,264.775mm,273.675mm,282.575mm,291.475mm,300.375mm,309.275mm,318.175mm,327.075mm,335.975mm,344.875mm,353.775mm,362.675mm,371.575mm,380.475mm,389.375mm,398.275mm,407.175mm,416.075mm,424.975mm,433.875mm,442.775mm,451.675mm,460.575mm,469.475mm,478.375mm,487.275mm,496.175mm,505.075mm,513.975mm,522.875mm,531.775mm,540.675mm,549.575mm,558.475mm,567.375mm,576.275mm,585.175mm,594.075mm,602.975mm,611.875mm,620.775mm} \node[] at (\w,2mm) {{\LARGE y}}; \node[quire] at (35.6mm,0) {1}; \node[quire] at (106.80mm,0) {2}; \node[quire] at (151.3mm,0) {4}; \node[quire] at (195.8mm,0) {5}; \node[quire] at (267mm,0) {6}; \node[quire] at (338.2mm,0) {7}; \node[quire] at (409mm,0) {8}; \node[quire] at (480.6mm,0) {9}; \node[quire] at (551.8mm,0) {10}; \node[quire] at (605.2mm,0) {11}; \end{tikzpicture} \end{document}` Il grafico dovrà andare (in verticale) in una gabbia alta (circa 150 mm). Non è fondamentale la lettura di ogni singola barra. Piuttosto serve vedere l'andamento complessivo. Così com'è fa quello che deve fare, ma il risultato è dovuto a pura fortuna. Se elimino ybar interval si sfasa tutto. E poi non riesco a togliere l'ultima parte dell'asse orizzontale, che va oltre le barre. Insomma, sono riuscito a mettere le varie etichette al posto giusto per pura fortuna. Tra l'altro non riesco a capire come mai se non metto l'ultima riga della tabella, l'ultima barra non viene disegnata. Come vedi ho modificato la tabella dei dati. In questo modo posso mettere un numero ogni due barre e quindi comporre l'etichetta in corpo maggiore e mettere l'indicatore x, y all'interno della barra. Ho provato anche a creare un altro codice più razionale (credo) non riesco ad andare oltre a questo `% !TEX TS-program = XeLaTeX \documentclass{standalone} \usepackage{mathspec} \setprimaryfont[Numbers={Proportional},Scale=MatchLowercase]{Junicode} \usepackage{pgfplots} %\pgfplotsset{compat=1.7} %\pgfplotsset{xticklabel={\tick},scaled x ticks=false} %\pgfplotsset{plot coordinates/math parser=false} \usepackage{pgfplotstable} \pgfplotstableset{col sep=comma} \pgfplotstableread{chart.csv}\loadedtable % riscrive la colonna b cancellando le righe dispari \pgfplotstablemodifyeachcolumnelement{b}\of\loadedtable\as\cell{% \edef\cell{\ifodd\pgfplotstablerow \else\cell\fi}} \begin{document} \begin{tikzpicture}[quire/.style ={font=\Large,yshift=-1.5cm},] \begin{axis} [ ybar, width=60cm, height=10cm, % xlabel style = {yshift=-2cm,font=\bfseries}, % xlabel=Pages and quires, % x post scale=10, % y post scale=2, % ybar interval, % <-- non accetta valori bar width=10pt, xmin=-1, % ymin=20, % ymax=52, % <-- era 50 % xtick pos=left, xticklabels from table={\loadedtable}{b}, xtick=data, x tick label style={rotate=90,anchor=east,yshift=-6pt}, % xticklabel style={font=\large,yshift=-2.225mm}, % grid=none, % xtick align=center, axis x line*=bottom, axis y line*=left ] \addplot+ [fill=gray!50,draw=gray] table [x expr=\coordindex, y expr=\thisrow{c}, col sep=semicolon]{\loadedtable}; %\addplot+ [fill=gray,draw=black] % table [x expr=\coordindex, y expr=\thisrow{a}, col sep=semicolon]{\loadedtable}; \end{axis} \end{tikzpicture} \end{document} ` Non so in realtà se sia più razionale. Diciamo che sono andato un po' meno per tentativi. Ma ancora non ci siamo. Ciao Ivan

      • #99640
        Liverpool
        Partecipante
          Up
          0
          Down
          ::


          Prova questo codice:
          `% !TEX TS-program = XeLaTeX
          \documentclass{standalone}

          \usepackage{mathspec}
          \setprimaryfont[Numbers={Proportional},Scale=MatchLowercase]{Junicode}

          \usepackage{pgfplotstable}
          \pgfplotsset{compat=1.11}
          \pgfplotstableset{col sep=comma}

          % ho rimosso la tabella per sintesi
          \pgfplotstableread{chart.csv}\loadedtable

          % memorizza il numero di righe della tabella
          \pgfplotstablegetrowsof{\loadedtable}
          \pgfmathsetmacro{\nrighe}{\pgfplotsretval-1}

          % contiene gli indici degli elementi non nulli della colonna a
          \newcommand{\extraindici}{%
          \foreach \i in {0,…,\nrighe} {%
          \pgfplotstablegetelem{\i}{a}\of\loadedtable%
          \ifnum\pgfplotsretval>0
          \i,%
          \fi%
          }%
          \pgfmathparse{int(\nrighe)}%
          \pgfmathresult%
          }

          % contiene le etichette degli elementi non nulli della colonna a
          \newcommand{\extravalori}{%
          \foreach \i in {0,…,\nrighe} {%
          \pgfplotstablegetelem{\i}{a}\of\loadedtable%
          \ifnum\pgfplotsretval>0
          \pgfplotsretval,%
          \fi%
          }%
          }

          \begin{document}
          \begin{tikzpicture}
          \begin{axis} [
          ybar,
          ybar interval,
          width=140mm,
          x post scale=10,
          axis x line*=bottom,
          axis y line=left,
          grid=none,
          xmin=0,
          xmax=\nrighe,
          ymin=20,
          ymax=52,
          xlabel=Pages and quires,
          xlabel style={font=\bfseries},
          xtick={0,2,…,\nrighe},
          xtick pos=left,
          xticklabels={119,…,200},
          xticklabel style={rotate=90},
          extra x ticks={0,16,32,36,52,68,84,100,116,132,141},
          extra x tick labels={1,2,4,5,6,7,8,9,10,11},
          extra x tick style={
          major tick length=1.5cm,
          every major tick/.append style=ultra thick,
          xticklabel style={rotate=-90, yshift=5mm}
          },
          ]
          \addplot+ [fill=gray!50, draw=gray]
          table [x expr=\coordindex, y expr=\thisrow{c}] {\loadedtable};
          \pgfplotsinvokeforeach {0,2,…,\nrighe} {
          \path [anchor=base] node at (#1+0.5,21) {x}
          node at (#1+1.5,21) {y};
          }
          \end{axis}
          \end{tikzpicture}
          \end{document}`
          Come avrai visto, ho creato due comandi che generano le liste da usare per le tacche supplementari, ma non sono riuscito a usarli perché ottengo degli errori. Se mostro la lista in un pdf e la copio nel codice va tutto bene, ma se scrivo il nome del comando ottengo degli errori. Se qualcuno è in grado di risolvere il problema, fa un piacere anche a me.

          Non hai pensato di usare due colori differenti per la x e la y e di aggiungere una legenda?

          ivan” post=99402Il grafico dovrà andare (in verticale) in una gabbia alta (circa 150 mm). Non è fondamentale la lettura di ogni singola barra. Piuttosto serve vedere l’andamento complessivo.

          Questo non l’ho capito: la larghezza del grafico deve essere inferiore a 15 cm e vuoi metterci 140 barre. Quindi, tolto lo spazio riservato alle etichette rimane circa 1 mm a barra! Come fai poi a inserire in 2 mm le etichette in corpo [tt]\LARGE[/tt]? 😕
          Quando dici “serve vedere l’andamento complessivo” intendi dire che vorresti ridurre il numero di dati scegliendo delle opportune righe dalla tabella oppure che non importa mettere tutte le etichette?

          ivan” post=99402Tra l’altro non riesco a capire come mai se non metto l’ultima riga della tabella, l’ultima barra non viene disegnata.

          Questo è un comportamento noto del pacchetto, anche se è veramente insulso.

          Ciao

        • #99641
          Up
          0
          Down
          ::

          Liverpool” post=99417Prova questo codice:
          `% !TEX TS-program = XeLaTeX
          \documentclass{standalone}

          \usepackage{mathspec}
          \setprimaryfont[Numbers={Proportional},Scale=MatchLowercase]{Junicode}

          \usepackage{pgfplotstable}
          \pgfplotsset{compat=1.11}
          \pgfplotstableset{col sep=comma}

          % ho rimosso la tabella per sintesi
          \pgfplotstableread{chart.csv}\loadedtable

          % memorizza il numero di righe della tabella
          \pgfplotstablegetrowsof{\loadedtable}
          \pgfmathsetmacro{\nrighe}{\pgfplotsretval-1}

          % contiene gli indici degli elementi non nulli della colonna a
          \newcommand{\extraindici}{%
          \foreach \i in {0,…,\nrighe} {%
          \pgfplotstablegetelem{\i}{a}\of\loadedtable%
          \ifnum\pgfplotsretval>0
          \i,%
          \fi%
          }%
          \pgfmathparse{int(\nrighe)}%
          \pgfmathresult%
          }

          % contiene le etichette degli elementi non nulli della colonna a
          \newcommand{\extravalori}{%
          \foreach \i in {0,…,\nrighe} {%
          \pgfplotstablegetelem{\i}{a}\of\loadedtable%
          \ifnum\pgfplotsretval>0
          \pgfplotsretval,%
          \fi%
          }%
          }

          \begin{document}
          \begin{tikzpicture}
          \begin{axis} [
          ybar,
          ybar interval,
          width=140mm,
          x post scale=10,
          axis x line*=bottom,
          axis y line=left,
          grid=none,
          xmin=0,
          xmax=\nrighe,
          ymin=20,
          ymax=52,
          xlabel=Pages and quires,
          xlabel style={font=\bfseries},
          xtick={0,2,…,\nrighe},
          xtick pos=left,
          xticklabels={119,…,200},
          xticklabel style={rotate=90},
          extra x ticks={0,16,32,36,52,68,84,100,116,132,141},
          extra x tick labels={1,2,4,5,6,7,8,9,10,11},
          extra x tick style={
          major tick length=1.5cm,
          every major tick/.append style=ultra thick,
          xticklabel style={rotate=-90, yshift=5mm}
          },
          ]
          \addplot+ [fill=gray!50, draw=gray]
          table [x expr=\coordindex, y expr=\thisrow{c}] {\loadedtable};
          \pgfplotsinvokeforeach {0,2,…,\nrighe} {
          \path [anchor=base] node at (#1+0.5,21) {x}
          node at (#1+1.5,21) {y};
          }
          \end{axis}
          \end{tikzpicture}
          \end{document}`
          Come avrai visto, ho creato due comandi che generano le liste da usare per le tacche supplementari, ma non sono riuscito a usarli perché ottengo degli errori. Se mostro la lista in un pdf e la copio nel codice va tutto bene, ma se scrivo il nome del comando ottengo degli errori. Se qualcuno è in grado di risolvere il problema, fa un piacere anche a me.

          Non hai pensato di usare due colori differenti per la x e la y e di aggiungere una legenda?

          Non ci avevo pensato, ma in realtà non serve in questo caso. Anche se sarebbe interessante vedere il risultato. Come si procede?

          Liverpool” post=99417

          Il grafico dovrà andare (in verticale) in una gabbia alta (circa 150 mm). Non è fondamentale la lettura di ogni singola barra. Piuttosto serve vedere l’andamento complessivo.

          Questo non l’ho capito: la larghezza del grafico deve essere inferiore a 15 cm e vuoi metterci 140 barre. Quindi, tolto lo spazio riservato alle etichette rimane circa 1 mm a barra! Come fai poi a inserire in 2 mm le etichette in corpo [tt]\LARGE[/tt]? 😕
          Quando dici “serve vedere l’andamento complessivo” intendi dire che vorresti ridurre il numero di dati scegliendo delle opportune righe dalla tabella oppure che non importa mettere tutte le etichette?

          In pratica il grafico non deve essere più largo di 160 mm perché deve essere messo ruotato in una pagina alta 180 mm. Ho modificato il tuo codice con width=50cm e composto le etichette in corpo \tiny.

          Liverpool” post=99417

          Tra l’altro non riesco a capire come mai se non metto l’ultima riga della tabella, l’ultima barra non viene disegnata.

          Questo è un comportamento noto del pacchetto, anche se è veramente insulso.

          La cosa mi rincuora.

          Nel frattempo mi è sorta un’altra curiosità. Poniamo di voler scrivere le x e le y non dentro le barre ma appena sotto, più vicine ai numeri.
          Se scrivo
          `\path [anchor=base,yshift=-1mm]`
          me le sposta in basso di 1mm. Ma se metto -2mm non le vedo più…

          Ciao
          Ivan

        • #99642
          Up
          0
          Down
          ::

          ivan” post=99428Nel frattempo mi è sorta un’altra curiosità. Poniamo di voler scrivere le x e le y non dentro le barre ma appena sotto, più vicine ai numeri.
          Se scrivo
          `\path [anchor=base,yshift=-1mm]`
          me le sposta in basso di 1mm. Ma se metto -2mm non le vedo più…

          Ciao
          Ivan

          Ottima osservazione. La risposta è che dipende da dove le inserisci. L’ambiente axis di pgfplots in pratica effettua un crop dell’immagine tenendo come bounding box la tela del grafico più qualcosa, dove il qualcosa sono: etichette degli assi x e y, eventuale legenda. Il problema è che il pacchetto assume che l’utente utilizzi le varie chiavi per definire le etichette: inserendole manualmente, ho la sensazione che non rientrino nel computo della bounding box che pgfplots considera.

          Per questo motivo, la soluzione migliore è quella di aumentare con le apposite chiavi la distanza tra le etichette dell’asse in considerazione (ticklabel shift, pagina 288 della versione 1.11 del manuale). Così dovresti aumentare la bounding box e non vedere più scomparire le etichette.

          Oppure, la soluzione artigianale è quella di spostare fuori dall’ambiente axis la creazione delle etichette: non ti puoi più servire di pgfplotsinvokeforeach e dovrebbe essere più complicato definire il posizionamento, ma avresti mai problemi di bounding box.

          Ciao
          Claudio

        • #99643
          Liverpool
          Partecipante
            Up
            0
            Down
            ::

            ivan” post=99428In pratica il grafico non deve essere più largo di 160 mm perché deve essere messo ruotato in una pagina alta 180 mm. Ho modificato il tuo codice con width=50cm e composto le etichette in corpo \tiny.

            Allora dovresti usare semplicemente [tt]width=16cm[/tt] e cancellare la riga [tt]x post scale[/tt]. Vedi come viene piccolo!

            ivan” post=99428La cosa mi rincuora.

            Il brutto è che io stesso tendo a dimenticarmelo. Si potrebbe aggiungere automaticamente una riga inutile in fondo alla tabella, per evitare di farlo a mano.

            ivan” post=99428Nel frattempo mi è sorta un’altra curiosità. Poniamo di voler scrivere le x e le y non dentro le barre ma appena sotto, più vicine ai numeri.
            Se scrivo
            `\path [anchor=base,yshift=-1mm]`
            me le sposta in basso di 1mm. Ma se metto -2mm non le vedo più…

            Il motivo te l’ha spiegato @cfiandra. Aggiungi l’opzione
            `clip=false` all’ambiente axis.

          • #99644
            Up
            0
            Down
            ::

            Liverpool” post=99437Il motivo te l’ha spiegato @cfiandra. Aggiungi l’opzione
            `clip=false` all’ambiente axis.

            Vero, ed è molto più semplice delle soluzioni che ho proposto: me l’ero proprio scordata 😉

            Ciao
            Claudio

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

        Go to top