2013-09-03 15 views
5

moim pliku danych ma tę zawartośćGnuplot: Jak wczytać i wyświetlić pojedynczą wartość liczbową z pliku danych

# 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 

Robię histogram z przypadku ... Linie użyciu skryptu poniżej - i to działa. Moje pytanie brzmi: jak mogę załadować wielką wartość całkowitą 1976 (obok słowa "total") z pliku danych i (a) zapisać ją do zmiennej lub (b) użyć go bezpośrednio w tytule wykresu?

To jest mój skrypt 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" 

Dla dobra innych próbujących etykieta histogramy, w moim pliku danych, kolumna po sprawie etykiecie reprezentuje sumę pozostałych wartości w tym wierszu . Te całkowite liczby są wyświetlane u góry każdego paska histogramu. Na przykład dla przypadku 1, 522 to suma (278 + 146 + 65 + 26 + 7).

Chcę wyświetlić sumę całkowitą gdzieś na mojej mapie, na przykład jako drugi wiersz tytułu lub na etykiecie. Mogę wprowadzić zmienną do sprintf w tytule, ale nie wymyśliłem składni, aby załadować wartość "komórki" ("komórka" oznaczająca przecięcie kolumny wiersza) do zmiennej.

Alternatywnie, jeśli ktoś może mi powiedzieć, jak użyć funkcji sumy, aby uzyskać sumę 522 + 120 + 660 (odczyt z pliku danych, a nie jako stałych!) I zapisać tę sumę w zmiennej, co pozwoliłoby na uniknięcie potrzeby mieć sumę całkowitą w pliku danych, co również bardzo mnie ucieszy.

Wielkie dzięki.

Odpowiedz

11

Zacznijmy od wyodrębnienia pojedynczej komórki w (wiersz, kol.). Jeśli jest to jedna wartość, można użyć polecenia stats, aby wyodrębnić wartości. Parametry row i col są określone przy pomocy every i using, podobnie jak w komendzie fabuły. W twoim przypadku, aby wyodrębnić całkowitą wartość, zastosowanie:

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

podsumować wszystkie wartości w drugiej kolumnie, zastosowanie:

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

I wreszcie, aby podsumować wszystkie wartości w kolumnach 3:7 w wszystkie wiersze (czyli tak samo jak poprzedniego polecenia, ale bez użycia zapisane sumy) używają:

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

polecenia te wymagają gnuplot 4.6 do pracy.

więc skrypt kreślenia mógłby wyglądać następująco:

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) 

co daje następujący wynik:

enter image description here

+1

Ah ha !! Wspaniałe przykłady użycia polecenia stats do załadowania wartości (wartości) komórki. – user424855

+2

@Christoph Zawsze miło jest czytać posty związane z Gnuplotem, bardzo przydatne rzeczy :) – EverythingRightPlace

+0

Czym jest dwukropek: składnia? Nie rozumiem, co powinienem zrobić :::: 0 lub :: 1 - czy ktoś mógłby mi to wyjaśnić? – user3728501

1

dla Linuksa i podobne.

Jeśli nie znasz numeru wiersza, w którym znajdują się twoje dane, ale wiesz, że znajduje się w n-tej kolumnie wiersza, gdzie wartość m-tej kolumny to x, możesz zdefiniować funkcję

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

a następnie użyć, na przykład, jako

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

na podstawie danych dostarczonych przez user424855

print y 

powinien zwrócić 15

+0

Nice. Masz małą literówkę, polecenie powinno brzmieć: 'get_data (m, x, n, filename) = system ('awk' \ $ '.m.' == \" '. X.' \ "{Print \ $ '.n.'} "'.filename)'. – Christoph

+0

dziękuję, to jest poprawione teraz, :) – boclodoa

Powiązane problemy