Сложенная гистограмма с данными временного ряда с 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, например, например:

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

гистограмма всех звонков

Однако то, что я действительно хочу, - это способ показать разбивку по вызывающей стороне в том же виде графика. Я пока не могу получить составленную гистограмму с помощью gnuplot. Все, что я пробовал, жалуется на операторы использования, например, "Нужно полное использование спецификации для х временных данных" или тому подобное.

Хотите что-то вроде этого, но дни идут непрерывно по дну. Например, если в этот день не было сделано ни одного звонка, то нет гистограммы

введите описание изображения здесь

Спасибо за любые идеи

2 ответа

Объедините данные за каждый день, используя smooth freq и bin() функция, которая округляет времена эпохи до дней. Суммируйте суммы категорий по оси Y в виде блоков в порядке убывания высоты с использованием встроенного for и выражение суммы, чтобы различия между суммами равнялись значениям категорий. Итак, самая высокая коробка будет иметь высоту foo + bar + baz (caller=3), следующий самый высокий foo + bar (caller=2), а самый короткий - просто фу (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)

Звонки в день, по звонящему

Я написал более подробное обсуждение гистограмм временных рядов gnuplot здесь: Гистограммы временных рядов: gnuplot vs matplotlib

Обратитесь к https://psy.swansea.ac.uk/staff/Carter/gnuplot/gnuplot_time_histograms.htm за практическим решением, особенно в его заключительном разделе «Сюжет ящиков». Решение состоит в использовании функции добавления ($2+$3...), в то время как явно используется "с ящиками".

Другие вопросы по тегам