2013-09-03 16 views
5

私のデータファイルを単一の数値を表示するには、どのようにこのコンテンツgnuplotは:ロードおよびデータファイルから

# 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 

私はケースからヒストグラムを作っています...以下のスクリプトを使用してラインを持っている - それは動作します。私の質問は、データファイルから総計値1976(単語 '合計'の隣に)をロードし、(a)変数に格納するか、または(b)プロットのタイトルに直接使用するかです。

これは私の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" 

ヒストグラムをラベル付けしようとしている他人の利益のために、私のデータファイルで、caseラベル後の列は、その行の残りの値の合計を表し、 。これらの合計数は、各ヒストグラムバーの上部に表示されます。たとえばcase1の場合、522は(278 + 146 + 65 + 26 + 7)の合計です。

グラフのどこかに、タイトルの2行目やラベルなどの総計を表示したいとします。私はタイトルにsprintfに変数を渡すことができますが、変数に "セル"の値( "セル"という行の列の交差を意味する)をロードする構文を理解していません。

また、合計関数を使用して522 + 120 + 660(データファイルから読み込み、定数ではなく)を合計し、その合計を変数に格納する方法を教えてもらえれば、データファイルに総計を入れることもできます。それはまた私をとても幸せにするでしょう。

多くのありがとうございます。

答えて

11

(row、col)で1つのセルを抽出することから始めましょう。単一の値の場合は、statsコマンドを使用して値を抽出できます。 rowcolは、plotコマンドのように、everyusingで指定します。第二のカラム、使用中のすべての値まとめると

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

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

をそして最後に、列3:7内のすべての値を合計するあなたのケースでは、合計値、使用を抽出しますすべての行(前のコマンドのように、すなわち同じですが、保存された合計を使用しない)を使用します。

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

これらのコマンドは、仕事に4.6 gnuplotの必要があります。

だから、あなたのプロットスクリプトは、次のようになります。次の出力が得られます

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) 

を:Linuxと同様のために

enter image description here

+1

ああ! statsコマンドを使ってセルの値をロードする素晴らしい例です。 – user424855

+2

@ChristophあなたのGnuplot関連の記事、非常に有用なものを読むのは常に喜びです:) – EverythingRightPlace

+0

コロンとは何ですか? ::: 0または:: 1がするはずのことを理解できません - 誰かが私にそれを説明することができますか? – user3728501

1

データがある行番号がわからないが、m列目の値がxである行のn番目の列にあることがわかっている場合は、関数を定義できます例えば、

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

がuser424855

print y 

によって提供されるデータを使用するなど

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

し、それを使用し、返さなければならない15

+0

ニース。あなたはちょっとタイプミスがあります。コマンドは以下のようになります: 'get_data(m、x、n、filename)= system( 'awk" \ $'。m。 '== \ "'。x。 '\" {print \ $ '.n。'} ''。ファイル名) '。 – Christoph

+0

ありがとうございます、それは今修正されました:) – boclodoa

関連する問題