График данных в реальном времени на линейной диаграмме с помощью html5

Целью будет линейная диаграмма, которая обновляется каждые пару секунд и не требует обновления страницы (информация будет получена из отдельного файла, который обновляется на сервере). Есть ли какие-либо библиотеки JavaScript (кроме JQuery), которые упростят это? Может ли кто-нибудь показать пример на веб-странице?

Данные обновляются с фиксированным интервалом. Если возможно, предпочтительно использовать только CSS, HTML5 и javascript.


person Mehran    schedule 28.06.2011    source источник
comment
Раньше я использовал CanvasJS для построения графиков в реальном времени, и это довольно удобно и просто. canvasjs.com/html5-javascript-dynamic-chart   -  person Chintan Pathak    schedule 09.09.2016


Ответы (14)


Можно использовать несколько библиотек построения диаграмм: gRaphael, Highcharts и упомянутый другими. Эти библиотеки довольно просты в использовании и хорошо документированы (скажем, 1 по шкале сложности).

Насколько я знаю, эти библиотеки не работают в режиме реального времени, потому что они не дают возможности добавлять новые точки на лету. Чтобы добавить новую точку, вам нужно перерисовать весь график. Но я думаю, что это не проблема, потому что перерисовка графика происходит быстро. Я сделал несколько попыток с gRaphael и не заметил никаких проблем с этим подходом. Если вы обновляете частоту 10 секунд, это должно работать нормально (но это может зависеть от сложности ваших диаграмм).

Если перерисовка полной диаграммы является проблемой, вам, возможно, придется разработать диаграмму самостоятельно с помощью библиотеки векторной графики, такой как Raphael или paper.js. Это будет немного сложнее, чем использование графической библиотеки, но должно быть осуществимо. (Пусть говорят 5 по шкале сложности).

Поскольку вы получаете данные с фиксированным интервалом, вы можете использовать обычную библиотеку ajax. jQuery мне подходит, но есть и другие варианты. Это может быть не лучшим выбором для нефиксированного интервала, и в этом случае вам, возможно, придется взглянуть на что-то вроде socket.io но это будет иметь последствия и на стороне сервера.

Примечание 1: Raphael, gRaphael и Highcharts — это не чисто HTML5, а SVG/VML, но я думаю, что это тоже приемлемый выбор.

Примечание 2: кажется, что Highchart не требует перерисовки диаграммы при вставке новых точек. См. http://www.highcharts.com/documentation/how-to-use#live-charts

person luc    schedule 28.06.2011
comment
Я также изначально пытался найти решения, чтобы не перерисовывать всю диаграмму каждый раз из соображений производительности. Но потом я понял, что это заблуждение. Любое решение должно перерисовывать диаграмму для каждого кадра. Подумайте об этом: как работает ваш монитор? Он постоянно обновляется с нуля, пиксели не перемещаются. Поэтому любая библиотека построения диаграмм, которая позволяет вам не перерисовывать диаграмму, просто предоставляет вам абстракцию. Эта абстракция удобна и желательна; тем не менее, с точки зрения производительности, он по-прежнему перерисовывает диаграмму в фоновом режиме для каждого кадра. - person Fletch; 30.11.2012
comment
@Fletch Я думаю, что разница в том, что некоторые перерисовки дешевле, потому что они выполняются на более низком уровне архитектуры браузера. Например, я думаю, что сдвиг всех пикселей на большом холсте влево будет дороже, чем сдвиг фактического холста влево с помощью CSS. Хотя может и нет, просто мысль. - person ; 03.10.2015
comment
У меня есть требование построить график, скажем, максимум 500 000 точек данных, передаваемых со скоростью около 65 000 точек в секунду, однако диаграмма должна повторно отображаться/обновляться каждые 100 мс (т. е. включать 6500 новых точек каждые 100 мс). Это возможно?. По сути, у нас есть система сбора данных в режиме реального времени, которую мы хотим отображать так, как она представлена ​​в режиме, близком к «реальному времени». - person Nicholas Hamilton; 27.10.2018
comment
Еще одна живая демонстрация с динамическим добавлением баллов в HighCharts: highcharts.com/demo/dynamic-update - person timetofly; 31.12.2020

Я бы предложил смузи-диаграммы.

Он очень прост в использовании, легко и широко настраивается и отлично справляется с потоковой передачей данных в реальном времени.

Существует конструктор, который позволяет изучить варианты и создать код.

Отказ от ответственности: я сотрудничаю с библиотекой.

person Drew Noakes    schedule 25.07.2013
comment
Действительно хорошо, хотя было бы также лучше, если бы он мог также отображать статические данные и даже отображать динамические данные по статическим данным, например, вчерашнюю эволюцию некоторой цены и сегодняшнюю текущую эволюцию, чтобы их было легко сравнивать. - person Javier Mr; 06.11.2013
comment
Это великолепно и очень просто в использовании. Спасибо. - person Sean Glover; 22.09.2015

Я считаю, что это именно то, что вы ищете:

http://www.highcharts.com/demo/dynamic-update

Открытый исходный код (хотя для коммерческих веб-сайтов требуется лицензия), совместимость с разными устройствами и браузерами, высокая скорость.

person Razor    schedule 28.06.2011

Несколько вещей, которые могут вам помочь:

Canvas Express — мощная библиотека для создания диаграмм: http://canvasxpress.org/.

Здесь вы можете найти руководство по созданию собственных графиков на основе уравнений: http://www.html5canvastutorials.com/labs/html5-canvas-graphing-an-equation/

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

Если вы разбираетесь в javascript и ajax, то это будет средней сложности. Если вы этого не сделаете, вам, вероятно, придется опубликовать еще несколько вопросов на Stack Ovreflow, чтобы помочь вам с частями, с которыми вы застряли.

person Variant    schedule 28.06.2011
comment
спасибо это как раз то, что мне было нужно - person Mehran; 28.06.2011

Flotr2 и Воображение — это варианты. У Flotr2 есть пример в реальном времени на странице документа, на которую я ссылаюсь. С Envision немного сложнее начать, поэтому попробуйте Flotr2.

person Fletch    schedule 29.08.2012
comment
Я бы тоже порекомендовал этот. Это очень солидная библиотека. - person bottleboot; 30.11.2012
comment
Пример flotr2 не работает в режиме реального времени... он просто многократно перерисовывает весь график. - person tybro0103; 24.09.2013
comment
@ tybro0103 Точно, это в режиме реального времени. Сначала я думал так же, как и вы, но потом понял, что это единственный способ сделать это. Как работает фильм? Мгновенно просматривайте 25 различных изображений за секунду, и это выглядит как движение. Как работает монитор? Непрерывно перерисовывая пиксели в соответствии с тем, что сейчас должно быть показано, скорость этого перерисовывания измеряется в герцах. Вы не можете переместить пиксель на графике. Вы должны перерисовать диаграмму с новыми местоположениями. Даже если библиотека абстрагирует его и заставляет вас чувствовать, что вы перемещаете пиксели, это все равно просто перерисовка за кулисами. - person Fletch; 26.09.2013
comment
@Fletch Вы правы в том, что ему нужно перерисовать все это, чтобы показать новые данные. Однако я хотел сказать, что он повторно загружает весь набор данных. Проверьте исходный код, и вы увидите, что код for (...) {data.push(...)} выполняется каждый раз при отображении диаграммы. Это тратит впустую ресурсы ЦП и может стать настоящей проблемой, когда в секунду обрабатываются тысячи точек данных. Улучшенная диаграмма в реальном времени позволит вам просто добавлять по одной точке данных за раз, а не сбрасывать весь набор данных каждый раз, когда у вас появляется новая точка. - person tybro0103; 26.09.2013
comment
SmoothieCharts делает это правильно: smoothiecharts.org/tutorial.html - person tybro0103; 26.09.2013
comment
@tybro0103 tybro0103 Хорошо, логично. - person Fletch; 27.09.2013

Чтобы завершить эту тему, я предлагаю вам изучить:

d3.js

Это библиотека, которая помогает с множеством визуализаций javascript. Однако кривая обучения довольно крутая.

nvd3.js

Библиотека, упрощающая создание некоторых визуализаций d3.js (конечно, с ограничениями).

person Christopher Chiche    schedule 27.05.2014

Вы также можете взглянуть на CanvasJS Chart, которая построена на основе HTML5 Canvas Element. . Он рендерится очень быстро и может обновляться каждые 50-100 миллисекунд без проблем с памятью.

[Полное раскрытие: я являюсь частью команды]

person Sunil Urs    schedule 13.08.2014

Проще всего использовать plotti.co — микросервис, который я создал именно для этого. Это зависит от того, как вы получаете данные, но общий шаблон использования включает изображение SVG в ваш html, например

<object data="http://plotti.co/FSktKOvATQ8H/plot.svg" type="image/svg+xml"/>

и передавая ваши данные в запросе GET на ваш хэш (или используя метод (new Image(1,1)).src=... JavaScript с той же или любой другой страницы) следующим образом:

http://plotti.co/FSktKOvATQ8H?d=1,2,3

настроить его локально также просто

person grandrew    schedule 16.03.2016

http://www.rgraph.net/ отлично подходит для графиков и диаграмм.

person pushNpop    schedule 05.04.2013

Вот суть, которую я обнаружил для диаграмм в реальном времени в ChartJS:
https://gist.github.com/arisetyo/5985848

ChartJS выглядит просто и красиво.

Также есть FusionCharts, более сложная библиотека для корпоративного использования, с демонстрацией в реальном времени здесь:
http://www.fusioncharts.com/explore/real-time-charts

РЕДАКТИРОВАНИЕ Я также начал использовать Rickshaw для построения графиков в реальном времени, он прост в использовании и легко настраивается: http://code.shutterstock.com/rickshaw/

person JustGoscha    schedule 14.02.2014
comment
Потрясающая находка по существу, чувак! - person joonas.fi; 01.04.2014

Эта тема, возможно, очень и очень старая сейчас. Но хочу поделиться этими результатами для тех, кто видит эту тему. Провел сравнение betn. Flotr2, ChartJS, highcharts асинхронно. Flotr2 кажется самым быстрым. Протестировано путем передачи новой точки данных каждые 50 мс, всего до 1000 точек данных. Flotr2 был самым быстрым для меня, хотя, похоже, он регулярно перерисовывает графики.

http://jsperf.com/async-charts-test/2

person ssp    schedule 16.03.2015

Вы получаете данные с сервера, обновляете свой ранее доступный набор данных, а затем, вероятно, используете одну из свободно доступных библиотек для рисования графика (например: http://www.rgraph.net)

Вещи, которые вы, возможно, захотите рассмотреть: Если ваша диаграмма представляет состояние, получайте только новые данные с помощью xhr, обновляйте данные на клиенте и рисуйте.

person Anil Shanbhag    schedule 28.06.2011

Вы также можете попробовать Meteor Charts, он очень быстрый (холст html5), содержит множество руководств и хорошо документирован. Живые обновления работают очень хорошо. Вы просто обновляете модель и запускаете chart.draw() для повторного рендеринга графа сцены. Вот демо:

http://meteorcharts.com/demo

person Eric Rowell    schedule 10.08.2013

Дополнение от 2015 г. Насколько я знаю, до сих пор нет библиотеки линейных диаграмм, ориентированной на время выполнения. Я имею в виду диаграмму, поведение которой «запрашивать новые точки каждые N секунд», «очищать старые данные», которую вы можете настроить «декларативным» способом.

Вместо этого есть графитовый API http://graphite-api.readthedocs.org/en/latest/ для серверной части и количество клиентских подключаемых модулей, которые его используют. Но на самом деле они довольно ограничены, отсутствуют расширенные функции, которые нам нравятся: скроллер данных, диаграммы диапазонов, сегментация axeX по фазам и т.д..

Кажется, есть принципиальная разница между задачами "покажи мне диаграмму досягаемости" и "иметь диаграмму в реальном времени".

person Roman Pokrovskij    schedule 27.10.2015