2012-07-16 23 views
8

tengo archivos de este formato:Trazado columnas llamando a su cabecera con GNUPlot

x y1 y2 y3 ei1 ei2 ei3 es1 es2 es3 
1 4 5 4 7 7 2 4 7 7 
2 7 3 3 3 8 3 3 3 8 
3 2 1 4 4 9 6 4 4 9 

quiero producir gráficos similares a lo que el siguiente comando dar

plot "filename" using 1:2:5:8 with yerrorbars 

pero usando las columnas encabezados (x, y1, ei1 y es1) para llamarlos. ¿Cómo se puede hacer esto?

página 84 del manual de gnuplot (documentar el comando using) lee:

Height Weight Age 
val1 val1 val1 
... ... ... 

luego los siguientes comandos de la trama son todos equivalentes

plot ’datafile’ using 3:1, ’’ using 3:2 

plot ’datafile’ using (column("Age")):(column(1)), \ 
’’ using (column("Age")):(column(2)) 

plot ’datafile’ using "Age":"Height", ’’ using "Age":"Weight" 

Sin embargo, cuando los probé me solo obtuve los índices de la fila versus ellos mismos.

+3

'plot" filename "usando 1: 2: 5: 8 con yerrorbars' y' plot "nombre de archivo" usando "x": "y1": "ei1": "es1" con yerrorbars' produce el mismo resultado aquí. ¿Qué versión de Gnuplot está ejecutando, he probado en gnuplot 4.6 patchlevel 0. – Thor

+0

Versión 4.4 patchlevel 3 incluido con Ubuntu. ¿Es demasiado viejo? –

+1

Sí, necesita la versión 4.6 o posterior para esta función. – Thor

Respuesta

5

Echando un vistazo rápido a la documentación de gnuplot 4.4 vs gnuplot 4.6 (versión estable actual), parece que la característica que está tratando de usar probablemente se introdujo en gnuplot 4.5 (los números impares son las ramas de desarrollo, cuando se consideran estables, se incrementan a un número par). La única forma en que se puede pensar para lograr esto es escribir un script simple en otro idioma que devuelva el número de columna (a stdout). He aquí un ejemplo sencillo usando pitón aunque estoy seguro de que usted puede hacer esto en awk si desea permanecer en un entorno totalmente POSIX:

#python indexing is 0 based, gnuplot datafile indexing 1 based 
COL_AGE=`python -c 'print(open("datafile").readline().split().index("AGE")+1)'` 
COL_HEIGHT=`python -c 'print(open("datafile").readline().split().index("HEIGHT")+1)'` 
plot "datafile" u COL_AGE:COL_HEIGHT 

Este pequeño script no hace nada de fantasía (Asume la encabezados de las columnas están en la primera línea, por ejemplo), pero utilizando el poder de la serpiente pitón, que sería bastante fácil de extender el guión aún más:

#!/usr/bin/env python 
import sys 
with open(sys.argv[1]) as f 
    for line in f: 
     if (line.strip()): 
      print (line.split().index(sys.argv[2])+1) 
      sys.exit(0) 

Ahora puede llamar a este script como: python script.py datafile AGE para averiguar en qué columna "AGE" está dentro. Es un error si "AGE" no está en ninguna columna.