2012-05-29 9 views
6

Sono assolutamente nuovo in gnuplot e non ho trovato una soluzione funzionante dopo la ricerca su google.gnuplot: etichetta asse xey della matrice (heatmap) con nomi di righe e colonne

Ho una matrice di dati cercando qualcosa di simile:

A B C D E 
A 0 2 3 4 5 
B 6 0 8 9 0 
C 1 2 0 4 5 
D 6 7 8 0 0 
E 1 2 3 4 0 

Quello che vorrei fare è tracciare una mappa termica con plot 'result.csv' matrix with image, con l'asse x etichettati con AE e l'asse y marcato con AE . Questa matrice non ha sempre la stessa dimensione, ma il numero di righe è sempre uguale al numero di colonne e viene sempre etichettato.

Qualcuno potrebbe aiutarmi con questo? Suppongo di dover usare il comando using, ma fino ad ora questo mi sembra un completo voodoo ...

Grazie mille!

risposta

11

Questo è in realtà un doosie e non riesco a farlo senza un po 'di magia shell * nix.

In primo luogo, vogliamo ottenere la x etichette di graduazione ed etichette di graduazione y:

XTICS="`awk 'BEGIN{getline}{printf "%s ",$1}' test.dat`" 
YTICS="`head -1 test.dat`" 

A questo punto, XTICS è la stringa "F G H I J" e YTICS è la stringa "A B C D E".

Ora, vogliamo impostare i xtics per iterazione:

set for [i=1:words(XTICS)] xtics (word(XTICS,i) i-1) 
set for [i=1:words(YTICS)] ytics (word(YTICS,i) i-1) 

Abbiamo utilizzato 2 gnuplot incorporato funzioni (word e words). words(string) conta quante parole ci sono nella stringa data (una parola è una sequenza di caratteri separata da spazi). word(string,n) restituisce la nona parola nella stringa.

Ora, siamo in grado di tracciare la vostra file di dati ... L'unico problema è che matrix vuole utilizzare tutte le righe e le colonne nel file di dati. Potresti essere in grado di ridurre le righe/colonne effettivamente lette usando la parola chiave every, ma non so come farlo sui file matrix - e penso che sia probabilmente più facile continuare a fare affidamento sulle utilità della shell (awk e sed)

plot "<awk '{$1=\"\"}1' test.dat | sed '1 d'" matrix w image 
#######^ replace the first field with nothing 
##################################^delete first line 

e ora la tua trama (si spera) guarda il modo in cui si desidera.

Si noti inoltre che da quando abbiamo usato l'iterazione, questo script funziona solo in gnuplot 4.3 o superiore - Dal momento che la stabile attuale è la 4.6, si spera che è ok.

+0

Lei, signore, sei il mio eroe del giorno. Grazie mille! – Eekhoorn

+0

@zenbomb - Nessun problema. In realtà è stato un po 'un gioco divertente per me cercare di capirlo. Non lavoro spesso con i file di dati 'matrix', quindi è stata una buona occasione per imparare qualcosa di nuovo su gnuplot. – mgilson

+0

XTICS senza awk: XTICS = "' cut -d '' -f1 test.dat | xargs '"; Abuso di xarg per trasformare le colonne in righe. – Manwe

3

ok, questa domanda è vecchia, ma c'è un modo molto più semplice implementato in gnuplot già:

plot 'result.csv' matrix rowheaders columnheaders with image 

preso da http://gnuplot.sourceforge.net/demo/heatmaps.html

+1

Aggiunta: le opzioni 'rowheader' e' columnheaders' sono disponibili dalla versione 5.0 patchlevel 0. – Christoph

Problemi correlati