[TIKZ/PGFPLOTS] barplot normale e flipped

  • Questo topic ha 3 risposte, 2 partecipanti ed è stato aggiornato l'ultima volta 9 anni, 6 mesi fa da Pete.
  • Creatore
    Topic
  • #109540
    Up
    0
    Down
    ::


    Ciao,

    sto cercando un modo di comporre il un barplot con la seguente caratteristica: ad ogni xtick deve corrispondere una barra classica, ed una barra che invece parte dal limite superiore del grafico, Per tentare di spiegarmi meglio, se e’ data la tabella

    `
    \pgfplotstableread[col sep=comma]{
    label, PdF, Opt
    label1, 112, 106
    }\datatable
    `

    il grafico dovrebbe avere un solo xtick, con etichetta ‘label1’, una barra che parte dal basso di lunghezza 112, ed un’altra barra (in corrispondenza dello stesso xtick) che parte dall’alto ed ha lunghezza 106.
    Non riesco a trovare alcun esempio da cui capire come fare una tal cosa, quindi vi chiedo suggerimenti e/o references.

    Ecco un esempio minimo (ma non compilabile, dato che non so come farlo!), per veloci prove.
    Grazie mille, ciao!

    `
    \documentclass{standalone}
    \usepackage[utf8]{inputenc}
    \usepackage[T1]{fontenc}
    \usepackage{pgfplotstable}
    \usepackage{tikz}
    \usepackage{pgfplots}

    \begin{document}
    \pgfplotstableread[col sep=comma]{
    label, PdF, Opt
    label1, 112, 106
    }\datatable

    \begin{tikzpicture}
    \begin{axis}[
    ybar,
    xtick = {1},
    xticklabels from table = {\datatable}{label},
    ]

    % qui plot

    \end{axis}
    \end{tikzpicture}
    \end{document}

    `

Visualizzazione 2 filoni di risposte
  • Autore
    Risposte
    • #109541
      Up
      0
      Down
      ::


      La soluzione [tt]ybar stacked[/tt] non è adatta?

      Ciao
      Claudio

    • #109542
      Up
      0
      Down
      ::

      cfiandra” post=109734La soluzione [tt]ybar stacked[/tt] non è adatta?

      Ciao
      Claudio

      Ciao,
      no, non posso farli sovrapporre. Mi servono proprio che inizino dai due lati differenti, e nel 99% dei casi non si toccheranno nemmeno.

      Deduco dal tuo commento (correggimi se sbaglio) che non c’e’ un modo ovvio per farlo, quindi mi affidero’ a qualche macro tikz.

      Ciao

    • #109543
      Up
      0
      Down
      ::

      DirkPitt” post=109747

      La soluzione [tt]ybar stacked[/tt] non è adatta?

      Ciao
      Claudio

      Ciao,
      no, non posso farli sovrapporre. Mi servono proprio che inizino dai due lati differenti, e nel 99% dei casi non si toccheranno nemmeno.

      Deduco dal tuo commento (correggimi se sbaglio) che non c’e’ un modo ovvio per farlo, quindi mi affidero’ a qualche macro tikz.

      Ciao

      Pervengo dunque ad una soluzione che definire custom e’ poco.
      La copio qui sotto, per ricevere commenti su come migliorarla.

      Funziona ad ogni modo, a dispetto del fatto che il manuale di pgfplots suggerisca di non usare quella roba dentro un foreach, per motivi di efficienza.

      `
      \documentclass{standalone}
      \usepackage[utf8]{inputenc}
      \usepackage[T1]{fontenc}
      \usepackage{pgfplotstable}
      \usepackage{tikz}
      \usepackage{pgfplots}
      \usepackage{trace}

      \pgfplotstableread[col sep=comma]{
      label, xPos, PdF, Opt
      label1, 1, 112, 106
      label2, 5, 98, 87
      }\datatable

      \def\bottom{0}
      \def\top{350}
      \def\width{0.5}

      % input:
      % 1 – bottom/top-left x-coordinate of the bar
      % 2- y-coordinate of point 1.
      % 3 – bottom/top-right x-coordinate of the bar
      % 4- y-coordinate of point 3.
      \newcommand{\makeBar}[4]{
      \draw[fill = red] (axis cs: #1, #2) rectangle (axis cs: #3,#4)%
      }

      % input
      % 1 – bottom-left x coordinate
      % 2 – height
      % 3 – width
      \newcommand{\makeDownBar}[3]{
      \makeBar{#1}{\bottom}{#1+#3}{\bottom+#2}
      }

      % input
      % 1 – top-left x coordinate
      % 2 – height(length)
      % 3 – width
      \newcommand{\makeUpBar}[3]{
      \makeBar{#1}{\top}{#1+#3}{\top-#2}
      }

      \begin{document}
      \begin{tikzpicture}
      \begin{axis}[
      ybar,
      xmin=0, xmax=10,
      ymin=\bottom, ymax=\top,
      xtick = {1,5}, % how to take this ones from the table?
      xticklabels from table = {\datatable}{label}
      ]

      \foreach\x in {0,1}{
      \pgfplotstablegetelem{\x}{PdF}\of{\datatable};
      \pgfmathsetmacro{\heightPdF}{\pgfplotsretval};
      \pgfplotstablegetelem{\x}{xPos}\of{\datatable};
      \pgfmathsetmacro{\currX}{\pgfplotsretval};
      \edef\temp{\noexpand\makeDownBar{\currX}{\heightPdF}{\width};}\temp
      \pgfplotstablegetelem{\x}{Opt}\of{\datatable};
      \pgfmathsetmacro{\heightOpt}{\pgfplotsretval};
      \edef\temp{\noexpand\makeUpBar{\currX}{\heightOpt}{\width};}\temp
      }
      \end{axis}
      \end{tikzpicture}
      \end{document}
      `

      Ciao

      P.S. Post editato perche’ avevo copiato del codice sbagliato 😀

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

Go to top