2012-05-29 5 views
6

Ich bin absolut neu in gnuplot und habe nach dem googeln keine funktionierende Lösung gefunden.gnuplot: Label x und y-Achse der Matrix (heatmap) mit Zeilen- und Spaltennamen

Ich habe eine Datenmatrix etwas wie folgt aussehen:

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 

Was würde Ich mag eine Heatmap mit plot 'result.csv' matrix with image zu tun ist, Plotten, mit der x-Achse markiert mit AE und der y-Achse mit AE beschriftet . Diese Matrix hat nicht immer die gleiche Größe, aber die Anzahl der Zeilen entspricht immer der Anzahl der Spalten und ist immer beschriftet.

Könnte mir jemand dabei helfen? Ich denke, ich muss den using Befehl verwenden, aber bis jetzt erscheint das wie vollständige Voodoo für mich ...

Vielen Dank!

Antwort

11

Dieser ist eigentlich ein Doosie und ich kann es nicht ohne etwas * nix shell magic machen.

Zuerst wollen wir die x tic Etiketten und y tic Etiketten bekommen:

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

An diesem Punkt ist XTICS die Zeichenfolge "F G H I J" und YTICS ist die Zeichenfolge "A B C D E".

Jetzt wollen wir die xtics iterativ einzustellen:

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

Wir haben 2 gnuplot eingebaute Funktionen verwendet (word und words). words(string) zählt, wie viele Wörter es in der gegebenen Zeichenfolge gibt (ein Wort ist eine durch Leerzeichen getrennte Zeichenfolge). word(string,n) gibt das n-te Wort in der Zeichenfolge zurück.

Jetzt können wir Ihre Daten-Datei plotten ... Das einzige Problem ist, dass matrix willalle Zeilen und Spalten in der Daten-Datei verwenden. Sie können möglicherweise die tatsächlich gelesenen Zeilen/Spalten mit dem Schlüsselwort every reduzieren, aber ich weiß nicht, wie das bei Matrixdateien funktioniert - und ich denke, es ist wahrscheinlich einfacher, sich weiterhin auf Shell-Dienstprogramme zu verlassen (awk) und sed)

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

und jetzt Ihr Grundstück (hoffentlich) sieht so, wie Sie es wollen.

Beachten Sie auch, dass dieses Skript, da wir Iteration verwendet haben, nur in gnuplot 4.3 oder höher funktioniert - Da der aktuelle stabile Wert 4,6 ist, ist das hoffentlich OK.

+0

Sie, Herr, bist mein Held des Tages. Vielen Dank! – Eekhoorn

+0

@zenbomb - Kein Problem. Es war wirklich ein lustiges Spiel für mich, um es herauszufinden. Ich arbeite nicht oft mit 'Matrix'-Dateien, daher war es eine gute Gelegenheit, etwas Neues über gnuplot zu lernen. – mgilson

+0

XTICS ohne awk: XTICS = "' cut -d '' -f1 test.dat | xargs '"; Verwenden von Xargs zum Umwandeln von Spalten in Zeilen. – Manwe

3

ok, diese Frage ist alt, aber es gibt eine viel einfachere Art und Weise bereits in gnuplot umgesetzt:

plot 'result.csv' matrix rowheaders columnheaders with image 

bekam es von http://gnuplot.sourceforge.net/demo/heatmaps.html

+1

Zusatz: Die Optionen 'rowheaders' und' columnheaders' sind seit Version 5.0 Patchlevel 0 verfügbar. – Christoph