Filling axis pgfplots

  • Creatore
    Topic
  • #73613
    Up
    0
    Down
    ::


    ciao a tutti volevo sapere come posso creare l’ effetto di riempimento della gaussiana rappresentato nella foto con pgfplots e togliere anche qui pallini neri che si formano sulla linea del grafico. La color bar posso sincronizzarla con l’ ascissa? questo è il mio codice:

    `\pgfplotsset{width=15cm,compat=1.3,colormap={new}{color(0cm)=(violet);color(1cm)=(blue);color(2cm)=(cyan);color(3cm)=(green);color(4cm)=(yellow);color(5cm)=(orange);color(6cm)=(red)}}

    \begin{figure}
    \centering
    \begin{tikzpicture}
    \begin{axis}[
    %height=9cm,
    %width=9cm,
    grid=major,
    xmajorgrids,
    xmin=-0.3,
    xmax=0.3,
    ymin=0,
    ymax=6,
    colorbar horizontal, colormap/new]
    \addplot gnuplot[id=DoG,surf,shader=interp,samples=50,domain=-0.3:0.3,y domain=0:1]{((1/(sqrt(2*pi*0.00570275999999999)))*exp(-(x-0)**2/(2*0.00570275999999999)))};
    %\addplot[mesh,fill,surf,shader=interp,samples=10,domain=0:1]{x^2}\closedcycles;
    \addlegendentry{model}
    \pgfplotsset{tick style={thin,black},every mark/.append style={solid}}%
    \end{axis}
    \end{tikzpicture}
    \caption{Plot}
    \end{figure}`

    Attachments:
    You must be logged in to view attached files.
Visualizzazione 10 filoni di risposte
  • Autore
    Risposte
    • #73614
      Up
      0
      Down
      ::


      Allora, per quanto riguarda la colorazione dell’area ti rimando a questa discussione, ti suggerisco di andare per gradi e iniziare prima a modificare la colormap e poi a cambiare la curva (purtroppo non ho il tempo di mettere insieme un EMC).
      In questo ti può anche aiutare il pgf manual al capitolo 83.2 (:eek: ).
      Puoi mostrare la colormap al di sotto dell’asse x dando la chiave “colormap horizontal” ad axis.
      Per eliminare i punti neri il problema mi sembra essere “every mark/.append style={solid}”, se proprio ti serve darla in generale puoi pensare di passare la chiave “no markers” ad axis.

      Ciao,
      Roberto

    • #73615
      Up
      0
      Down
      ::


      sono arrivato a questo risultato ! adesso manca solo da modificare il colore della linea che rimane nero e io nn vorrei che si vedesse la linea cioè dovrebbe essere uniforme al resto del grafico..

      `\pgfplotsset{width=10cm,compat=1.3}
      \begin{figure}
      \centering
      \begin{tikzpicture}
      \pgfdeclarehorizontalshading{stefan}{50bp}{
      color(0.00000000000000bp)=(violet);
      color(8.33333333333333bp)=(blue);
      color(16.66666666666670bp)=(cyan);
      color(25.00000000000000bp)=(green);
      color(33.33333333333330bp)=(yellow);
      color(41.66666666666670bp)=(orange);
      color(50.00000000000000bp)=(red)
      }
      \begin{axis}[
      %height=9cm,
      %width=9cm,
      grid=major,
      xmajorgrids,
      xmin=-0.3,
      xmax=0.3,
      ymin=0,
      ymax=6,
      colorbar horizontal,colormap/new,no markers,
      colormap={new}{color(0cm)=(violet);color(1cm)=(blue);color(2cm)=(cyan);color(3cm)=(green);color(4cm)=(yellow);color(5cm)=(orange);color(6cm)=(red)}
      ]
      \addplot gnuplot[shading=stefan,color=black,shader=interp,id=DoG,samples=1000,domain=-0.3:0.3,y domain=0:1]{((1/(sqrt(2*pi*0.00570275999999999)))*exp(-(x-0)**2/(2*0.00570275999999999)))}\closedcycle;
      %\addplot[shading=stefan,samples=10,domain=0:1]{x^2}\closedcycles;
      \addlegendentry{model}
      \pgfplotsset{tick style={thin,black},every mark/.append style={solid}}%
      \end{axis}
      \end{tikzpicture}
      \caption{Plot}
      \end{figure}`

    • #73616
      Up
      0
      Down
      ::


      Puoi risolvere plottando due volte, una prima volta l’area e una seconda volta la linea.
      `
      \addplot gnuplot[shading=stefan,color=black,shader=interp,id=DoG,samples=1000,domain=-0.3:0.3,y domain=0:1]{((1/(sqrt(2*pi*0.00570275999999999)))*exp(-(x-0)**2/(2*0.00570275999999999)))}\closedcycle;
      \addplot+ gnuplot[mesh,point meta=x,id=DoG,samples=1000,domain=-0.3:0.3,y domain=0:1]{((1/(sqrt(2*pi*0.00570275999999999)))*exp(-(x-0)**2/(2*0.00570275999999999)))}\closedcycle;
      `
      E’ molto più lento in fase di compilazione, ma non sono riuscito a dare il contorno dello stesso colore o a far sparire la linea.

      Provo adesso ad anticiparti 😉 , e ti dico che se vuoi plottare gli assi al di sopra del grafico puoi fare così

      `
      \makeatletter \newcommand{\pgfplotsdrawaxis}{\pgfplots@draw@axis} \makeatother
      \pgfplotsset{axis line on top/.style={
      axis on top=false,
      after end axis/.code={
      \pgfplotsset{axis line style=opaque,
      ticklabel style=opaque,
      tick style=opaque,
      grid=none}
      \pgfplotsdrawaxis}
      }
      }
      `

      e dare così la chiave “axis line on top” ad axis.
      Trucchetto copiato da questa discussione.

      Ciao,
      Roberto

    • #73617
      Up
      0
      Down
      ::


      `
      \usepackage{pgfplots}
      \pgfplotsset{width=10cm}

      \begin{figure}
      \centering
      \begin{tikzpicture}
      \pgfdeclarehorizontalshading{stefan}{50bp}{
      color(0.00000000000000bp)=(violet);
      color(8.33333333333333bp)=(blue);
      color(16.66666666666670bp)=(cyan);
      color(25.00000000000000bp)=(green);
      color(33.33333333333330bp)=(yellow);
      color(41.66666666666670bp)=(orange);
      color(50.00000000000000bp)=(red)
      }
      \begin{axis}[
      %height=9cm,
      %width=9cm,
      grid=major,
      xmajorgrids,
      xmin=-0.3,
      xmax=0.3,
      ymin=0,
      ymax=6,
      axis on top=true,
      %xtick={-0.3,-0.29,…,0.3},
      xticklabels={%
      $-0.4$,
      $-0.3$,
      $-0.2$,
      $-0.1$,
      $\mu$,
      $0.1$,
      $0.2$,
      $0.3$,
      $0.4$},
      % note: \frac can be done automatically:
      % xticklabel style={/pgf/number format/frac},
      minor tick num=3,
      xlabel=\large$x$,
      ylabel=\large$f_{\mu,\sigma^2}(x)$,
      colorbar horizontal,colormap/new,no markers,
      colormap={new}{color(0cm)=(violet);color(1cm)=(blue);color(2cm)=(cyan);color(3cm)=(green);color(4cm)=(yellow);color(5cm)=(orange);color(6cm)=(red)}]
      \addplot gnuplot[shading=stefan,color=black,shader=interp,id=DoG,samples=1000,domain=-0.3:0.3,y domain=0:1]{((1/(sqrt(2*pi*0.00570275999999999)))*exp(-(x-0)**2/(2*0.00570275999999999)))}\closedcycle;
      \addplot+ gnuplot[mesh,point meta=x,id=DoG,samples=1000,domain=-0.3:0.3,y domain=0:1]{((1/(sqrt(2*pi*0.00570275999999999)))*exp(-(x-0)**2/(2*0.00570275999999999)))}\closedcycle;
      \pgfplotsset{tick style={thin,black},every mark/.append style={solid}}
      \end{axis}
      \end{tikzpicture}
      \caption{Plot}
      \end{figure}`

      sono giunto a questa situazione 😉 è quasi perfetta, vorrei solo aggiungere i numeri sugli assi anche sopra e a destra e colorare di nero anzi che di grigio la linea verticale della griglia passante per la media (mi) ! ma quella roba dell’ axis on top nn lo capita, aggiungendo il tuo codice nn cambiava niente, io ho aggiunto prendendo spunto dal tuo consiglio `axis on top=true` e ha messo gli assi sopra il plot era questo che intendevi?? la linea è andata via ma non del tutto rimane una traccia grigia… sai anche come sostituire i valori della color bar a piacimento? come ho fatto per l’ asse x inserendo la lettera mi ?

    • #73618
      Up
      0
      Down
      ::


      Non so se sia possibile aggiungere le etichette su tutti gli assi, puoi provare a dare gli assi separatamente, come suggerito nel capitolo 4.8.10 del manuale, ovviamente utilizzando gli stessi tick per i due assi.

      Il comando era “axis line on top”, era stato dato apposta per evitare che la griglia si sovrapponesse al grafico. In pratica quando pgfplots disegna gli assi, disegna tutto assieme: assi, tick e griglia. Ergo se dai l’opzione “axis on top” lui disegnerà tutto al di sopra del grafico. Se scrivi
      `\makeatletter \newcommand{\pgfplotsdrawaxis}{\pgfplots@draw@axis} \makeatother
      \pgfplotsset{axis line on top/.style={
      axis on top=false,
      after end axis/.code={
      \pgfplotsset{axis line style=opaque,
      ticklabel style=opaque,
      tick style=opaque,
      grid=none}
      \pgfplotsdrawaxis}
      }
      }`
      dopo \begin{tikzpicture} e prima prima di \begin{axis} e passi ad axis la chiave “axis line on top”, avrai che la griglia verrà disegnata prima, mentre assi e tick verranno disegnati dopo il grafico.

      Per avere una linea verticale ti basta dare “\addplot+ coordinates {(0,0) — (0,6)};” che darai prima o dopo gli altri addplot a seconda chi vuoi venga disegnato per prima.
      Per sostituire i valori della colorbar “point meta min” e “point meta max”, capitolo 4.7 del manuale.

    • #73619
      Up
      0
      Down
      ::


      `\begin{figure}
      \centering
      \begin{tikzpicture}
      \makeatletter \newcommand{\pgfplotsdrawaxis}{\pgfplots@draw@axis} \makeatother
      \pgfplotsset{axis line on top/.style={
      axis on top=false,
      after end axis/.code={
      \pgfplotsset{axis line style=opaque,
      ticklabel style=opaque,
      tick style=opaque,
      grid=none}
      \pgfplotsdrawaxis}
      }
      }
      \pgfdeclarehorizontalshading{stefan}{50bp}{
      color(0.00000000000000bp)=(violet);
      color(8.33333333333333bp)=(blue);
      color(16.66666666666670bp)=(cyan);
      color(25.00000000000000bp)=(green);
      color(33.33333333333330bp)=(yellow);
      color(41.66666666666670bp)=(orange);
      color(50.00000000000000bp)=(red)
      }
      \begin{axis}[
      %height=9cm,
      %width=9cm,
      grid=major,
      xmajorgrids,
      xmin=-0.3,
      xmax=0.3,
      ymin=0,
      ymax=6,
      point meta min={-0.3},
      point meta max={0.3},
      axis line on top,
      %xtick={-0.3,-0.29,…,0.3},
      xticklabels={%
      $-0.4$,
      $-0.3$,
      $-0.2$,
      $-0.1$,
      $\mu$,
      $0.1$,
      $0.2$,
      $0.3$,
      $0.4$},
      % note: \frac can be done automatically:
      % xticklabel style={/pgf/number format/frac},
      minor tick num=4,
      xlabel=\large$x$,
      ylabel=\large$f_{\mu,\sigma^2}(x)$,
      colorbar horizontal,colormap/new,no markers,
      colormap={new}{color(0cm)=(violet);color(1cm)=(blue);color(2cm)=(cyan);color(3cm)=(green);color(4cm)=(yellow);color(5cm)=(orange);color(6cm)=(red)}]
      \addplot gnuplot[shading=stefan,color=black,shader=interp,id=DoG,samples=1000,domain=-0.3:0.3,y domain=0:1]{((1/(sqrt(2*pi*0.00570275999999999)))*exp(-(x-0)**2/(2*0.00570275999999999)))}\closedcycle;
      \addplot+ gnuplot[mesh,point meta=x,id=DoG,samples=1000,domain=-0.3:0.3,y domain=0:1]{((1/(sqrt(2*pi*0.00570275999999999)))*exp(-(x-0)**2/(2*0.00570275999999999)))}\closedcycle;
      \addplot+ [black] coordinates {(0,0)(0,6)};
      \pgfplotsset{tick style={thin,black},every mark/.append style={solid}}
      \end{axis}
      \begin{axis}[
      %height=9cm,
      %width=9cm,
      xmin=-0.3,
      xmax=0.3,
      ymin=0,
      ymax=6,
      axis line on top,
      axis y line*=right,
      axis x line=none
      ]
      \pgfplotsset{tick style={thin,black},every mark/.append style={solid}}
      \end{axis}
      \begin{axis}[
      %height=9cm,
      %width=9cm,
      xmin=-0.3,
      xmax=0.3,
      ymin=0,
      ymax=6,
      axis line on top,
      axis x line*=top,
      axis y line=none,
      xticklabels={%
      $-0.4$,
      $-0.3$,
      $-0.2$,
      $-0.1$,
      $\mu$,
      $0.1$,
      $0.2$,
      $0.3$,
      $0.4$}
      ]
      \pgfplotsset{tick style={thin,black},every mark/.append style={solid}}
      \end{axis}
      \end{tikzpicture}
      \caption{Plot}
      \end{figure}`

      ecco ! haha ho capito, grazie mille, mi hai anticipato davvero quando ho messo axis on top e ho visto la griglia sopra me la sono un pò fatta piacere ! e invece tu mi avevi già dato la soluzione lol gli assi con i valori gli ho messi ma nn sono sicuro che mi piacciano… perchè l’ area del grafico quando compilo solo ogni tanto viene esportata in modo corretto nel pdf da pdflatex mentre la visualizzo sempre correttamente dal visualizzatore dell’ editor ? Con point meta min e max posso scegliere solo il minimo e il massimo giusto?

    • #73620
      Up
      0
      Down
      ::


      Esatto, con min e max puoi scegliere solo minimo e massimo, e anche se credo si possa fare qualcosa per modificare gli altri valori, non ho la più pallida idea di come si possa fare, credo che bisogni andare a guardare nel menu di pgf.

    • #73621
      Up
      0
      Down
      ::


      Ho capito.. ho chiesto anche su un altro forum se mi rispondono ti tengo aggiornato..

      durante la compilazione mi viene sempre fuori questo errore che apparentemente non crea casini:

      pgfkeys: I do not know the key ‘/tikz/colormap/new’ and I am going to ignore it. Perhaps you misspelled it. \end{axis}

      ho capito che è dovuto alla barra dei colori ma non capisco perchè viene fuori.. secondo te?

    • #73622
      Up
      0
      Down
      ::


      Pensavo che avessi dichiarato quella colormap da qualche altra parte, e quindi la commentavo prima di compilare. In pratica la chiave “colormap/new” (capitolo 4.6.6 del manuale) dice a pgfplots di usare una colormap di nome “new”, siccome non è una mappa standard, lui si aspetta che tu l’abbia dichiarata in precedenza; visto che tu non hai dichiarato nessuna mappa “new” pgfplots semplicemente ignora la chiamata, anche se è comunque qualcosa che può dare problemi, quindi togli quella chiave.

    • #73623
      Up
      0
      Down
      ::


      `\documentclass{standalone}
      \usepackage{pgfplots}
      \begin{document}
      \pgfplotsset{width=10cm}

      \begin{tikzpicture}
      \makeatletter \newcommand{\pgfplotsdrawaxis}{\pgfplots@draw@axis} \makeatother
      \pgfplotsset{axis line on top/.style={
      axis on top=false,
      after end axis/.append code={
      \pgfplotsset{axis line style=opaque,
      ticklabel style=opaque,
      tick style=opaque,
      grid=none}
      \pgfplotsdrawaxis}
      }
      }
      \pgfdeclarehorizontalshading{stefan}{50bp}{
      color(0.00000000000000bp)=(violet);
      color(8.33333333333333bp)=(blue);
      color(16.66666666666670bp)=(cyan);
      color(25.00000000000000bp)=(green);
      color(33.33333333333330bp)=(yellow);
      color(41.66666666666670bp)=(orange);
      color(50.00000000000000bp)=(red)
      }
      \begin{axis}[
      grid=major,
      xmin=-0.3, xmax=0.3,
      ymin=0, ymax=6,
      point meta min={-0.3},
      point meta max={0.3},
      axis line on top,
      tick style={thin,black},
      xticklabel style={text height=1.5ex},
      xticklabels={%
      $-0.4$,
      $-0.3$,
      $-0.2$,
      $-0.1$,
      $\mu$,
      $0.1$,
      $0.2$,
      $0.3$,
      $0.4$},
      extra x ticks={-0.4,-0.3,…,0.4},
      extra x tick labels={%
      $-0.4$,
      $-0.3$,
      $-0.2$,
      $-0.1$,
      $\mu$,
      $0.1$,
      $0.2$,
      $0.3$,
      $0.4$},
      extra x tick style={
      xticklabel pos=right,
      xticklabel style={text depth=0pt}
      },
      extra y ticks={0,…,6},
      extra y tick style={
      yticklabel pos=right
      },
      minor tick num=4,
      xlabel=\large $x$,
      ylabel=\large $f_{\mu,\sigma^2}(x)$,
      colorbar horizontal,
      colorbar style={
      xticklabels={%
      $-0.4$,
      $-0.3$,
      $-0.2$,
      $-0.1$,
      $\mu$,
      $0.1$,
      $0.2$,
      $0.3$,
      $0.4$
      },
      xticklabel style={text height=1.5ex}
      },
      no markers,
      colormap={new}{color(0cm)=(violet);color(1cm)=(blue);color(2cm)=(cyan);color(3cm)=(green);color(4cm)=(yellow);color(5cm)=(orange);color(6cm)=(red)},
      after end axis/.append code={
      \draw ({rel axis cs:0,0}-|{axis cs:0,0}) — ({rel axis cs:0,1}-|{axis cs:0,0});
      }]
      \addplot gnuplot[
      shading=stefan,
      draw=none,
      shader=interp,
      id=DoG,
      samples=1000,
      domain=-0.3:0.3,
      y domain=0:1
      ]{((1/(sqrt(2*pi*0.00570275999999999)))*exp(-(x-0)**2/(2*0.00570275999999999)))}\closedcycle;
      \end{axis}
      \end{tikzpicture}

      \end{document}`

      guarda ! su un forum mi hanno dato questo.. secondo te i numeri della griglia sono più spessi di quelli della colorbar? a me sembrano come leggermente in grassetto no?

    • #73624
      Up
      0
      Down
      ::


      E’ un problema del visualizzatore, aprendolo con acrobat le dimensioni mi sembrano uguali.

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

Go to top