pgfplots e parametri nelle opzioni di \addplot

  • Creatore
    Topic
  • #71642
    Liverpool
    Partecipante
      Up
      0
      Down
      ::


      Devo disegnare un grafico multitraccia con pgfplots partendo da un file con più colonne. Quello che mi serve è un codice del tipo (è solo un esempio):
      1) n=10;
      2) per i che va da 0 ad n-1;
      3) disegna il grafico con x nella colonna 0 e y nella cononna 2i+1.

      Il primo punto è semplice:`\def\n{10}`Per il secondo punto avevo pensato a`\foreach \i [evaluate=\i] in {0,…,\n-1}`che è un costrutto di tikz, ma a quanto pare non va bene con pgfplots, perché mi dà errore. Allora ho risolto con`\pgfmathsetmacro{\fine}{\n-1}
      \foreach \i in {0,…,\fine}`Per il terzo punto dovrei scrivere`\addplot table[header=false, x index=0, y index=???] {file.dat};`dove al posto dei ??? dovrei inserire il codice per eseguire in calcolo di 2i+1, ma non so proprio come fare.

      Avete qualche idea di come eseguire calcoli matematici con parametri nelle opzioni di [tt]\addplot[/tt]?

      Grazie mille

    Visualizzazione 9 filoni di risposte
    • Autore
      Risposte
      • #71643
        Up
        0
        Down
        ::

        Liverpool” post=70835Devo disegnare un grafico multitraccia con pgfplots partendo da un file con più colonne. Quello che mi serve è un codice del tipo (è solo un esempio):
        1) n=10;
        2) per i che va da 0 ad n-1;
        3) disegna il grafico con x nella colonna 0 e y nella cononna 2i+1.

        Il primo punto è semplice:`\def\n{10}`Per il secondo punto avevo pensato a`\foreach \i [evaluate=\i] in {0,…,\n-1}`che è un costrutto di tikz, ma a quanto pare non va bene con pgfplots, perché mi dà errore. Allora ho risolto con`\pgfmathsetmacro{\fine}{\n-1}
        \foreach \i in {0,…,\fine}`Per il terzo punto dovrei scrivere`\addplot table[header=false, x index=0, y index=???] {file.dat};`dove al posto dei ??? dovrei inserire il codice per eseguire in calcolo di 2i+1, ma non so proprio come fare.

        Avete qualche idea di come eseguire calcoli matematici con parametri nelle opzioni di [tt]\addplot[/tt]?

        Forse [tt]\numexpr2*\i+1\relax[/tt] ti potrebbe aiutare.

        Quanto a [tt]\n-1[/tt] non sarebbe più semplice [tt]\def\n{9}[/tt]?

        Dare un esempio vero è troppo complicato?

        Ciao
        Enrico

      • #71644
        Liverpool
        Partecipante
          Up
          0
          Down
          ::

          egreg9″ post=70837Dare un esempio vero è troppo complicato?

          Esempio vero:
          1) n=10 (da modificare in base al file di dati);
          2) per i che va da 0 ad n-1;
          3) per j che va da 1 a 6;
          4) addplot[x index=\i, y index=\i+\j*\n] {file.dat}

          Se scrivo il tuo codice si blocca il compilatore.

          Grazie

        • #71645
          Up
          0
          Down
          ::

          Liverpool” post=70838

          Dare un esempio vero è troppo complicato?

          Esempio vero:
          1) n=10 (da modificare in base al file di dati);
          2) per i che va da 0 ad n-1;
          3) per j che va da 1 a 6;
          4) addplot[x index=\i, y index=\i+\j*\n] {file.dat}

          Se scrivo il tuo codice si blocca il compilatore.

          Tirare a indovinare il codice mi riesce male.

          Ciao
          Enrico

        • #71646
          Liverpool
          Partecipante
            Up
            0
            Down
            ::

            egreg9″ post=70845Tirare a indovinare il codice mi riesce male.

            Cioè vorresti sapere il codice che ho scritto io? Ma non funziona… Comunque:
            `\documentclass{standalone}
            \usepackage{pgfplots}

            \begin{document}
            \begin{tikzpicture}
            \begin{axis}
            \def\n{10}
            \pgfmathsetmacro{\fine}{\n-1}
            \foreach \i in {0,…,\fine} {
            \foreach \j in {1,…,6}
            \addplot[header=false, x index=\i, y index=???] {file.dat};}
            \end{axis}
            \end{tikzpicture}
            \end{document}`

            Il file.dat in allegato è un esempio con due righe e 70 colonne.

            [attachment=181]file.zip[/attachment]

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


              Così sembra funzionare:
              `\def\n{10}
              \pgfmathsetmacro{\fine}{\n-1}
              \foreach \i in {0,…,\fine} {
              \foreach \j in {1,…,6} {
              \pgfmathparse{\i+\j*\n}\pgfmathfloatparsenumber\pgfmathresult
              \pgfmathfloattoint\pgfmathresult
              \let\y\pgfmathresult
              \addplot table[header=false, x index=\i, y index=\y] {file.dat};
              }
              }`
              Il passaggio di conversione da float ad int serve perché altrimenti l’etichetta di colonna viene interpretata come un numero reale e mi dà errore.
              Ovviamente ogni soluzione/variante più elegante è ben accetta.

              Grazie

            • #71648
              Up
              0
              Down
              ::


              Leggermente più compatto:
              `\documentclass{standalone}
              \usepackage{pgfplots}

              \begin{document}
              \begin{tikzpicture}
              \begin{axis}
              \def\n{10}
              \pgfmathsetmacro{\fine}{\n-1}
              \foreach \i in {0,…,10} {
              \pgfmathparse{int(2*\i+1)};
              \let\y\pgfmathresult
              \addplot table[x index=0, y index=\y] {file.dat};
              }
              \end{axis}
              \end{tikzpicture}
              \end{document}`
              Non so perchè, ma se si utilizza [tt]\def[/tt] al posto di [tt]\let[/tt] la compilazione si arresta con un errore
              `! Package pgfplots Error: Sorry, the requested column number '2Y7.0e0]' in tabl
              e 'file.dat' does not exist!? Please verify you used the correct index 0 <= i < N..` lo stesso se si usa direttamente [tt]\pgfmathresult[/tt] per indicare la colonna. Evidentemente [tt]\let[/tt] fa qualcosa al risultato che [tt]\def[/tt] non fa. Ciao Fra

            • #71649
              Liverpool
              Partecipante
                Up
                0
                Down
                ::

                Spike” post=70850Leggermente più compatto:

                Grazie mille! Già va meglio così.

              • #71650
                OldClaudio
                Partecipante
                  Up
                  0
                  Down
                  ::



                  @Spike
                  e @Liverpool,
                  \let non è una definizione, ma crea solo un alias fotografando l’altro token nel momento in cui viene eseguito \let stesso; e serve solo per frare equivalenza fra token;

                  `
                  \let\n=10
                  `
                  per esempio, rende \n equivalente a 1 e lo zero resta fra i token da leggere.

                  Nel caso di
                  `
                  \let\y\pgfmathresult
                  `
                  \y viene reso equivalente alla control sequence \pgfmathresult in quel momento; se \addtoplot ridefinsice \pgfmathresult, \y continua a valere il valore di prima, mentre \def gli assegnerebbe il compito di eseguire \pgfmathresult che, se è stato ridefinito ha una latro sviluppo.

                  Tutti abbiamo avuto difficoltà iniziali a capire la differenza fra \let e \def, ma una volta capita questa differenza, la si apprezza perché consente di fare cose che con il solo \def non si possono fare, e non si possono fare nemmeno con \edef.

                • #71651
                  Liverpool
                  Partecipante
                    Up
                    0
                    Down
                    ::



                    @Claudio

                    Grazie. Ho capito quasi tutto. L’unica cosa che ancora mi sfugge è perché lo zero rimane fuori e come si può fare a farlo rientrare.

                    Ciao

                  • #71652
                    OldClaudio
                    Partecipante
                      Up
                      0
                      Down
                      ::


                      Non si può perché \let fa l’equivalenza di due soli token; il numero 10 è fatto di 2 token, quindi…

                      Casomai fosse importante avere una fotografia del numero 10 prima di entrare nel vivo del programma bisognerebbe usare \def e \let
                      `
                      \def\dieci{10}
                      \let\n=\dieci
                      `
                      ma a questo punto penso che [tt]\def\n{10}[/tt] sia più che sufficiente, visto che penso sia improbabile che \n venga ridefinito da \addplot.
                      Ciao
                      Claudio

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

                  Go to top