[pgfplots] barplot con linea

  • Creatore
    Topic
  • #86001
    Up
    0
    Down
    ::


    Ciao a tutti,
    per la serie “a volte ritornano” avrei una richiesta per voi:
    Sto componendo un barplot semplicissimo dove una linea dovrebbe indicare un valore soglia, di seguito il codice

    `
    \documentclass{standalone}
    \usepackage{pgfplots}

    \begin{document}
    \begin{tikzpicture}
    \begin{axis}[
    title=Prova,
    small,scale=1,
    xbar,
    enlarge y limits=1,
    x tick label style={anchor=north,yshift=-0.5em},
    xlabel style={yshift=-0.5em},
    xlabel={Effetti},
    symbolic y coords={A,B,C},
    ytick=data]
    \addplot coordinates {(5,A) (6,B) (3,C)};
    \addplot[black,sharp plot,thick] coordinates {(4,A) (4,C)};
    \end{axis}
    \end{tikzpicture}
    \end{document}
    `

    come si vede il problema è che la linea va da A fino a C senza considerare l’effetto di enlarge limits. Io vorrei che la mia linea andasse da un estremo all’altro dell’asse. Se fosse possibile vorrei poi aggiungere una piccola scritta al di sopra della stessa.
    Mi rendo conto che il problema sia davvero banale ma da solo non sono riuscito a risolverlo. Sapreste aiutarmi?

    Grazie.
    AB

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

        peppo” post=85425Ciao a tutti,
        per la serie “a volte ritornano” avrei una richiesta per voi:
        Sto componendo un barplot semplicissimo dove una linea dovrebbe indicare un valore soglia, di seguito il codice

        `
        \documentclass{standalone}
        \usepackage{pgfplots}

        \begin{document}
        \begin{tikzpicture}
        \begin{axis}[
        title=Prova,
        small,scale=1,
        xbar,
        enlarge y limits=1,
        x tick label style={anchor=north,yshift=-0.5em},
        xlabel style={yshift=-0.5em},
        xlabel={Effetti},
        symbolic y coords={A,B,C},
        ytick=data]
        \addplot coordinates {(5,A) (6,B) (3,C)};
        \addplot[black,sharp plot,thick] coordinates {(4,A) (4,C)};
        \end{axis}
        \end{tikzpicture}
        \end{document}
        `

        come si vede il problema è che la linea va da A fino a C senza considerare l’effetto di enlarge limits. Io vorrei che la mia linea andasse da un estremo all’altro dell’asse. Se fosse possibile vorrei poi aggiungere una piccola scritta al di sopra della stessa.
        Mi rendo conto che il problema sia davvero banale ma da solo non sono riuscito a risolverlo. Sapreste aiutarmi?

        Grazie.
        AB

        Puoi disegnare una linea normale sulla tela del grafico anziché trattarla con \addplot:
        `\documentclass{standalone}
        \usepackage{pgfplots}

        \begin{document}
        \begin{tikzpicture}
        \begin{axis}[
        title=Prova,
        small,scale=1,
        xbar,
        enlarge y limits=1,
        x tick label style={anchor=north,yshift=-0.5em},
        xlabel style={yshift=-0.5em},
        xlabel={Effetti},
        symbolic y coords={A,B,C},
        ytick=data]
        \addplot coordinates {(5,A) (6,B) (3,C)};
        \draw[black,thick] (axis description cs:0.36,0) — (axis description cs:0.36,1);
        \end{axis}
        \end{tikzpicture}
        \end{document}`

        Il sistema di riferimento “axis description cs” funziona benone con le y (zero corrisponde alla’asse x ed uno corrisponde al limite superiore della tela), ma occorre regolare a mano l’ascissa (0.36 si avvivina alla posizione effettiva di 4).
        Indagando ancora è possibile che la questione abbia una soluzione esatta.
        Un saluto.
        R.

      • #86003
        Liverpool
        Partecipante
          Up
          0
          Down
          ::

          robitex” post=85427Indagando ancora è possibile che la questione abbia una soluzione esatta.

          Questa (sostituisce il comando aggiunto da @robitex):
          `\pgfplotsextra{
          \pgfmathparse{(4-\pgfkeysvalueof{/pgfplots/xmin})/(\pgfkeysvalueof{/pgfplots/xmax}-\pgfkeysvalueof{/pgfplots/xmin})}
          \let\x\pgfmathresult}
          \draw [thick] (axis description cs:\x,0) — (axis description cs:\x,1);`
          Io penso che in questo caso sia più semplice lasciar perdere le coordinate simboliche.


          @peppo
          la scritta la aggiungi con un nodo in calce al percorso di @robitex, ma non ho ben capito cosa vuoi ottenere.

          Ciao

        • #86004
          robitex
          Amministratore del forum
            Up
            0
            Down
            ::

            Liverpool” post=85433

            Indagando ancora è possibile che la questione abbia una soluzione esatta.

            Questa (sostituisce il comando aggiunto da @robitex):
            `\pgfplotsextra{
            \pgfmathparse{(4-\pgfkeysvalueof{/pgfplots/xmin})/(\pgfkeysvalueof{/pgfplots/xmax}-\pgfkeysvalueof{/pgfplots/xmin})}
            \let\x\pgfmathresult}
            \draw [thick] (axis description cs:\x,0) — (axis description cs:\x,1);`
            Io penso che in questo caso sia più semplice lasciar perdere le coordinate simboliche.


            @peppo
            la scritta la aggiungi con un nodo in calce al percorso di @robitex, ma non ho ben capito cosa vuoi ottenere.

            Ciao

            Ho trovato una soluzione che fa uso di nodi aggiuntivi a partire da un punto sulla coordinata 4:
            `\documentclass{standalone}
            \usepackage{pgfplots}
            \pgfplotsset{compat=1.8}

            \begin{document}
            \begin{tikzpicture}
            \begin{axis}[title=Prova,
            small,scale=1,
            xbar,
            enlarge y limits=1,
            x tick label style={anchor=north,yshift=-0.5em},
            xlabel style={yshift=-0.5em},
            xlabel={Effetti},
            symbolic y coords={A,B,C},
            ytick=data]

            \addplot coordinates {(5,A) (6,B) (3,C)};

            \node (P) at (axis cs:4,A) {};
            \node (P1) at (axis description cs:0,0) {};
            \node (P2) at (axis description cs:0,1) {};
            \node (Q) at (P |- P1) {};
            \node (R) at (P |- P2) {};
            \draw[thick] (R) — (Q);

            \end{axis}
            \end{tikzpicture}
            \end{document}`
            In pratica trovo i punti R e Q come intersezione delle rette parallele all’asse x che definiscono la tela in basso ed in alto con la retta verticale passante per P.
            Il risultato è una soluzione ma per qualche ragione che non sono riuscito a capire, traccia la retta allontandandosi leggermente dai punti Q ed R. Può darsi che pgfplots setti il valore di qualche proprietà di disegno particoalre.
            Questo problema non affligge la soluzione di Liverpool.
            Saluti.
            R.

          • #86005
            Liverpool
            Partecipante
              Up
              0
              Down
              ::

              robitex” post=85435Il risultato è una soluzione ma per qualche ragione che non sono riuscito a capire, traccia la retta allontandandosi leggermente dai punti Q ed R.

              Usa le [tt]coordinate[/tt] invece dei nodi.

              Ciao

            • #86006
              robitex
              Amministratore del forum
                Up
                0
                Down
                ::


                A veder bene, la linea verticale all’ascissa x=4 parte ed arriva agli estremi interni dei segni delle marche.
                Si può ovviare definendo i punti P1 e P2 così:
                `\node (P1) at (axis description cs:0,-0.5) {};
                \node (P2) at (axis description cs:0,1.5) {};`
                e contando sul fatto che gli oggetti vengono tagliati sul contorno della tela.
                R.

              • #86007
                Up
                0
                Down
                ::


                Ottimo, funziona alla grande.
                Certo che però tikz è tanto potente quanto rognoso…
                Grazie mille

              • #86008
                robitex
                Amministratore del forum
                  Up
                  0
                  Down
                  ::

                  peppo” post=85438Ottimo, funziona alla grande.
                  Certo che però tikz è tanto potente quanto rognoso…
                  Grazie mille

                  Più che rognoso direi potente e quindi complesso.
                  Se fai la somma delle pagine dei manuali di pgf e di pgfplots arriva a quanto, 1200?
                  R.

                  Ps.
                  Sono curioso: alla fine quale soluzione hai adottato?

                • #86009
                  Up
                  0
                  Down
                  ::


                  Ho scelto la soluzione di Liverpool perché più sintetica anche se non ho capito nel dettaglio cosa succede nel comando pgfmathparse.

                • #86010
                  Liverpool
                  Partecipante
                    Up
                    0
                    Down
                    ::

                    peppo” post=85447Ho scelto la soluzione di Liverpool perché più sintetica anche se non ho capito nel dettaglio cosa succede nel comando pgfmathparse.

                    Trasforma la coordinata assoluta 4 nella corrispondente coordinata relativa (compresa tra 0 e 1), tenendo conto di [tt]xmin[/tt] e [tt]xmax[/tt]. La relazione è:
                    \[y=\dfrac{x-x_\text{min}}{x_\text{max}-x_\text{min}}\]
                    Infatti, quando \(x=x_\text{min}\), \(y=0\) e quando \(x=x_\text{max}\), \(y=1\). Nel tuo caso \(x=4\).

                    Ciao

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

                Go to top