Построение разрывных графиков (возможно gnuplot)

Софт под Linux, разные программы, но только связанные с Linux

Модератор: /dev/random

phprus
Сообщения: 42
ОС: OpenSuSE

Построение разрывных графиков (возможно gnuplot)

Сообщение phprus »

Здравствуйте!

У меня есть данные формата:

Код: Выделить всё

id    время_начала    время_конца    значение

id - идентификатор линии (в одном файле может быть данные по одному или нескольким процессам)
время_начала, время_конца - диапазон времени (время в секундах, с точностью до (микро)милисекунд)
значение - значение параметра, которое действовало в этом промежутке времени.
В пределах одного id интервалы времени не перекрываются, однако во всем файле могут быть перекрывающимися (в разных линиях).

Сейчас я ищу средство, для визуализации таких данных, нужно построить график "значение" от времени. Проблема в том, что график разрывен и определен не на всей оси времени.
Сейчас читал справку по gnuplot, но не нашел там ничего подходящего для таких графиков.

Подскажите пожалуйста, чем возможно построить такой график и если это умеет gnuplot, то в каком направлении документации нужно читать.
Спасибо сказали:
Аватара пользователя
Portnov
Модератор
Сообщения: 1786
Статус: Матёрый линуксоид
ОС: Debian testing/unstable

Re: Построение разрывных графиков (возможно gnuplot)

Сообщение Portnov »

Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Спасибо сказали:
phprus
Сообщения: 42
ОС: OpenSuSE

Re: Построение разрывных графиков (возможно gnuplot)

Сообщение phprus »

Portnov
А разве эти приложения умеют показывать не только факт, что событие происходило в такой период времени, но и связанное с ним значение параметра?
Судя по http://www.haskell.org/haskellwiki/Splot он умеет только отображать факт протекания процесса, но не его характеристику. (у меня то процесс - это вся совокупность отрезков с одинаковым id).

С http://haskell.org/haskellwiki/Timeplot похоже ситуация такая-же. Либо отображает сам факт события во времени, либо строит непрерывные график(или гистограммы)
Спасибо сказали:
Аватара пользователя
Reboot
Сообщения: 321
Статус: Красен глаз -- темна душа

Re: Построение разрывных графиков (возможно gnuplot)

Сообщение Reboot »

Доброе утро.
Не столько из уверенности в правильности подхода, сколько из интереса могу подсказать решение с помощью гнуплота. Хотя и не очень красивое (:

Код: Выделить всё

awk '{print("["$2":"$3"] title \""$1"\" "$4" lt "$1)} \\

Эта штука переделает (должна) Ваш файл в такой:

Код: Выделить всё

[время_начала:время_конца] title "id" значение lt id

Вот. Теперь закинуть выхлоп в файл, добавить сверху:

Код: Выделить всё

set xdata time
set timefmt "%d.%m" # Здесь нужно написать в каком виду у вас время
plot \\

и удалить двойной бэкслеш из последней строчки.
Всё автоматизируется, если нужно повторить больше одного раза. В шапку гнуплота можно добавлять всякого, чтобы рисунок получился покрасивее.
P.S. Есть только проблема с id: гнуплот умеет рисовать только 23 разных по цвету линии. Вот, и если id это большие непонятные числа, то есть шанс, что цвета для разных совпадут.
P.S.S. awk я пользоваться не умею, да.
Мой компьютер зовут Марвин
Спасибо сказали:
phprus
Сообщения: 42
ОС: OpenSuSE

Re: Построение разрывных графиков (возможно gnuplot)

Сообщение phprus »

Reboot
К сожалению так не получилось. gnuplot ругался на то, что [yyy:xxx] было указано несколько раз.

Разбираясь с этой ошибкой случайно обнаружил, что помимо yerr для указания диапазона по оси Y есть еще и xerr, указывающий диапазон по Х, те визуально то, что нужно. Остался только небольшой вопрос, gnuplot в базовой точке интервала ставит символ - крестик, наклонный крестик. Можно-ли как-нибудь от него избавится, чтобы остались только вертикальные черточки-границы отрезков?
Спасибо сказали:
Аватара пользователя
Reboot
Сообщения: 321
Статус: Красен глаз -- темна душа

Re: Построение разрывных графиков (возможно gnuplot)

Сообщение Reboot »

Ах да, перед двумя бекслешами нужно запятую просто поставить.

Можно через ошибки, да, но мне кажется, что тут мороки будет больше.
Избавление от крестиков: указание что и каким типом нужно рисовать.

Исправленная версия: (должна рисовать только линии, без точек)

Код: Выделить всё

awk '{print("["$2":"$3"] title \""$1"\" "$4" w l lt "$1)},  \\

P.S. если будет пример входного файла, то будет проще, да.
Мой компьютер зовут Марвин
Спасибо сказали:
phprus
Сообщения: 42
ОС: OpenSuSE

Re: Построение разрывных графиков (возможно gnuplot)

Сообщение phprus »

Reboot
Нет, так не получается.

Код: Выделить всё

plot \
[1:2] title "id" 5 lt 1, \
[5:10] title "id" 6 lt 1

Ошибка: "1.plot", line 3: undefined variable: title
Да и по документации похоже, что несколько диапазонов в [5:10] задавать нельзя.


Сделал через xerr, а чтобы убрать крестики нужно выбрать pointtype 0.
Всем спасибо за помощь!
Спасибо сказали:
Аватара пользователя
Reboot
Сообщения: 321
Статус: Красен глаз -- темна душа

Re: Построение разрывных графиков (возможно gnuplot)

Сообщение Reboot »

Хм, действительно. Ну, прошу прощения за толчок не в ту сторону, буду иметь в виду.
Мой компьютер зовут Марвин
Спасибо сказали:
ssh
Сообщения: 78
ОС: Debian

Re: Построение разрывных графиков (возможно gnuplot)

Сообщение ssh »

phprus писал(а):
10.01.2011 11:44

Код: Выделить всё

id    время_начала    время_конца    значение

id - идентификатор линии (в одном файле может быть данные по одному или нескольким процессам)
время_начала, время_конца - диапазон времени (время в секундах, с точностью до (микро)милисекунд)
значение - значение параметра, которое действовало в этом промежутке времени.
В пределах одного id интервалы времени не перекрываются, однако во всем файле могут быть перекрывающимися (в разных линиях).


Если в исходном файле записи с одинаковым id всегда идут друг за другом, то в этот файл можно вставить по две пустые строки при смене этого самого id; затем рисовать содержимое последовательными командами типа plot "p.dat" index 0 ..., plot "p.dat" index 1 ... и так далее. Может быть, предварительно пределы на оси Х понадобится выставить так, чтобы они заведомо перекрывали период от "время_начала" до "время_конца" при всех id.

Если строки с разными id чередуются, то исходный файл можно предварительно отсортировать (скажем, простым скриптом на базе grep) так, чтоб он выглядел наподобие вышесказанного.
Спасибо сказали: