[Risolto] Riempimento area tra curve con pgfplots

  • Questo topic ha 12 risposte, 4 partecipanti ed è stato aggiornato l'ultima volta 14 anni fa da cfiandra.
  • Creatore
    Topic
  • #57513
    Up
    0
    Down
    ::


    Ciao a tutti,
    mi scuso, non è mio solito, ma l’ansia mi obbliga a far presente che ho una certa urgenza 😥
    Per la presentazione della tesi, che sto facendo in beamer, vorrei inserire un grafico che già compare nella tesi, ma nel quale vorrei riempire le aree tra le curve con colori diversi, per renderne più veloce la lettura (dato che il tempo d’esposizione è ridotto). Ho già lavorato autonomamente con l’opzione fill di \addplot, ma ho ottenuto risultati assolutamente non soddisfacenti. Vorrei chiedere pertanto se qualcuno in gamba con pgfplots è in grado di aiutarmi.
    Riporto sotto un esempio per far risparmiare tempo a chi volesse cimentarsi. I limiti del grafico sono volutamente maggiori del dominio delle curve (dall’esempio sotto non si capisce perché, ma avrei bisogno che resti così). Vorrei questo:
    1) Riempire l’area che va da y=1 fino alla curva rossa;
    2) Riempire l’area che va dalla curva rossa a quella blu;
    3) Riempire l’area che va dalla curva blu a y=10^{-6};
    4) Evitare che vengano coperte le curve, le scritte, gli assi e la griglia.

    Grazie,
    Daniele

    PS: Se non riuscite (o non avete tempo e voglia) non c’è problema, non diventate matti… il grafico è chiaro anche così com’è.

    `\documentclass [11pt,a4paper]{report}

    \usepackage[T1]{fontenc}
    \usepackage[latin1]{inputenc}
    \usepackage{layaureo}

    \usepackage{pgfplots}
    \pgfplotsset{compat=1.3}
    \pgfplotsset{compat=newest}
    \pgfkeys{/pgf/number format/.cd,fixed,precision=2}
    \pgfplotsset{grid style={gray!35}}

    \pgfplotsset{
    mysmall/.style={
    /pgfplots/grid=major,
    /pgfplots/xminorgrids=true,
    /pgfplots/xtick align=outside,
    /pgfplots/ytick align=outside,
    every axis y label/.style=
    {at={(ticklabel cs:0.5)},anchor=near ticklabel},
    legend style={font=\tiny},
    /pgfplots/legend cell align=left,
    /pgfplots/tick label style={font=\scriptsize}
    }
    }

    \begin{document}

    \begin{tikzpicture}%
    \begin{semilogyaxis}[mysmall,
    width=.9\textwidth,
    height=.8\textwidth,
    xlabel={$x$},
    ylabel={$y$},
    xmin=0,
    xmax=.5,
    ymin=1E-6,
    ymax=1,
    try min ticks log={7}
    ]

    \addplot+[no markers,color=red,domain=0.1:0.4] {12.659*x^3-8.3636*x^2+2.1229*x+0.0108};

    \addplot+[no markers,color=blue,domain=0.1:0.4] {0.1564*x^2+0.035*x-0.0003};

    \node[] at (axis cs:.2,.4) {\footnotesize Primo modello};
    \node[rotate=25] at (axis cs:.2,.05) {\footnotesize secondo modello};
    \node[] at (axis cs:.2,2E-4) {\footnotesize terzo modello};

    \end{semilogyaxis}
    \end{tikzpicture}

    \end{document}`

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

        Ciao a tutti,
        mi scuso, non è mio solito, ma l’ansia mi obbliga a far presente che ho una certa urgenza 😥
        Per la presentazione della tesi, che sto facendo in beamer, vorrei inserire un grafico che già compare nella tesi, ma nel quale vorrei riempire le aree tra le curve con colori diversi, per renderne più veloce la lettura (dato che il tempo d’esposizione è ridotto). Ho già lavorato autonomamente con l’opzione fill di \addplot, ma ho ottenuto risultati assolutamente non soddisfacenti. Vorrei chiedere pertanto se qualcuno in gamba con pgfplots è in grado di aiutarmi.
        Riporto sotto un esempio per far risparmiare tempo a chi volesse cimentarsi. I limiti del grafico sono volutamente maggiori del dominio delle curve (dall’esempio sotto non si capisce perché, ma avrei bisogno che resti così). Vorrei questo:
        1) Riempire l’area che va da y=1 fino alla curva rossa;
        2) Riempire l’area che va dalla curva rossa a quella blu;
        3) Riempire l’area che va dalla curva blu a y=10^{-6};
        4) Evitare che vengano coperte le curve, le scritte, gli assi e la griglia.

        Grazie,
        Daniele

        PS: Se non riuscite (o non avete tempo e voglia) non c’è problema, non diventate matti… il grafico è chiaro anche così com’è.

        `\documentclass [11pt,a4paper]{report}

        \usepackage[T1]{fontenc}
        \usepackage[latin1]{inputenc}
        \usepackage{layaureo}

        \usepackage{pgfplots}
        \pgfplotsset{compat=1.3}
        \pgfplotsset{compat=newest}
        \pgfkeys{/pgf/number format/.cd,fixed,precision=2}
        \pgfplotsset{grid style={gray!35}}

        \pgfplotsset{
        mysmall/.style={
        /pgfplots/grid=major,
        /pgfplots/xminorgrids=true,
        /pgfplots/xtick align=outside,
        /pgfplots/ytick align=outside,
        every axis y label/.style=
        {at={(ticklabel cs:0.5)},anchor=near ticklabel},
        legend style={font=\tiny},
        /pgfplots/legend cell align=left,
        /pgfplots/tick label style={font=\scriptsize}
        }
        }

        \begin{document}

        \begin{tikzpicture}%
        \begin{semilogyaxis}[mysmall,
        width=.9\textwidth,
        height=.8\textwidth,
        xlabel={$x$},
        ylabel={$y$},
        xmin=0,
        xmax=.5,
        ymin=1E-6,
        ymax=1,
        try min ticks log={7}
        ]

        \addplot+[no markers,color=red,domain=0.1:0.4] {12.659*x^3-8.3636*x^2+2.1229*x+0.0108};

        \addplot+[no markers,color=blue,domain=0.1:0.4] {0.1564*x^2+0.035*x-0.0003};

        \node[] at (axis cs:.2,.4) {\footnotesize Primo modello};
        \node[rotate=25] at (axis cs:.2,.05) {\footnotesize secondo modello};
        \node[] at (axis cs:.2,2E-4) {\footnotesize terzo modello};

        \end{semilogyaxis}
        \end{tikzpicture}

        \end{document}`

        Cominciamo ad esserci?
        `\documentclass[11pt,a4paper]{report}

        \usepackage[T1]{fontenc}
        \usepackage[latin1]{inputenc}
        \usepackage{layaureo}

        \usepackage{pgfplots}
        \pgfplotsset{compat=1.3}
        \pgfplotsset{compat=newest}
        \pgfkeys{/pgf/number format/.cd,fixed,precision=2}
        \pgfplotsset{grid style={gray!35}}

        \pgfplotsset{
        mysmall/.style={
        /pgfplots/grid=major,
        /pgfplots/xminorgrids=true,
        /pgfplots/xtick align=outside,
        /pgfplots/ytick align=outside,
        every axis y label/.style=
        {at={(ticklabel cs:0.5)},anchor=near ticklabel},
        legend style={font=\tiny},
        /pgfplots/legend cell align=left,
        /pgfplots/tick label style={font=\scriptsize}
        }
        }

        \begin{document}

        \begin{tikzpicture}%
        \begin{semilogyaxis}[mysmall,
        width=.9\textwidth,
        height=.8\textwidth,
        xlabel={$x$},
        ylabel={$y$},
        xmin=0,
        xmax=.5,
        ymin=1E-6,
        ymax=1,
        try min ticks log={7},
        domain=0.1:0.4
        ]

        \addplot[fill,color=orange,line width=0.1pt]
        {1} \closedcycle;

        \addplot[fill,no markers,color=red]
        {12.659*x^3-8.3636*x^2+2.1229*x+0.0108}
        \closedcycle;

        \addplot[fill,no markers,color=blue]
        {0.1564*x^2+0.035*x-0.0003}
        \closedcycle;

        \node at (axis cs:.25,.4) {\footnotesize Primo modello};
        \node at (axis cs:.25,.05) {\footnotesize secondo modello};
        \node at (axis cs:.25,2E-4) {\footnotesize terzo modello};
        \end{semilogyaxis}
        \end{tikzpicture}

        \end{document}`

        Ciao.

      • #57515
        Up
        0
        Down
        ::


        Ciao robitex. Che piacere sentirti, e grazie per avermi risposto.
        Allora, ci siamo quasi. Il risultato è quello che avevo ottenuto io. Ci sono un paio di cose che vorrei evitare, ma che non sono essenziali. Io userei tonalità più leggere (red!10!white green!10!white blue!10!white). Non è possibile far sì che le curve restino visibili (e così anche gli assi sopra e sotto)? Ora come ora nel momento in cui uso fill spariscono sotto i riempimenti.
        Quello che invece sarebbe “meno opzionale” e la necessità di colorare per esempio solo l’area dalla curve rossa a quella blu (mea culpa… mi son reso conto di non averlo specificato prima). Il problema è che se uso il colore white dalla curva blu all’asse inferiore… copro la griglia…. 😥

        Ciao,
        Daniele

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

          Ciao robitex. Che piacere sentirti, e grazie per avermi risposto.
          Allora, ci siamo quasi. Il risultato è quello che avevo ottenuto io. Ci sono un paio di cose che vorrei evitare, ma che non sono essenziali. Io userei tonalità più leggere (red!10!white green!10!white blue!10!white). Non è possibile far sì che le curve restino visibili (e così anche gli assi sopra e sotto)? Ora come ora nel momento in cui uso fill spariscono sotto i riempimenti.
          Quello che invece sarebbe “meno opzionale” e la necessità di colorare per esempio solo l’area dalla curve rossa a quella blu (mea culpa… mi son reso conto di non averlo specificato prima). Il problema è che se uso il colore white dalla curva blu all’asse inferiore… copro la griglia…. 😥

          Ciao,
          Daniele

          Intanto regola tu i colori…

          Un po’ di migliorie:
          `\documentclass[11pt,a4paper]{report}

          \usepackage[T1]{fontenc}
          \usepackage[latin1]{inputenc}
          \usepackage{layaureo}

          \usepackage{pgfplots}
          \pgfplotsset{compat=1.3}
          \pgfplotsset{compat=newest}
          \pgfkeys{/pgf/number format/.cd,fixed,precision=2}
          \pgfplotsset{grid style={gray!35}}

          \pgfplotsset{
          mysmall/.style={
          /pgfplots/grid=major,
          /pgfplots/xminorgrids=true,
          /pgfplots/xtick align=outside,
          /pgfplots/ytick align=outside,
          every axis y label/.style=
          {at={(ticklabel cs:0.5)},anchor=near ticklabel},
          legend style={font=\tiny},
          /pgfplots/legend cell align=left,
          /pgfplots/tick label style={font=\scriptsize}
          }
          }

          \begin{document}
          \begin{tikzpicture}%
          \begin{semilogyaxis}[mysmall,
          width=.6\textwidth,
          height=.8\textwidth,
          xlabel={$x$},
          ylabel={$y$},
          xmin=0.1,
          xmax=0.4,
          ymin=1E-6,
          ymax=1,
          try min ticks log={7},
          domain=0.1:0.4
          ]

          \addplot[fill,color=orange,line width=0.1pt]
          {1} \closedcycle;
          \addplot[fill,no markers,color=white]
          {(12.659*x^3-8.3636*x^2+2.1229*x+0.0108)*1.05}
          \closedcycle;

          % main red curve
          \addplot[no markers,color=red]
          {12.659*x^3-8.3636*x^2+2.1229*x+0.0108};

          \addplot[fill,no markers,color=red]
          {(12.659*x^3-8.3636*x^2+2.1229*x+0.0108)*0.92}
          \closedcycle;

          \addplot[fill,no markers,color=white]
          {(0.1564*x^2+0.035*x-0.0003)*1.07}
          \closedcycle;

          % main blue curve
          \addplot[no markers,color=blue]
          {0.1564*x^2+0.035*x-0.0003};

          \addplot[fill,no markers,color=blue]
          {(0.1564*x^2+0.035*x-0.0003)*0.92}
          \closedcycle;

          \node at (axis cs:.25,.4) {\footnotesize Primo modello};
          \node at (axis cs:.25,.05) {\footnotesize secondo modello};
          \node at (axis cs:.25,2E-4) {\footnotesize terzo modello};
          \end{semilogyaxis}
          \end{tikzpicture}
          \end{document}`

          A fra poco…

        • #57517
          Up
          0
          Down
          ::

          A fra poco…

          Già, 😀

          Direi che per quanto riguarda il contorno delle curve vada già a meraviglia. Per quanto riguarda gli assi… sono già contento che si vedano le curve, quindi li lascerei così. Tutto sommato non è male.

          Il problema più grande ora è far comparire, per esempio, solo il riempimento arancione e non gli altri. Questo perché nella presentazione introduco le curve e i riempimenti man mano che spiego i modelli.

          Intanto grazie,
          Daniele

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

            A fra poco…

            Già, 😀

            Direi che per quanto riguarda il contorno delle curve vada già a meraviglia. Per quanto riguarda gli assi… sono già contento che si vedano le curve, quindi li lascerei così. Tutto sommato non è male.

            Il problema più grande ora è far comparire, per esempio, solo il riempimento arancione e non gli altri. Questo perché nella presentazione introduco le curve e i riempimenti man mano che spiego i modelli.

            Intanto grazie,
            Daniele

            👿 allora dillo…

            comunque il codice con la fascia rossa centrale è questo:

            `\documentclass[11pt,a4paper]{report}

            \usepackage[T1]{fontenc}
            \usepackage[latin1]{inputenc}
            \usepackage{layaureo}

            \usepackage{pgfplots}
            \pgfplotsset{compat=1.3}
            \pgfplotsset{compat=newest}
            \pgfkeys{/pgf/number format/.cd,fixed,precision=2}
            \pgfplotsset{grid style={gray!35}}

            \pgfplotsset{
            mysmall/.style={
            /pgfplots/grid=major,
            /pgfplots/xminorgrids=true,
            /pgfplots/xtick align=outside,
            /pgfplots/ytick align=outside,
            every axis y label/.style=
            {at={(ticklabel cs:0.5)},anchor=near ticklabel},
            legend style={font=\tiny},
            /pgfplots/legend cell align=left,
            /pgfplots/tick label style={font=\scriptsize}
            }
            }

            \begin{document}
            \begin{tikzpicture}%
            \begin{semilogyaxis}[mysmall,
            width=.6\textwidth,
            height=.8\textwidth,
            xlabel={$x$},
            ylabel={$y$},
            xmin=0.1,
            xmax=0.4,
            ymin=1E-6,
            ymax=1,
            domain=0.1:0.4,
            clip=false
            ]

            % main red curve
            \addplot[line width=1pt,no markers,color=red]
            {12.659*x^3-8.3636*x^2+2.1229*x+0.0108};

            \addplot[fill,no markers,color=red]
            {(12.659*x^3-8.3636*x^2+2.1229*x+0.0108)*0.925}
            \closedcycle;

            \addplot[fill,no markers,color=white]
            {(0.1564*x^2+0.035*x-0.0003)*1.07}
            \closedcycle;

            % main blue curve
            \addplot[line width=1pt,no markers,color=blue]
            {0.1564*x^2+0.035*x-0.0003};

            \addplot[fill,no markers,color=white]
            {(0.1564*x^2+0.035*x-0.0003)*0.92}
            \closedcycle;

            % rebuilding of the box line
            \draw (axis description cs:0,0) rectangle
            (axis description cs:1,1);

            % rebuilding of grid line
            \newcommand{\vl}[1]{%
            \draw[help lines,thin,black!25]
            (axis cs:#1,1E-6)–(axis cs:#1,1)}
            \vl{0.15};
            \vl{0.20};
            \vl{0.25};
            \vl{0.30};
            \vl{0.35};

            \node at (axis cs:.25,0.4) {\footnotesize Primo modello};
            \node at (axis cs:.25,0.055) {\footnotesize Secondo modello};
            \node at (axis cs:.25,2E-4) {\footnotesize terzo modello};
            \end{semilogyaxis}
            \end{tikzpicture}
            \end{document}`

            Puoi regolare il colore della fascia e i coefficienti che creano l’effetto distacco in colore bianco.

            Per Beamer, la soluzione è creare i pdf dei grafici che servono ed inserirli uno dopo l’altro nella slide (effetto magnifico vero?).
            Dunque tu vorresti una prima fascia, diciamo arancione, fino sulla prima curva vero?
            Certo che questi laureandi sono proprio impossibili…

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


              Ecco il grafico con solo la fascia arancione:
              Regola bene i coefficienti che moltiplicano le espressioni delle curve, devono essere gli stessi per tutti grafici.
              Adesso credo che tu sappia fare tutti i grafici che ti servono della sequenza.
              Saluti.

              `\documentclass[11pt,a4paper]{report}

              \usepackage[T1]{fontenc}
              \usepackage[latin1]{inputenc}
              \usepackage{layaureo}

              \usepackage{pgfplots}
              \pgfplotsset{compat=1.3}
              \pgfplotsset{compat=newest}
              \pgfkeys{/pgf/number format/.cd,fixed,precision=2}
              \pgfplotsset{grid style={gray!35}}

              \pgfplotsset{
              mysmall/.style={
              /pgfplots/grid=major,
              /pgfplots/xminorgrids=true,
              /pgfplots/xtick align=outside,
              /pgfplots/ytick align=outside,
              every axis y label/.style=
              {at={(ticklabel cs:0.5)},anchor=near ticklabel},
              legend style={font=\tiny},
              /pgfplots/legend cell align=left,
              /pgfplots/tick label style={font=\scriptsize}
              }
              }

              \begin{document}
              \begin{tikzpicture}%
              \begin{semilogyaxis}[mysmall,
              width=.6\textwidth,
              height=.8\textwidth,
              xlabel={$x$},
              ylabel={$y$},
              xmin=0.1,
              xmax=0.4,
              ymin=1E-6,
              ymax=1,
              domain=0.1:0.4,
              no markers,
              clip=false
              ]

              \addplot[fill,color=orange] {1} \closedcycle;
              \addplot[fill,color=white]
              {(12.659*x^3-8.3636*x^2+2.1229*x+0.0108)*1.06}
              \closedcycle;

              % main red curve
              \addplot[line width=1pt,color=red]
              {12.659*x^3-8.3636*x^2+2.1229*x+0.0108};

              % main blue curve
              \addplot[line width=1pt,color=blue]
              {0.1564*x^2+0.035*x-0.0003};

              % rebuilding of the box line
              \draw (axis description cs:0,0) rectangle
              (axis description cs:1,1);

              % rebuilding of the grid line
              \newcommand{\vl}[1]{%
              \draw[help lines,thin,black!25]
              (axis cs:#1,1E-6)–(axis cs:#1,1)}
              \vl{0.15};
              \vl{0.20};
              \vl{0.25};
              \vl{0.30};
              \vl{0.35};

              \node at (axis cs:.25,0.4) {\footnotesize Primo modello};
              \node at (axis cs:.25,0.055) {\footnotesize Secondo modello};
              \node at (axis cs:.25,2E-4) {\footnotesize terzo modello};
              \end{semilogyaxis}
              \end{tikzpicture}
              \end{document}`

            • #57520
              Up
              0
              Down
              ::


              Perfetto, grazie.
              Banalmente ho definito anche il comando per tracciare le righe orizzontali della griglia:
              `\newcommand{\hl}[1]{%
              \draw[help lines,thin,black!25]
              (axis cs:.1,#1)–(axis cs:.4,#1)}`

              Segno il topic come risolto. Spero di non dover più disturbare al riguardo.

              Ciao,
              Daniele

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

                Perfetto, grazie.
                Banalmente ho definito anche il comando per tracciare le righe orizzontali della griglia:
                `\newcommand{\hl}[1]{%
                \draw[help lines,thin,black!25]
                (axis cs:.1,#1)–(axis cs:.4,#1)}`

                Segno il topic come risolto. Spero di non dover più disturbare al riguardo.

                Ciao,
                Daniele

                Nessun disturbo, anzi il riempimento di aree sottese è un utile skill da sapere.
                Buon lavoro.

              • #57522
                Up
                0
                Down
                ::


                Ciao! È possibile invece riempire solo una parte di curva?
                Mi spiego meglio:
                `
                \begin{tikzpicture}
                \begin{axis}
                \addplot [mark=none,samples=100,domain=0:1]{1 – 6*x*(1-x)};
                \legend{}
                \end{axis}
                \end{tikzpicture}
                `
                Come si vede dal grafico c’è una parte di curva che presenta y<0..è possibile riempire solo quella parte?e come si può far vedere l’asse delle ascisse?
                grazie mille per l’aiuto!

              • #57523
                Up
                0
                Down
                ::

                Orlando” post=77055Ciao! È possibile invece riempire solo una parte di curva?
                Mi spiego meglio:
                `
                \begin{tikzpicture}
                \begin{axis}
                \addplot [mark=none,samples=100,domain=0:1]{1 – 6*x*(1-x)};
                \legend{}
                \end{axis}
                \end{tikzpicture}
                `
                Come si vede dal grafico c’è una parte di curva che presenta y<0..è possibile riempire solo quella parte?e come si può far vedere l’asse delle ascisse?
                grazie mille per l’aiuto!

                Ottima domanda!!! 🙂 La soluzione infatti non è banale.

                Io farei così:

                `\documentclass{article}
                \usepackage{pgfplots}

                \begin{document}

                \begin{tikzpicture}
                \begin{axis}
                \addplot+ [mark=none,samples=100,domain=0:1,fill=blue!10,draw=none]{min(1 – 6*x*(1-x),0)};
                \addplot [mark=none,samples=100,domain=0:1]{1 – 6*x*(1-x)};
                \legend{}
                \end{axis}
                \end{tikzpicture}

                \end{document}`

                Si sfrutta la funzione minimo di pgf applicata alla funzione da graficare per selezionare solo la parte di grafico che interessa e la si colora con [tt]fill[/tt].

                Il risultato è:

                [attachment=416]prova_2012-09-02.jpg[/attachment]

                Ciao
                Claudio

                Attachments:
                You must be logged in to view attached files.
              • #57524
                Up
                0
                Down
                ::


                Wow!!! Proprio così! Potrei gentilmente chiederti se è possibile riempirla con tipo righe diagonali? Comunque già così va bene!!!
                Si può far comparire l’asse delle ascisse???

              • #57525
                Up
                0
                Down
                ::

                Orlando” post=77061Wow!!! Proprio così! Potrei gentilmente chiederti se è possibile riempirla con tipo righe diagonali? Comunque già così va bene!!!
                Si può far comparire l’asse delle ascisse???

                In realtà alla prima domanda pensavo di rispondere affermativamente, ma mi sbagliavo. Prova:

                `\documentclass{article}
                \usepackage{pgfplots}
                \usetikzlibrary{patterns}

                \begin{document}

                \begin{tikzpicture}
                \begin{axis}
                \addplot+ [mark=none,samples=100,domain=0:1,pattern=norh east lines,draw=none]{min(1 – 6*x*(1-x),0)};
                \addplot [mark=none,samples=100,domain=0:1]{1 – 6*x*(1-x)};
                \legend{}
                \end{axis}
                \end{tikzpicture}

                \end{document}`
                e vedrai un risultato orribile.

                Invece inserire l’asse non è complicato:

                `\documentclass{article}
                \usepackage{pgfplots}

                \begin{document}

                \begin{tikzpicture}
                \begin{axis}
                \addplot+ [mark=none,samples=100,domain=0:1,fill=blue!10,draw=none]{min(1 – 6*x*(1-x),0)};
                \addplot [mark=none,samples=100,domain=0:1]{1 – 6*x*(1-x)};
                \draw (axis cs:-0.3,0)–(axis cs:1.3,0); % asse
                \legend{}
                \end{axis}
                \end{tikzpicture}

                \end{document} `

                Ciao
                Claudio

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

            Go to top