Graficare file CSV con gnuplot

Installazione, configurazione e uso di programmi e strumenti.
Avatar utente
DoctorStrange
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2933
Iscrizione: mercoledì 14 ottobre 2015, 9:33
Desktop: Gnome3
Distribuzione: Ubuntu 22.04 LTS Jammy Jellyfish
Sesso: Maschile
Località: Roma, Italia

Graficare file CSV con gnuplot

Messaggio da DoctorStrange »

Buongiorno a tutti,

Mi ritrovo oggi in una situazione un pò strana.

Ho eseguito una campionatura con il mio oscilloscopio, ed il risultato di questa è un file con estensione CSV, ovvero il tipico file di excel, che posso aprire benissimo anche con LibreOffice Calc.

Il contenuto di questo file CSV, è una lunga serie di letture in tensione del segnale che mi interessa, con la corrispondente marcatura temporale, in pratica una cosa del genere:

Immagine

Ed il segnale che ha generato questa lettura è una cosa come questa:

Immagine

La mia domanda ora è: Esiste un'applicazione, magari leggerissima, o anche solo da riga di comando che mi permetta di fare il plot di questa lettura?

Mi serve per poter studiare questo segnale e cercare di decodificarlo usando solo il mio computer portatile senza, ovviamente, dovermi portare dietro l'oscilloscopio e tutto il banco prova.

Il file complessivo consta di più di quattromila record, ma sono tutte costanti numeriche come quelle postate, quindi vorrei evitare di usare applicazioni elefantiache come Matlab solo per fare questo plot.

Ho provato a plottare i dati con lo stesso Libreoffice, ma non riesco a capire molto bene come fare a definire quali siano i dati in ingresso e come metterli sui due assi.

Qualcuno di voi conosce magari un'applicazione che faccia solo questo genere di plot, e sia quindi ottimizzata?

Oppure mi potreste aiutare a farlo con libreoffice stesso? In questo caso, come faccio a definire quale delle due serie definisce un asse, e quale l'altro?

C'è un modo per aumentare o ridurre il fondoscala su uno dei due assi?

Grazie mille a tutti.
Ultima modifica di DoctorStrange il martedì 14 febbraio 2017, 8:28, modificato 1 volta in totale.
Avatar utente
wilecoyote
Tenace Tecnocrate
Tenace Tecnocrate
Messaggi: 15770
Iscrizione: giovedì 20 agosto 2009, 16:21
Desktop: Kubuntu et alii
Distribuzione: 9.04 32bit 14/18/20/22.04 LTS 64bit
Sesso: Maschile
Località: Ceranesi - Ge

Re: Applicazione per plottare un grafico?

Messaggio da wilecoyote »

:) Salve, non sono pratico della materia, e meno che mai di Window fortunatamente, comunque posso indicarti 3 modi per creare i grafici.

Il 1° è il classico Gnuplot, il 2° è Picviz, ed entrambi sono nel repository, il 3° è Datastatix e per maggiori informazioni clicca qui.

Ammetto di non aver minimamente capito quale dei 3 è meglio, mi limito ad annuire quando il patito di turno decanta le lodi del suo preferito... :shy:

:ciao: Ciao
ACER Extensa 5230E 2,2 Ghz cpu Celeron 900 hdd 160 GB Ram 1 GB scheda video Intel GM500
ACER Extensa 5635Z 2,2 Ghz cpu Celeron T3100 hdd 320 GB Ram 4 GB scheda video Intel Mobile 4
Quando una Finestra chiusa incontra un Pinguino la Finestra chiusa è una Finestra aperta.
Avatar utente
DoctorStrange
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2933
Iscrizione: mercoledì 14 ottobre 2015, 9:33
Desktop: Gnome3
Distribuzione: Ubuntu 22.04 LTS Jammy Jellyfish
Sesso: Maschile
Località: Roma, Italia

Re: Applicazione per plottare un grafico?

Messaggio da DoctorStrange »

Perfetto, grazie mille williecoyote.

Grazie al tuo suggerimento ora uso bene gnuplot.

Vorrei ora povare a fare una cosa, sempre con gnuplot, in pratica, se possibile vorrei associare l'origine dell'ascissa al punto d'inizio del mio grafico, che inizia dove comincia l'onda quadra più lunga sulla sinistra, ed associare il fondo scala, sempre dell'ascissa alla fine del grafico.

Hai idea di come fare? Io avevo pensato che l'unico modo di riuscire, era di modificare proprio i dati, eliminando tutti i dati che sono sempre consanti, ed uguali a zero, prima del primo fronte, e lo stesso per il fondoscala, eliminando tutti i dati che restano uguali e non hanno più variazioni dall'ultimo fronte, fino alla fine.

Tu sai invece se esiste un modo di modificare la visualizzazzione di gnuplot fissando origini e fondo scala, in funzione di un certo valore della funzione plottata?

In pratica la mia domanda si riduce a: Si può fissare l'origine degli assi quando la funzione passa da zero ad un valore diverso da zero, e si può fissare il fondo scala, quando la funzione non ha più variazioni?

Si può inoltre abilitare la funzione zoom manuale alla funzione rappresentata?

Grazie.
Ultima modifica di DoctorStrange il martedì 14 febbraio 2017, 8:29, modificato 1 volta in totale.
Avatar utente
tokijin
Moderatore Globale
Moderatore Globale
Messaggi: 4625
Iscrizione: mercoledì 3 giugno 2009, 23:10
Desktop: plasma 5.27.4
Distribuzione: Kubuntu 23.04
Località: Abruzzo

Re: Applicazione per plottare un grafico?

Messaggio da tokijin »

@harperfalcata
Se hai scelto gnuplot come applicazione (scelta che avrei fatto anche io :) ) ti consiglio di modificare il titolo del primo post con qualcosa che sia più specifico e che non sia una semplice richiesta di software.
Una cosa del genere "Graficare file csv con gnuplot" o simile, qualcosa che spieghi meglio la situazione :)

Ciao :ciao:
Sei abbruzzese se dopo che ti sei strafogato un chilogrammo di pasta, hai il coraggio di dire alla cuoca "cacc ch'è cott" - Se entra un piccione in casa..chiudi le finestre!
Ubuntu User #28657 - Il mio vecchio hardware - Tag Codice
Avatar utente
wilecoyote
Tenace Tecnocrate
Tenace Tecnocrate
Messaggi: 15770
Iscrizione: giovedì 20 agosto 2009, 16:21
Desktop: Kubuntu et alii
Distribuzione: 9.04 32bit 14/18/20/22.04 LTS 64bit
Sesso: Maschile
Località: Ceranesi - Ge

Re: Graficare file CSV con gnuplot

Messaggio da wilecoyote »

:) Salve, come già dattilografai non uso i programmi per i grafici, il mio compito è leggerli semmai.

Però se hai scelto Gnuplot, molto configurabile e documentato, in rete puoi trovare tantissimi tutorial e ti consiglio di cominciare con termini 'tutorial gnuplot italiano', sempreché non preferisci l'inglese o altra lingua.

:ciao: Ciao
ACER Extensa 5230E 2,2 Ghz cpu Celeron 900 hdd 160 GB Ram 1 GB scheda video Intel GM500
ACER Extensa 5635Z 2,2 Ghz cpu Celeron T3100 hdd 320 GB Ram 4 GB scheda video Intel Mobile 4
Quando una Finestra chiusa incontra un Pinguino la Finestra chiusa è una Finestra aperta.
Avatar utente
DoctorStrange
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2933
Iscrizione: mercoledì 14 ottobre 2015, 9:33
Desktop: Gnome3
Distribuzione: Ubuntu 22.04 LTS Jammy Jellyfish
Sesso: Maschile
Località: Roma, Italia

Re: Graficare file CSV con gnuplot

Messaggio da DoctorStrange »

La lingua non sarebbe un problema, qui devo modificare però il dataset sul quale il grafico viene generato.

Al momento il grafico generato da gnuplot è questo:

Immagine

Che in pratica è esattamente quello che volevo fare, ed è uguale al grafico di partenza.

Ora però vorrei modificarlo, come dicevo prima perchè vorrei eliminare le aree del grafico stesso che non sono parte del plot, vorrei cioè eliminare quelle due parti, cerchiate di verde nella parte alta dell'immagine.

Il plot l'ho realizzato tramite questo script:

Codice: Seleziona tutto

#!/bin/bash

#Questo script prende il file CSV generato dall'oscilloscopio, 
#e lo converte in un opportuno formato, in modo da creare il
#file .dat per poter generare il plot.

#Per prima cosa elimino ogni file dalla directory di conversione
cd /home/leonardo/MioArchivio/Letture\ Oscilloscopio;
rm *.*;

#Ora vado sulla scrivania a prendere il file CSV..
cd /home/leonardo/Scrivania;

if [ -f *.CSV ]; then
cp *.CSV /home/leonardo/MioArchivio/Letture\ Oscilloscopio;
else
notify-send 'Nessun file' 'Non c è alcun file .CSV sul desktop';
fi;
cd /home/leonardo/MioArchivio/Letture\ Oscilloscopio;

#Converto il file CSV in TXT;
cat *.CSV > RGB.txt;

cat RGB.txt | sed -e '1,2d' | sed -e 's/,,/,/g' \
		| cut --delimiter="," --field=3,4 \
		| sed -e 's/^\ //g' \
		| sed -e 's/,/\ /g' > RGB.dat

#Ora copio lo script per far eseguire il plot nella directory
#locale
cp /home/leonardo/MioArchivio/Script/GnuplotLoadCommand \
	/home/leonardo/MioArchivio/Letture\ Oscilloscopio;

#A questo punto, prima di dare il comando di plot, devo fare
#una manipolazione sui dati.
#Per fare in modo che la parte veramente visualizzata sul
#grafico sia l'intero grafico utile, voglio associare 
#all'origine dell'ascissa il primo fronte d'onda quadra utile, 
#ed al fondo scala, sempre dell'ascissa, l'ultimo fronte d'onda.
#Per fare questo dovrò modificare i dati che ho, perchè nel file
#CSV d'origine, sono memorizzati anche eventuali parti del
#segnale agli estremi, che sono sempre zero.
#Faccio quindi per ogni simbolo del file CSV in ingresso,
#una differenza con il simbolo che lo precede, ma questo lo
#dovrò fare solo all'inizio ed alla fine dell'intero file,
#perchè voglio eliminare le parti del segnale che, all'esterno
#non rappresentano variazioni.

#Prima di tutto devo ottenere il numero di record contenuti nel
#file:
NumeroRecord=$(cat RGB.dat | wc --lines); 

#Ora creo il ciclo per eliminare tutti i valori nulli prima del
#primo fronte d'onda utile. 

#Creo una costante, chiamata "SogliaDiscriminante" che in 
#pratica è il valore che mi definisce al di sotto di quale
#soglie, tutte le letture vanno eliminate.
SogliaDiscriminante=6000;

#Per prima cosa inizializzo a zero il valore della cariabile
#ValorePrecedente
ValorePrecedente=0;

for i in $NumeroRecord
do

#Estraggo di volta in volta il valore dalla lista. 
#Il primo sed serve a rimuovere un eventuale segno "meno", 
#per ottenere il valore assoluto.
#Il secondo sed invece serve per rimuovere il ".",
#perchè la sottrazioone per calcolare la differenza non puo'
#essere effettuata tra numeri decimali.
#Il terzo sed serve a rimuovere ogni zero all'inizio, prima
#della cifra reale.
#Iòl quarto sed serve a rimuovere uno zero allla fine per
#ridurre un pò l'intervallo di valori generati.

RigaAttuale=$(cat RGB.dat | sed -n $i'p');

TempoAttuale=$(cat RGB.dat | sed -n $i'p' \
		| cut --delimiter=" " --field=1);

TensioneAttuale=$(cat RGB.dat | sed -n $i'p' \
		| cut --delimiter=" " --field=2);

TensioneModificataAttuale=$(cat RGB.dat \
		| sed -n $i'p' \
		| cut --delimiter=" " --field=2 \
		| sed -e 's/-//g' \
		| sed -e 's/\.//g' \
		| sed -e 's/^0//g' \
		| sed -e 's/0$//g');

echo "Tempo: " $TempoAttuale "Tensione: " $TensioneAttuale "Tensione modificata attuale: " $TensioneModificataAttuale;
echo "Riga attuale: " $RigaAttuale;

Differenza=$((TensioneModificataAttuale - ValorePrecedente));
echo "La differenza vale: " $Differenza;
if [ $Differenza -gt $SogliaDiscriminante  ]; then
#break;
echo "Sono nell if interno";
else
#Se arrivo all'interno di questo else, vuol dire che l'attuale
#valore letto si trova al di sotto della soglia accettata, e 
#quindi lo posso eliminare dal set di dati.
#Elimino dunque il recorecho "*" >> RGB.dat;;
echo "Ciao";
fi
ValorePrecedente=$TensioneModificataAttuale;
done

gnuplot --persist GnuplotLoadCommand;
Il contenuto di GnuplotLoadCommand è semplicemente la riga:

Codice: Seleziona tutto

plot "RGB.dat" with lines
Questo script fà tutto quello che voglio tranne una, per la quale vorrei chiedere consiglio.

Tutta la prima parte dello script si occupa di prendere il file CSV in ingresso, convertirlo in .dat e riformattarlo secondo la sintassi di cui ha bisogno gnuplot per funzionare, e questa parte non ha problemi.

Nella secnda parte invece, dovrebbe prendere uno dopo l'altro tutti i valori che vengono messi nel file RGB.dat, scorrerli uno dopo l'altro e fare la differenza tra il valore letto al momento, ed il valore precedente.

Se questa differenza si trova al di sotto di una certa soglia, vuol dire che nel grafico quella particolare lettura corrisponde ad una costante, ovvero il grafico non varia, e quindi vorrei procedere con eliminare quella riga dal dataset.

Vorrei cioè eliminare quella particolare coppia, che mi ha appena generato una differenza "idonea", ma non ci riesco in alcun modo.

Come posso fare ad eliminare da un file che è aperto ed in lettura all'interno di una routine, un suo valore?

Ho provato ad eliminare la costante attraverso un "tr -d $RigaAttuale" ed anche con "sed $RigaAttuale'd' " ma ora comincio a finire le idee.

Potreste aiutarmi?

Grazie mille.
Scrivi risposta

Ritorna a “Applicazioni”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 8 ospiti