Ordine coordinate in \addplot con Pgfplots

  • Creatore
    Topic
  • #95311
    Up
    0
    Down
    ::


    Ciao a tutti!
    Ho un piccolo problema con dei grafici che sto disegnando con Pgfplots.
    Devo diagrammare dei dati che ho in un file di testo, con colonne x e y, generati da Fluent. Sono dei grafici di temperatura lungo x.
    Fin qui nessun problema, ho usato un codice del genere, seguendo le guide di Pantieri, De Marco, ecc (ai quali vanno infiniti ringraziamenti per le loro chiarissime guide):

    `
    \begin{tikzpicture}
    \begin{axis} [tralascio tutte le opzioni]
    \addplot [line width=1pt,blue]
    file {Temperature_X_P1};
    \end{axis}
    \end{tikzpicture}
    `

    Il problema è che nel file di testo le coordinate, per qualche strano motivo, non sono ordinate secondo l’ordine crescente delle x, per cui il grafico non segue il reale andamento.
    Infatti anche su excel si presenta lo stesso problema, ma c’è un’opzione che permette di ordinare secondo i valori di x.
    Ho letto nelle guide che le coordinate nel file di testo vanno date secondo un certo ordine, ma possibile che non ci sia un modo per dare quest’opzione a addplot?
    Ho risolto parzialmente con l’opzione only marks, ma non è così che vorrei disegnare il grafico, avrei bisogno di una linea continua.

    Certo, potrei ordinarli su excel e poi generare un file di testo, ma ho molti dati da diagrammare e ci metterei una vita!

    Qualche suggerimento?
    Grazie in anticipo 🙂

Visualizzazione 13 filoni di risposte
  • Autore
    Risposte
    • #95312
      franen
      Partecipante
        Up
        0
        Down
        ::


        Ciao, a memoria pgfplots dovrebbe avere un’opzione “sort”, anche se non ricordo bene come si usa.
        Appena riesco do un’occhiata, intanto prova a cercare nel manuale.

        Fran

      • #95313
        OldClaudio
        Partecipante
          Up
          0
          Down
          ::


          Strano che il programma Fluent non ti permetta di avere i dati per ordine crescente della variabile indipendente. molto strano.

          Comunque tieni presente che ogni sistema operativo dispone di un comando da dare dal terminale o prompt dei comandi o console, o come si chiama con il tuo sistema operativo, ce permette di mettere in ordine le righe di un file di testo; certo anche con \excel lo puoi fare ma è molto più lungo.

          Su windowd, per esempio, apri una finestra comandi, terminale, console, o come diamine si chiama, scrivici dentro help sort e poi premi il tasto invio; e il servizio help ti dice come fare, quali opzioni specificare, che tipo di ordinamento vuoi fare, eccetera. Di solito il risultato si ottiene in una frazione di tempo rispetto a quello che occorre per scrivere la pria volta il comando da eseguire; per le volte successivi premi la freccia in su del tastierino e ti si ripresenta l’ultimo comando che hai dato, dove non devi riscrivere più tutta la riga ma solo il nome del nuovo file di testo da riordinare con le stesse opzioni. Ti grantisco che è comodissimo.

          Se Mac e su Linux ci sono comandi da terminale del tutto simili, ma gli utenti di Mac e, specialmente, di Linux sono abituati ad usare il terminale, mentre gli utenti Winwows scroprono il terminale con stupore essendo così abituati a lavorare solo con il mouse.

        • #95314
          franen
          Partecipante
            Up
            0
            Down
            ::


            Stando a questo messaggio http://tex.stackexchange.com/questions/64014/how-to-sort-table-for-plotting-with-pgfplots ci si dovrebbe riuscire…
            Fran

          • #95315
            Up
            0
            Down
            ::


            Innanzitutto grazie a tutti!

            Ho provato a seguire il suggerimento di OldClaudio, dal Prompt di Windows, ma ordina i numeri in ordine alfabetico, quindi non riconosce la notazione scientifica, e non risolve il problema.
            Quindi sono andato su Linux, perché ho visto che da terminale c’era qualche opzione del genere, -n per ordinare numericamente, e -g per ordinare seguendo anche la notazione scientifica, ma per qualche motivo in nessuno dei due casi ordina in maniera corretta.
            I numeri sono di questo tipo:

            `-0,000177758 932,835
            -0,000139915 933,099
            -0,000108379 933,347
            -8,21E-005 933,574
            -6,02E-005 933,776
            -4,20E-005 933,954
            -2,67E-005 934,107
            -1,41E-005 934,237
            -3,51E-006 934,345
            3,43E-013 934,385`

            Potrei farlo tramite excel, che ordina bene, ma ci vorrebbe troppo tempo…

            Può darsi che Fluent abbia qualche opzione per ordinare in maniera corretta i dati che scrive, ma sono file che ho già acquisito e salvato, vorrei evitare di fare tutto da capo, non sono pochi…

            Domani proverò a seguire il metodo indicato da franen, oppure li ordinerò tramite excel…

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


              Forse il problema è il separatore decimale.
              Pgfplots credo capisca i numeri con il punto mentre nei dati che hai mostrato c’é la virgola.
              Inoltre i tuoi dati sono già ordinati ma per la seconda colonna.
              R.

            • #95317
              franen
              Partecipante
                Up
                0
                Down
                ::


                `\documentclass{standalone}
                \usepackage{pgfplots, pgfplotstable}

                \usepackage{filecontents}
                \begin{filecontents}{testdata.dat}
                x y
                -0.000177758 932.835
                -0.000139915 933.099
                -1.41E-005 934.237
                -0.000108379 933.347
                -8.21E-005 933.574
                -6.02E-005 933.776
                -4.20E-005 933.954
                -2.67E-005 934.107
                -3.51E-006 934.345
                3.43E-013 934.385
                \end{filecontents}

                \pgfplotstablesort{\sorted}{testdata.dat}

                \begin{document}
                \begin{tikzpicture}
                \begin{axis}
                \addplot table {\sorted};
                \end{axis}
                \end{tikzpicture}
                \end{document}`
                Funziona tutto! (io ho sostituito le virgole con i punti, ma con pgfplots c’è il modo di usare anche le vorgole (solo che facevo prima così, senza andare a cercare…).

                Ho avuto anche io esperienze col comando sort di windows, solo che ha il difetto di ordinare i numeri come 1,11,2,21,3,…

                Fran

              • #95318
                franen
                Partecipante
                  Up
                  0
                  Down
                  ::


                  Così, tanto per dire: nel mondo LaTeX3 c’è il pacchetto l3sort che permette di ordinare liste, sequenze e token list. Un esempio:`\documentclass{article}
                  \usepackage{xparse,l3sort}

                  \ExplSyntaxOn
                  \clist_set:Nn \l_foo_clist {-0.1,0.3,-1.56}
                  \clist_sort:Nn \l_foo_clist
                  {
                  \fp_compare:nNnTF { #1 } > { #2 }
                  { \sort_reversed: }
                  { \sort_ordered: }
                  }
                  \NewDocumentCommand\SortList{}
                  {\clist_use:Nnnn \l_foo_clist { ,~ } { ,~ } { ,~ } }
                  \ExplSyntaxOff
                  \begin{document}
                  \SortList
                  \end{document}`
                  Certo, in questo caso non è di molta utilità 🙂

                  Fran

                • #95319
                  Up
                  0
                  Down
                  ::

                  Forse il problema è il separatore decimale.
                  Pgfplots credo capisca i numeri con il punto mentre nei dati che hai mostrato c’é la virgola.
                  Inoltre i tuoi dati sono già ordinati ma per la seconda colonna.
                  R.

                  No, i numeri originariamente sono con il punto, ho messo la virgola per importarli in excel.
                  Sono ordinati solo per caso rispetto alla seconda colonna, evidentemente è un tratto con variazione monotona della temperatura. Ma comunque devono essere ordinati rispetto alla prima colonna, l’ascissa.

                  Funziona tutto! (io ho sostituito le virgole con i punti, ma con pgfplots c’è il modo di usare anche le vorgole (solo che facevo prima così, senza andare a cercare…).

                  Ho avuto anche io esperienze col comando sort di windows, solo che ha il difetto di ordinare i numeri come 1,11,2,21,3,…

                  Fran

                  Sì ho visto, ma la serie di dati per ogni grafico è molto più grande di questa, fino a 500-700 numeri, se li copio tutti il codice diventa enorme!

                  Grazie, vedo un po’ come fare, magari con excel 🙂

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

                    elios” post=94941

                    Forse il problema è il separatore decimale.
                    Pgfplots credo capisca i numeri con il punto mentre nei dati che hai mostrato c’é la virgola.
                    Inoltre i tuoi dati sono già ordinati ma per la seconda colonna.
                    R.

                    No, i numeri originariamente sono con il punto, ho messo la virgola per importarli in excel.
                    Sono ordinati solo per caso rispetto alla seconda colonna, evidentemente è un tratto con variazione monotona della temperatura. Ma comunque devono essere ordinati rispetto alla prima colonna, l’ascissa.

                    Funziona tutto! (io ho sostituito le virgole con i punti, ma con pgfplots c’è il modo di usare anche le vorgole (solo che facevo prima così, senza andare a cercare…).

                    Ho avuto anche io esperienze col comando sort di windows, solo che ha il difetto di ordinare i numeri come 1,11,2,21,3,…

                    Fran

                    Sì ho visto, ma la serie di dati per ogni grafico è molto più grande di questa, fino a 500-700 numeri, se li copio tutti il codice diventa enorme!

                    Grazie, vedo un po’ come fare, magari con excel 🙂

                    In pgfplots puoi caricare dati da file esterni, se è questo il problema.
                    Io eventualmente vedrei l’uso di un foglio di calcolo sono per effettuare l’ordinamento dei valori.
                    A proposito, lo sai che in un foglio elettronico si può importare i dati anche con il punto decimale con conversione automatica di formato vero?
                    R.

                    ps.
                    si potrebbe scrivere un piccolo script che ordina i dati di tutti i file in un colpo solo…

                  • #95321
                    franen
                    Partecipante
                      Up
                      0
                      Down
                      ::

                      elios” post=94941

                      Sì ho visto, ma la serie di dati per ogni grafico è molto più grande di questa, fino a 500-700 numeri, se li copio tutti il codice diventa enorme!

                      Spetta spetta…
                      non è che devi copiare i tuoi dati nel documento! Nel mio esempio ho usato il pacchetto filecontents che permette di creare un file esterno, in questo caso il file testdata.dat. Tu dovresti solo crearti i tuoi file di testo contenenti i tuoi dati e poi usarli per fare i grafici!
                      Fran

                    • #95322
                      Up
                      0
                      Down
                      ::

                      elios” post=94941

                      Funziona tutto! (io ho sostituito le virgole con i punti, ma con pgfplots c’è il modo di usare anche le vorgole (solo che facevo prima così, senza andare a cercare…).

                      Ho avuto anche io esperienze col comando sort di windows, solo che ha il difetto di ordinare i numeri come 1,11,2,21,3,…

                      Fran

                      Sì ho visto, ma la serie di dati per ogni grafico è molto più grande di questa, fino a 500-700 numeri, se li copio tutti il codice diventa enorme!

                      Grazie, vedo un po’ come fare, magari con excel 🙂

                      Guarda che il metodo che ti è stato proposto non presuppone di dover copiare i numeri da nessuna parte. Chiaramente, chi risponde non può mettere 700 valori per un test, quindi si utilizzano esempi minimi con strumenti come filecontents. Nello specifico, questo strumento altro non fa che scrivere su un file separato il contenuto dell’ambiente. Il metodo di Fran, quindi si basa sul fatto che ci sia un file esterno da leggere, in .dat o .cvs. E tu chiaramente hai quello con tutti i valori. Perciò altro non ti rimane da fare che prendere quel file e copiarlo nella cartella dove hai questo documento, rinominarlo e lanciare la compilazione.

                      A me sembra meno complicato che andare su Excel 😉

                      Ciao
                      Claudio

                    • #95323
                      Up
                      0
                      Down
                      ::


                      Ok grazie, allora ora proverò così 🙂

                      EDIT
                      ho appena trovato l’opzione di ordinare i punti in Fluent, quando salvo i dati… ovviamente per qualche strano motivo, di default è disattivata…
                      Grazie a tutti! 🙂

                    • #95324
                      OldClaudio
                      Partecipante
                        Up
                        0
                        Down
                        ::


                        Questo intervento potrebbe sembrare fuori tema, ma seocndo me non lo è.

                        Dici che devi riportare grafici con 500-700 punti. Mmm

                        Sicocme la larghezza della apgina è di 210mm e i margini possono arrivare complessivamente a, diciamo 40mm, resta un larghezza di 170mm. togliamo ancora una ventina di millimetri per fare spazio ai tick e alle graduazioni degli assi, specialmante quello verticale, oltre che per la legenda dell’asse,, restano 150mm.
                        quindi se ci metti dentro 500 punti hi una coordinata ogni 150mm/500= 0.3mm. Capisco che il diagramma presenta delle lievi oscillazioni attrono ad un trend abbastanza definito, ma non ti pare che sia troppo mettere tre punti in un millimetro, per giunta collegati con la linea (molto spezzata) del diagramma, dove el oscillazioni sembrano rumore puro?

                        Mi pare u diagramma mal progettato, perché ci sono troppi punti in un diagramma troppo stretto; le cose non migliorerebbero granché se riportassi il disegno rotato di 90º (in senso antiorario), visto che il fiagrama disporrebbe dell’altezza della pagina, invece che della larghezza; con un’altezza della carta di 297mm, tolti 40mm + 20mm per gli stessi motivi detti prima, arrotondando restao 250mm per il fiagramma; con 250mm/500 = 0.5mm per punto, ciò due punti al millimetro: meno brutto di prima, ma lo stesso molto poco significativo.

                        Conclusione: ti suggerisco di ripensare a quei diagrammi; penso che un tratto delle ascisse molto più corso sarebbe molto più significativo. Non so che cosa rappresenti il tuo diagramma; comunque non saprei consigliarti. Probabilmente con punti così filli un diagramma a linea continua o a spezzata sarebe del tutto invisibile con tanti punti così; allora tanto vale riportare solo i punti, tanto l’andamento lo si vede lo stesso e sono talmente vicini che la loro fila sembra un linea continua.

                      • #95325
                        Up
                        0
                        Down
                        ::

                        OldClaudio” post=94952Questo intervento potrebbe sembrare fuori tema, ma seocndo me non lo è.

                        Dici che devi riportare grafici con 500-700 punti. Mmm

                        Sicocme la larghezza della apgina è di 210mm e i margini possono arrivare complessivamente a, diciamo 40mm, resta un larghezza di 170mm. togliamo ancora una ventina di millimetri per fare spazio ai tick e alle graduazioni degli assi, specialmante quello verticale, oltre che per la legenda dell’asse,, restano 150mm.
                        quindi se ci metti dentro 500 punti hi una coordinata ogni 150mm/500= 0.3mm. Capisco che il diagramma presenta delle lievi oscillazioni attrono ad un trend abbastanza definito, ma non ti pare che sia troppo mettere tre punti in un millimetro, per giunta collegati con la linea (molto spezzata) del diagramma, dove el oscillazioni sembrano rumore puro?

                        Mi pare u diagramma mal progettato, perché ci sono troppi punti in un diagramma troppo stretto; le cose non migliorerebbero granché se riportassi il disegno rotato di 90º (in senso antiorario), visto che il fiagrama disporrebbe dell’altezza della pagina, invece che della larghezza; con un’altezza della carta di 297mm, tolti 40mm + 20mm per gli stessi motivi detti prima, arrotondando restao 250mm per il fiagramma; con 250mm/500 = 0.5mm per punto, ciò due punti al millimetro: meno brutto di prima, ma lo stesso molto poco significativo.

                        Conclusione: ti suggerisco di ripensare a quei diagrammi; penso che un tratto delle ascisse molto più corso sarebbe molto più significativo. Non so che cosa rappresenti il tuo diagramma; comunque non saprei consigliarti. Probabilmente con punti così filli un diagramma a linea continua o a spezzata sarebe del tutto invisibile con tanti punti così; allora tanto vale riportare solo i punti, tanto l’andamento lo si vede lo stesso e sono talmente vicini che la loro fila sembra un linea continua.

                        Innanzitutto ti ringrazio per aver preso a cuore questa questione 🙂
                        C’è solo un diagramma che ha un così elevato numero di punti (576), e rappresenta l’andamento di temperatura lungo l’asse di un condotto, che è abbastanza lungo, per questo ha così tanti punti. Inoltre la mesh in alcune zone è abbastanza definita, e sono usciti molti punti.
                        Ho fatto anche dei diagrammi zoomati, attorno al centro del condotto, che è la zona più significativa, ma purtroppo serve sapere anche che valore raggiunge la T in uscita, per cui serve il grafico intero.
                        Se diagrammo solo i punti ho un paio di problemi, il primo è la grandezza dei punti (ma immagino si possa cambiare), che, soprattutto dove sono troppo vicini, fa sembrare che ci sia una linea molto spessa, e il secondo è che i punti non sono equispaziati, quindi si avrebbero zone molto ricche e altre molto povere.
                        Ho provato anche con l’opzione smooth, ma mi sembra che la situazione non migliori.
                        Forse la soluzione sarebbe un’interpolazione con matlab per ridurre il numero di punti, ma sinceramente non ho tempo né voglia di farlo, questo grafico può andare così 🙂

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

                    Go to top