2013-09-03 1 views
5

Mon fichier de données a ce contenuGnuplot: Comment charger et afficher la valeur numérique unique à partir du fichier de données

# 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 

Je fais un histogramme de l'affaire ... lignes en utilisant en dessous du scénario - et qui fonctionne. Ma question est: comment puis-je charger la grande valeur totale 1976 (à côté du mot 'total') du fichier de données et (a) le stocker dans une variable ou (b) l'utiliser directement dans le titre de l'intrigue?

Ceci est mon script 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" 

Pour le bénéfice des autres qui essaient d'étiqueter histogrammes, dans mon fichier de données, la colonne après l'étiquette de cas représente le total du reste des valeurs sur cette ligne . Ces nombres totaux sont affichés en haut de chaque barre d'histogramme. Par exemple pour case1, 522 est le total de (278 + 146 + 65 + 26 + 7).

Je veux afficher le total général quelque part sur mon graphique, disons comme la deuxième ligne du titre ou dans une étiquette. Je peux obtenir une variable dans sprintf dans le titre, mais je n'ai pas trouvé de syntaxe pour charger une valeur de "cellule" ("cellule" signifiant une intersection de colonnes de lignes) dans une variable. Sinon, si quelqu'un peut me dire comment utiliser la fonction somme pour totaliser 522 + 120 + 660 (lire dans le fichier de données, pas comme des constantes!) Et stocker ce total dans une variable, ce qui éviterait le besoin avoir le grand total dans le fichier de données, et cela me rendrait également très heureux.

Merci beaucoup.

Répondre

11

Commençons par extraire une seule cellule en (ligne, col). S'il s'agit d'une seule valeur, vous pouvez utiliser la commande stats pour extraire les valeurs. Les row et col sont spécifiés avec every et using, comme dans une commande plot. Dans votre cas, pour extraire la valeur totale, utilisez:

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

Pour résumer toutes les valeurs dans la deuxième colonne, utilisez:

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

Enfin, pour résumer toutes les valeurs dans les colonnes 3:7 dans toutes les lignes (le même comme la commande précédente, mais sans utiliser les totaux enregistrés) utilisent:

# 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) 

Ces commandes nécessitent gnuplot 4.6 pour fonctionner.

Ainsi, votre script pourrait ressembler tracé les éléments suivants:

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) 

qui donne le résultat suivant:

enter image description here

+1

Ah ah! Des exemples merveilleux d'utilisation de la commande stats pour charger des valeurs de cellules. – user424855

+2

@Christoph Toujours un plaisir de lire vos messages liés à Gnuplot, trucs très utiles :) – EverythingRightPlace

+0

Qu'est-ce que le côlon: syntaxe? Je ne comprends pas ce que :::: 0 ou :: 1 est supposé faire - quelqu'un pourrait-il me l'expliquer? – user3728501

1

pour Linux et similaire.

Si vous ne connaissez pas le numéro de ligne où se trouvent vos données, mais que vous savez qu'il se trouve dans la nième colonne d'une ligne où la valeur de la mième colonne est x, vous pouvez définir une fonction

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

et ensuite l'utiliser, par exemple, comme

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

en utilisant les données fournies par user424855

print y 

devrait retourner 15

+0

Nice. Vous avez une petite faute de frappe, la commande devrait lire: 'get_data (m, x, n, nom de fichier) = system ('awk' \ $ '. M.' == \" '. X.' \ "{Print \ $ '.n.'} "'.filename)'. – Christoph

+0

merci, c'est corrigé maintenant, :) – boclodoa

Questions connexes