2017-02-04 19 views
2

私はこのgnuplotで時系列データを積み重ねたヒストグラム?

callr | method | call_count | day  
------+-------------------------+------------ 
foo | find_paths |  10 | 2016-10-10 
bar | find_paths |  100 | 2016-10-10 
foo | find_all |  123 | 2016-10-10 
foo | list_paths |  2243 | 2016-10-10 
foo | find_paths |  234 | 2016-10-11 
foo | collect |  200 | 2016-10-11 
bar | collect |  1 | 2016-10-11 
baz | collect |  3 | 2016-10-11 
...  ...    ...  ... 

のような多くのデータを持っていると私は、発信者との通話の数とそれぞれの日のために下の積載バーに沿って連続日数を示すメソッドごとに積み重ねられたヒストグラムを作成したいです。

たとえば、データを変換するとします。

select method, sum(call_count), day from foo where method='collect' group by method, day order by method, day; 

私は例えば、このようなPLGファイルで、1色の内の1つの方法のすべてのコールで棒グラフを取得することができるよ:

このように呼ばれる
set terminal png 
set title "Method: " . first_arg 
set output "" . first_arg . ".png" 
set datafile separator '|' 
set style data boxes 
set style fill solid 
set boxwidth 0.5 
set xdata time 
set timefmt "%Y-%m-%d" 
set format x "%a %m-%d" 
xstart="2016-10-01" 
xend="2017-01-01" 
set xrange [xstart:xend] 
set xlabel "Date" tc ls 8 offset -35, -3 
set ylabel "Calls" tc ls 8 

plot '<cat' using 3:4 

cat file | gnuplot -p -e "plot '<cat';first_arg='collect'" calls.plg 

histogram of all calls

しかし、私が本当にしたいことで、発信者別の内訳を表示する方法があります同じ種類のグラフ。まだgnuplotを使って積み上げたヒストグラムを得ることはできません。 私が試したことはすべて、usingステートメントについて不平を言っています。 'x時間データのための仕様を使用して完全に必要とする'など。

このようなものが必要ですが、下部に沿って日数が連続しています。例えば。何の呼び出しがその日に行われなかった場合 - その後、無ヒストグラムバーを

enter image description here

+0

を私が思い付きました私はほとんどがRであるソリューション幸せなhttp://stackoverflow.com/questions/42049243/ggplot2-histogram-legend-too-large – slashdottir

答えて

2

smooth freqを使用して、毎日、数日にエポック時間を丸めbin()機能のためのデータを組み合わせて任意のアイデアをいただき、ありがとうございます。インラインforと合計式を使用して、y軸のカテゴリの合計をボックスの高さの降順にプロットし、合計の差がカテゴリの値と等しくなるようにします。したがって、最も高いボックスは高さfoo + bar + baz(caller=3)、次に高いfoo + bar(caller=2)を持ち、最短はfoo(caller=1)です。

calls

caller method  call_count day 
foo  find_paths 10   2016-10-10 
bar  find_paths 100   2016-10-10 
foo  find_all 123   2016-10-10 
foo  list_paths 2243  2016-10-10 
foo  find_paths 234   2016-10-11 
foo  collect  200   2016-10-11 
bar  collect  1   2016-10-11 
baz  collect  3   2016-10-11 

gnuplotのスクリプト:

binwidth = 86400 
bin(t) = (t - (int(t) % binwidth)) 
date_fmt = "%Y-%m-%d" 
time = '(bin(timecolumn(4, date_fmt)))' 

# Set absolute boxwidth so all boxes get plotted fully. Otherwise boxes at the 
# edges of the range can get partially cut off, which I think looks weird. 
set boxwidth 3*binwidth/4 absolute 

set key rmargin 
set xdata time 
set xtics binwidth format date_fmt time rotate by -45 out nomirror 
set style fill solid border lc rgb "black" 

callers = system("awk 'NR != 1 {print $1}' calls \ 
    | sort | uniq -c | sort -nr | awk '{print $2}'") 
# Or, if Unix tools aren't available: 
# callers = "foo bar baz" 

plot for [caller=words(callers):1:-1] 'calls' \ 
    u @time:(sum [i=1:caller] \ 
     strcol("caller") eq word(callers, i) ? column("call_count") : 0) \ 
    smooth freq w boxes t word(callers, caller) 

Calls per day, by caller

私はここでgnuplotの時系列ヒストグラムについての長い議論を書いた:Time-series histograms: gnuplot vs matplotlib

+1

きちんとこれを試してみよう – slashdottir

関連する問題