Построения графиков программа

Устал от негодного gnuplot который после обновления до 5й версии стал очень медленный и еще более странный. Нашел немного времени, начал делать свой плоттер. Главные отличия: работает быстро, перемещаться по графикам удобнее, может много осей, может строить по мере прихода данных. Обработку данных не может, строит то, что прочитал из файла как есть.

Мне это нужно для просмотра результатов моделирования или испытаний контроллера BLDC. Однажды пишется конфиг, в котором обозначаются все графики, из каких столбцов таблицы данных их строить, как подписывать. А после, получив данные, остается только листать страницы с графиками и смотреть результаты. Быстрее и удобнее способа я не знаю.

Сейчас выглядит вот так. Здесь умышленно добавлено много осей, именно на этих графиках их столько не нужно.





Настраивается вот таким текстовым конфигом.

#!/tmp/gp/gp

font 14 "/usr/share/fonts/corefonts/cour.ttf"
batch 20000

load 0 -1 float 40 "/tmp/TEL"

page 0 "DQ Current"
label 0 "Time (Sec)"
label 1 "Current (Ampere)"
figure 0 0 0 1 0 1 "Plant D"
figure 1 0 0 2 0 1 "Plant Q"
figure 2 0 0 9 0 2 "Estimated D"
figure 3 0 0 10 0 2 "Estimated Q"

page 1 "Mechanical Speed"
label 0 "Time (Sec)"
label 1 "Mechanical Speed (RPM)"
figure 0 0 0 3 0 1 "Plant"
figure 1 0 0 13 2 3 "Estimated"
figure 2 0 0 25 4 5 "Nonl X4"


Исходники в репозитории. Требуется SDL2 и SDL2_ttf. Должно собираться в VS под windows, проверяли. Бинари не предоставляю.

Версия ранняя, сырая, но почти все основное, что хотел сделал. Принимаю багрепорты, фичреквесты.
  • +7
  • 12 мая 2016, 21:36
  • amaora

Комментарии (14)

RSS свернуть / развернуть
Годно! Утащил в закладки! +1
0
Любому, кто берётся писать плоттер, надо прочесть вот эту статью:
0
Да блин, кривые руки вот эту
Хотя, если только таблички рисовать, то не надо. А как только потребуется функцию аналитическую добавить — так сразу.
+2
Нет, в корректную растеризацию кривых закапываться не собираюсь. Цели другие.
0
чтобы gnuplot тормозил ему надо сотни тысяч точек скормить.
для перемещения помимо тупо растягивания нужного участка мышкой есть колесо + ctrl,shift для скролла / зума по осям. плюс история перемещений, что можно сделать прям удобнее придумать не могу.
и gnuplotу тоже данные можно скармливать чтобы он их на ходу отрисовывал.
осей у него только по две, а остальное что нарисовано на картинках делается руками сдвигом/масштабом данных plot… using ($1-4):($2/5+6) и отрисовкой дополнительных осей руками. опять же несколько строчек
а если задача тупо построить кучу картинок по данным из файлов то возможностей у его скриптового языка уж куда больше и он гораздо удобнее чем
«figure 0 0 0 1 0 1»
не, я тоже когда-то свой велосипед для рисования графиков изобретал, чтобы данные по ходу поступления интерактивно отображать, пока не разобрался как их гнуплоту через pipe из своей программы скармливать.
имхо гнуплот по построению графиков никакими поделками не переплюнуть.
+1
  • avatar
  • _pv
  • 13 мая 2016, 02:50
У меня их столько и есть, 60 кГц частоты и несколько секунд моделирования.

Цель не картинки, а просмотр графиков. Моделируем, смотрим на график тока, смотрим на график скорости, делаем выводы, меняем код, моделируем, смотрим на график тока, и т.д.

Раньше я пользовался вот таким скриптом gnuplot, для этого.

#!/usr/bin/gnuplot -p

set terminal x11
set grid

set macros
TEL = "\"/tmp/TEL\" binary format=\"%40float\""

system "echo -n Number:"
N = int(system("read N; echo $N"))

if (N == 1) {

	set xlabel 'Time (Sec)'
	set ylabel 'Current (Ampere)'
	plot    @TEL using 1:2 title 'Plant D' with lines, \
		@TEL using 1:3 title 'Plant Q' with lines, \
		@TEL using 1:10 title 'Estimated D' with lines, \
		@TEL using 1:11 title 'Estimated Q' with lines
}

if (N == 2) {

	set xlabel 'Time (Sec)'
	set ylabel 'Mechanical Speed (RPM)'
	plot    @TEL using 1:($4/$27*30/pi) title 'Plant' with lines, \
		@TEL using 1:($14/$27*30/pi) title 'Estimated' with lines, \
		@TEL using 1:($25/$27*30/pi) title 'Alt X4' with lines
}
...

pause mouse close


Выбор графика сделан через костыль. А когда он стал по несколько секунд производить перерисовку после каждого изменения масштаба и проявлять другие странности то мне это окончательно надоело.
0
А когда он стал по несколько секунд производить перерисовку после каждого изменения масштаба и проявлять другие странности то мне это окончательно надоело.
Ну от этого-то можно было избавиться просто откатив на старую версию, как я понимаю?
0
не думаю, несколько графиков по 200тыс точек он и раньше не особо быстро ворочал.
но вот смысл тащить на экран сотни тысяч точек когда на экране всего ~1000 пикселей?
думаю можно самим гнуплотом данные поробовать проредить, поставить паузу на мышь, и после зума прочитать значение xrange (там какая-то встроенная переменаня есть которая размеры отображаемой области содержит) и изходя из этого проредить данные через параметр every.
0
Смысл в том, что можно увеличить любой кусок графика и увидеть детали. Когда можно проредить я делаю это при записи данных в файл.
0
вы немного не поняли, я предлагаю средствами гнуплота отрезать данные которые не выводятся на экран. возможно это уберёт тормоза.
то есть при любом зуме заставлять гнуплот отрисовывать больше 1000 точек бессмысленное занятие, а текущее положение и размер «окна» графика у гнуплота можно узнать. и при зуме мышью делать заново plot только тех точек что попадут на экран. при этом менять и every, для малых зумов брать например каждую сотую точку, для больших зумов — все подряд, но не с начала до конца, а небольшой кусок из середины
0
А не слишком ли сложно? На что станет похож скрипт? Предвижу множество проблем, вот например две.

1. Параметрический график (оба параметра не монотонны), чтобы определить точки которые попадут на экран уже надо обходить их все.
2. Шум или короткие всплески, иголки, на графике убьются прореживанием.
0
А не пробовал сделать так, чтобы масштабы осей подбирались под одну сетку? А не как на первой картинке, где желтый ноль посреди клетки.
0
  • avatar
  • Vga
  • 15 мая 2016, 15:35
Да это полезная функция для много-осевого плоттера, уже думал над ней. Особенно если в картинку надо сохранить, но это не приоритетное направление. Пока не могу понять как лучше/проще сделать.

Сейчас показывается сетка соответствующая двум выбранным осям, которые выделены.
0
А чего не Python + MatPlotLib? Просто, удобно и быстро.
+1
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.