Gnuplot: cómo cargar y mostrar el valor numérico único del archivo de datos

Mi archivo de datos tiene este contenido

# data file for use with gnuplot # Report 001 # Data as of Tuesday 03-Sep-2013 total 1976 case1 522 278 146 65 26 7 case2 120 105 15 0 0 0 case3 660 288 202 106 63 1 

Estoy haciendo un histogtwig a partir del caso … líneas usando el guión a continuación, y eso funciona. Mi pregunta es: ¿cómo puedo cargar el gran valor total de 1976 (junto a la palabra ‘total’) del archivo de datos y (a) almacenarlo en una variable o (b) usarlo directamente en el título de la gráfica?

Esta es mi secuencia de comandos gnuplot:

 reset set term png truecolor set terminal pngcairo size 1024,768 enhanced font 'Segoe UI,10' set output "output.png" set style fill solid 1.00 set style histogram rowstacked set style data histograms set xlabel "Case" set ylabel "Frequency" set boxwidth 0.8 plot for [i=3:7] 'mydata.dat' every ::1 using i:xticlabels(1) with histogram \ notitle, '' every ::1 using 0:2:2 \ with labels \ title "My Title" 

Para beneficio de otros que intentan etiquetar histogtwigs, en mi archivo de datos, la columna después de la etiqueta del caso representa el total del rest de los valores en esa fila. Esos números totales se muestran en la parte superior de cada barra de histogtwig. Por ejemplo, para case1, 522 es el total de (278 + 146 + 65 + 26 + 7).

Quiero mostrar el total general en algún lugar de mi gráfico, por ejemplo, como la segunda línea del título o en una etiqueta. Puedo poner una variable en sprintf en el título, pero no he descubierto la syntax para cargar un valor de “celda” (“celda”, que significa intersección de columna de fila) en una variable.

Alternativamente, si alguien puede decirme cómo usar la función sum para totalizar 522 + 120 + 660 (¡leer del archivo de datos, no como constantes!) Y almacenar ese total en una variable, eso obviaría la necesidad de tener el gran total en el archivo de datos, y eso también me haría muy feliz.

Muchas gracias.

Comencemos por extraer una sola celda en (fila, col). Si se trata de valores únicos, puede usar el comando stats para extraer los valores. La row y col se especifican con every y using , como en un comando de trazado. En su caso, para extraer el valor total, use:

 # extract the 'total' cell stats 'mydata.dat' every ::::0 using 2 nooutput total = int(STATS_min) 

Para resumir todos los valores en la segunda columna, use:

 stats 'mydata.dat' every ::1 using 2 nooutput total2 = int(STATS_sum) 

Y finalmente, para resumir todos los valores en las columnas 3:7 en todas las filas (es decir, igual que el comando anterior, pero sin usar los totales guardados) use:

 # sum all values from columns 3:7 from all rows stats 'mydata.dat' every ::1 using (sum[i=3:7] column(i)) nooutput total3 = int(STATS_sum) 

Estos comandos requieren que gnuplot 4.6 funcione.

Entonces, su script de trazado podría verse así:

 reset set terminal pngcairo size 1024,768 enhanced set output "output.png" set style fill solid 1.00 set style histogram rowstacked set style data histograms set xlabel "Case" set ylabel "Frequency" set boxwidth 0.8 # extract the 'total' cell stats 'mydata.dat' every ::::0 using 2 nooutput total = int(STATS_min) plot for [i=3:7] 'mydata.dat' every ::1 using i:xtic(1) notitle, \ '' every ::1 using 0:(s = sum [i=3:7] column(i), s):(sprintf('%d', s)) \ with labels offset 0,1 title sprintf('total %d', total) 

que da el siguiente resultado:

enter image description here

Para linux y similar.

Si no conoce el número de fila donde se encuentran sus datos, pero sabe que está en la n-ésima columna de una fila donde el valor de la columna m-ésima es x, puede definir una función

 get_data(m,x,n,filename)=system('awk "\$'.m.'==\"'.x.'\"{print \$'.n.'}" '.filename) 

y luego usarlo, por ejemplo, como

 y = get_data(1,"case2",4,"datafile.txt") 

utilizando los datos proporcionados por user424855

 print y 

debería regresar 15