2013-09-03 6 views
5

Meine Datendatei angezeigt hat diesen InhaltGnuplot: Wie zu laden und zu einzelnen numerischen Wert aus Datendatei

# 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 

Ich mache ein Histogramm der Fall ... Linien das Skript unter Verwendung - und das funktioniert. Meine Frage ist: Wie kann ich den Gesamtsummenwert 1976 (neben dem Wort "total") aus der Datendatei laden und entweder (a) in eine Variable speichern oder (b) direkt im Titel der Handlung verwenden?

Das ist mein gnuplot Skript ist:

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" 

Zum Wohl anderen versuchen, Histogramme zu beschriften, in meiner Datendatei stellt die Spalte nach dem Fall Etikett der Summe der restlichen Werte in dieser Zeile . Diese Gesamtanzahl wird am oberen Rand jeder Histogrammleiste angezeigt. Zum Beispiel für Fall1 ist 522 die Summe von (278 + 146 + 65 + 26 + 7).

Ich möchte die Gesamtsumme irgendwo in meinem Diagramm anzeigen, etwa als zweite Zeile des Titels oder in einem Etikett. Ich kann eine Variable in sprintf in den Titel bringen, aber ich habe keine Syntax gefunden, um einen "Zellen" -Wert ("Zelle", der Zeilenspaltenschnittpunkt bedeutet) in eine Variable zu laden.

Alternativ, wenn jemand mir sagen kann, wie man die Summenfunktion verwendet, um 522 + 120 + 660 zusammenzufassen (aus der Datendatei zu lesen, nicht als Konstanten!) Und diese Summe in einer Variablen zu speichern, würde dies überflüssig machen die Gesamtsumme in der Datei zu haben, und das würde mich auch sehr freuen.

Vielen Dank.

Antwort

11

Beginnen wir mit dem Extrahieren einer einzelnen Zelle um (Zeile, Spalte). Wenn es sich um einzelne Werte handelt, können Sie die Werte mithilfe des Befehls stats extrahieren. Die row und col sind mit every und using, wie in einem Plot-Befehl angegeben. In Ihrem Fall, den Gesamtwert, den Einsatz zu extrahieren:

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

Um alle Werte in der zweiten Spalte zusammenzufassen, zu verwenden:

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

Und schließlich alle Werte in Spalten zusammenzufassen 3:7 in alle Zeilen (dh das gleiche wie der vorherige Befehl, jedoch ohne die gespeicherten Summen verwendet wird) verwenden:

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

Diese Befehle 4.6 arbeiten gnuplot erfordern.

So könnte Ihr Plotten Skript wie folgt aussehen:

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) 

die folgende Ausgabe gibt:

enter image description here

+1

Ah ha !! Wunderbare Beispiele für die Verwendung des Befehls stats zum Laden von Zellenwerten. – user424855

+2

@Christoph Immer ein Vergnügen, Ihre Gnuplot bezogenen Beiträge zu lesen, sehr nützliche Sachen :) – EverythingRightPlace

+0

Was ist der Doppelpunkt: Syntax? Ich verstehe nicht was :::: 0 oder :: 1 soll - könnte mir das jemand erklären? – user3728501

1

für Linux und ähnliche.

Wenn Sie die Zeilennummer nicht kennen, in der sich Ihre Daten befinden, aber wissen, dass sie in der n-ten Spalte einer Zeile den Wert der m-ten Spalte hat, können Sie eine Funktion definieren

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

und dann verwenden, beispielsweise als

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

von user424855

print y 

bereitgestellten Daten unter Verwendung von sollte zurückgeben 15

+0

Schön. Sie haben einen kleinen Tippfehler, der Befehl sollte lauten: 'get_data (m, x, n, Dateiname) = system ('awk" \ $'. M. '== \' '. X.' \ "{Print \ $ '.n.'} "'.Dateiname)'. – Christoph

+0

danke, es ist jetzt korrigiert, :) – boclodoa