2012-05-29 18 views
6

Soy absolutamente nuevo en gnuplot y no encontré una solución funcional después de googlear.gnuplot: label xey del eje de la matriz (heatmap) con nombres de filas y columnas

que tienen una matriz de datos buscando algo como esto:

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 

Lo que me gustaría hacer es trazar un mapa de calor con plot 'result.csv' matrix with image, con el eje x marcada con AE y el eje y marcada con AE . Esta matriz no siempre tiene el mismo tamaño, pero el número de filas siempre es igual al número de columnas y siempre está etiquetado.

¿Alguien podría ayudarme con esto? Supongo que tengo que usar el comando using, pero hasta ahora esto me parece completamente vudú ...

¡Muchas gracias!

Respuesta

11

Este es en realidad un doosie y no puedo hacerlo posible sin magia de shell * nix.

primer lugar, se desea obtener el x etiquetas de tics y etiquetas de tics Y:

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

En este punto, XTICS es la cadena "F G H I J" y YTics es la cadena "A B C D E".

Ahora, queremos establecer las xtics por iteración:

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

Hemos utilizado 2 gnuplot orden interna funciones (word y words). words(string) cuenta cuántas palabras hay en la cadena dada (una palabra es una secuencia de caracteres separada por espacios). word(string,n) devuelve la n-ésima palabra en la cadena.

Ahora, podemos trazar su archivo de datos ... El único problema es que matrix quiere usar todas las filas y columnas en su archivo de datos. Es posible que pueda reducir las filas/columnas realmente leídas usando la palabra clave every, pero no sé cómo hacerlo en los archivos de la matriz, y creo que probablemente sea más fácil seguir confiando en las utilidades del shell (awk y sed)

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

y ahora su parcela (con suerte) tenga el aspecto que desea.

También tenga en cuenta que, dado que hemos utilizado la iteración, esta secuencia de comandos solo funcionará en gnuplot 4.3 o superior - Dado que la estabilidad actual es 4.6, con suerte eso está bien.

+0

Usted, señor, es mi héroe del día. ¡Muchas gracias! – Eekhoorn

+0

@zenbomb - No hay problema. En realidad, fue un juego divertido para mí intentar resolverlo. No trabajo con archivos de datos 'matrix' a menudo, así que era una buena oportunidad para aprender algo nuevo sobre gnuplot. – mgilson

+0

XTICS sin awk: XTICS = "' cut -d '' -f1 test.dat | xargs '"; Abusar de xargs para transformar las columnas a la fila. – Manwe

3

bien, esta pregunta es viejo, pero hay una manera mucho más fácil ya implementado en gnuplot:

plot 'result.csv' matrix rowheaders columnheaders with image 

lo tiene desde http://gnuplot.sourceforge.net/demo/heatmaps.html

+1

Adición: las opciones 'rowheaders' y' columnheaders' están disponibles desde la versión 5.0 patchlevel 0. – Christoph

Cuestiones relacionadas