0,0
рейтинг
3 декабря 2013 в 00:38

Разработка → Средства построения графиков для .NET

ASP*, .NET*

Не так давно пришлось столкнуться с тривиальной задачей — найти решение, которое позволит рендерить рисунки графиков для .NET. Сразу оговорюсь, что меня интересовали только линейные графики. Камнем преткновения, который подтолкнул к переделыванию уже существующего решения (это были графики, встроенные в rdlc отчеты), было быстродействие. В целом, к искомому решению были предъявлены такие требования:
  1. Необходимо оставить данную оптимизацию незамеченной для конечного пользователя, следовательно, решение должно быть широко настраиваемым, чтобы, в конечном счете, выглядеть так же, как и предшественник.
  2. Работать быстро (ну понятно, пользователи не любят ждать).
  3. Желательно, быть бесплатным или с открытым исходным кодом. Покупка не стала бы большой проблемой, найди я отличное платное решение, но начать лучше с open source.


Что было сделано?

Погуглив, выяснилось, что существует достаточно много вариантов для решения данной задачи, и все они достаточно сильно отличаются по многим параметрам (размер сообщества, скорость работы, удобство). В процессе выбора решения было опробовано 8 бесплатных вариантов:
  • DisLin. Кроссплатформенная библиотека (UNIX, Linux, FreeBSD, OpenVMS, Windows, Mac OSX и MS-DOS). Чрезвычайно мощная, гибкая, действительно стоит того, чтобы написать отдельную статью только о ней. Может быть, немного уступает своим конкурентам по степени читабельности кода (использует классический функциональный подход), но зато, благодаря этому, может быть легко портирована практически на любой язык. Имеет ванильные торты порты на C, C++, Fortran 77, Fortran 90, Perl, Python, Ruby, Tgl, GCL (порт на C# — обычная библиотека с импортированными функциями). Бесплатная для некоммерческого использования.
  • Google Chart Sharp. Обертка над Google Chart API для С#. На хабре уже были статьи о нем, поэтому в двух словах: бесплатный (с ограничением 50000 тыс. вызовов в день), работает очень шустро, присутствуют основные параметры для кастомизации. Среди плюсов: возможность использовать везде, где есть подключение к интернету, независимость от используемого языка / ОС. Основной минус — это, естественно, дополнительный round-trip данных по сети (если график Вам нужен ещё на сервере), что замедляет процесс.
  • Microsoft Chart Controls. Нативный функционал от Microsoft, который был представлен общественности в далеком 2008 году. К тому времени уже существовал ряд решений от сторонних разработчиков, но это не помешало Ms Chart Controls быстро завоевать популярность среди разработчиков. И не удивительно, ведь они поставлялись с .NET framework, имели удачную архитектуру, были легко настраиваемыми и привлекательными на вид. По скорости уступают остальным, но, тем не менее, работают тоже вполне прилично.
  • NPlot. Ещё одна open source библиотека. Правда, не самая быстрая и популярная — информацию по ней можно найти в Интернете, хотя и не так много, как, например, по Microsoft Chart Controls. Тем не менее, поигравшись с ней, у меня осталось довольно приятное послевкусие.
  • OxyPlot. «Живой» кроссплатформенный open source, где можно даже зарепортить баг, на который, скорее всего, отреагируют. Доступен также в NuGet. Есть соответствующие контролы для WPF/Silverligth, WinForms, Metro. Плюшки, вроде экспорта напрямую в OpenXml и Pdf. Если Вам необходимо не «минутное» решение и возможность поправить его под себя, это решение для Вас.
  • ZedGraph. Также «живой» open source, прямой конкурент для OxyPlot. По количеству поддерживаемых платформ (только Windows) и технологий (только WinForms и ASP .NET) уступает ему, но очень симпатичный и один из самых быстрых. Отличный выбор, если Вам надо «просто красивый график» и больше ничего.
  • WebChart. Бесплатный предшественник Microsoft Chart Controls. Насколько я вижу, мертвый с 2004 года. У него чуть более убогий функционал в сравнении с остальными решениями, но, так как он имеет некоторые внешние отличия от остальных, может быть вполне полезен.
  • OpenMinded. Беплатный вариант от пользователя OpenMinded. Выглядит красиво. О производительности судить трудно, так как я не нашел возможности рендерить результирующий рисунок иначе как на жесткий диск. Но поскольку проэкт открытый, любой желающий может его доделать под себя, уверен — это не проблема.

Ещё в самом начале я решил, что надо собрать как можно больше вариантов в одном месте и протестить их на быстродействие, а уже после этого было очень жалко выбрасывать в корзину проделанную работу. Поэтому было решено оформить эту статейку и выложить то, что получилось, на GitHub. Таким образом, если возникла необходимость, Вы можете настроить каждое решение под себя и сразу же его проверить. Лично мне очень не хватало такой статьи в начале. Может быть, исходники вызовут улыбку у гуру, но новичкам, которые только вникают в .NET и ASP, они однозначно будут очень полезны.
Для сравнения скорости работы берутся дефолтные настройки графика, указывается разрешение выходного рисунка и ему скармливается фиксированное количество точек. Каждое решение прогоняется несколько раз, и в качестве реальной скорости берется среднее. Опять же, это достаточно субъективно, и, если Вы можете предложить более красивый подход, я с интересом выслушаю.
На моем ПК (Intel Core I5 3.10 GHz, 8gb ОЗУ, Windows 7 x64) вышло следующее распределение скорости работы:

Решение
Количество итераций
Суммарное время (сек)
Среднее время на одну итерацию (сек)
1
Dislin charts
5
1.9071907
0.38143814
2
Zed Graph
5
2.750275
0.550055
3
NPlot
5
3.1833183
0.63666366
4
Web Chart Control
5
5.130513
1.0261026
5
Microsoft Chart Controls
5
6.8456845
1.3691369
6
Oxy Plot
5
7.0067006
1.40134012
7
Open minded plot
5
8.257
1.6514
8
Google Sharp charting
5
9.8049804
1.96099608

Для различных входных параметров (разрешение изображения, количество точек на графике, параметры ПК, скорость интернета, фаза Луны и т.д.) результаты немного отличаются, поэтому Вы можете протестировать быстродействие у себя.
Я специально не делал глубокое сравнения фич и возможностей кастомизации, так как это довольно субъективная информация, которая сильно зависит от конкретной задачи. При необходимости, каждый желающий может провести полчаса, подебажить, посмотреть архитектуру решений, прикинуть, насколько легко их настроить под конкретные требования.
Если кто-то знает ещё бесплатные решения для графиков под .NET, которые пропущены в статье, — пишите в комментариях, и я постараюсь их добавить.

upd — (добавил решение от OpenMinded)
upd2 — (включил DevExpress в опрос)
Какие средства построения графиков для .NET Вы использовали в своих проeктах?

Проголосовало 364 человека. Воздержался 281 человек.

Стоит добавлять в статью и проект платные решения?

Проголосовало 155 человек. Воздержалось 50 человек.

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

Иван Перевернихата @ivan_p
карма
14,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Разработка

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

  • 0
    Мне понравился d3js, json кушает отлично. Микрософт его в новом tfs 2013 кстати использовали.
    • 0
      К сожалению, тут client-side решения не подходили, надо было на сервере рендерить рисунок. Но для UI, однозначно, лучше использовать более интерактивные варианты.
  • 0
    Когда-то написал свой небольшой велосипед для рендеринга графиков в картинку с использованием Direct2D. Ни разу не использовал, но писать было интересно.
    • 0
      Добавил Ваше решение в проэкт и в статью. Не подскажите, под какой точно лицензией распостраняются проэкты с bitbucket?
      • 0
        По-разному. В данном случае «as-is» — никаких гарантий и с кодом можно делать все, что угодно.
  • +1
    Спасибо за интересный обзор. В дополнение: недавно прочел в блоге о библиотеке ILNumerics. Высокопроизводительная библиотека для математических вычислений для .NET с возможностью визуализации.
    • 0
      С удовольствием бы добавил в проэкт, но у них с 2011 года проприетарная лицензия.
  • 0
    Для WPF есть еще библиотека DynamicDataDisplay, довольно старая, и без документации, но быстрая и с неплохим функционалом. Использовал в своем проекте, хоть без документации тяжко.
    Пример графика
    • 0
      Тоже использовали в одном проекте. Документация к ней особо и не нужна, т.к. большая часть вопросов быстро решается эмпирическим путем. Чаще всего обращались к их примерам для Silverlight, обычно этого достаточно. К сожалению проект заброшен, внутренней документации нет, комментарии в большей части кода отсутствуют, внутреннюю логику без спирта и матери понять очень сложно. Прямые на нем реализовать сложнее всего, т.к. неожиданно всплывают баги округления чисел для отметок по оси Y. Этот же баг проявляется и для некоторых наборов данных (встречается очень редко).

      Если от него нужно больше, чем отображение графиков, то лучше всего всю логику работы с чартом выносить в отдельный класс-контроллер и работать только через него.
      • 0
        Эмпирическим путем хорошо решается потому, что есть набор примеров. Если бы его не было, можно было бы и не упоминать это решение. Кстати, еще минус тот, что код последней nightly build версии несовместим с кодом стабильной версии.
        • 0
          И в nightly build очень много недоделок, которые бросили не доведя до конца.

          PS. эмпирическим путем решались те проблемы, которых в примерах не было. Например, ручное управление границами и т.п.
  • 0
    Не бесплатный, но довольно функциональный — ChartDirector
  • +6
    У нас в DevExpress тоже есть разные графики для .NET (WinForms, ASP.NET, WPF и SL). Было бы очень интересно увидеть и их в этом сравнении.
    • +1
      Я имею право заливать DevExpress бинарники на GitHub? Если да — запросто добавлю. Кстати, я обращался в Chart FX, с этим же вопросом, но после длительной переписки мне сказали:
      I understand your needs. The product you used originally, Chart FX Lite (ChartFX.Lite.dll), which is a free product, works with Windows Forms application only. For ASP.NET application, none of our products are free. If you decide to use any commercial products in your evaluation, we would recommend you to use Chart FX 8, our latest and most complete product available for Asp.NET development.
      • 0
        Если у вас триальная версия наших компонентов, то, к сожалению, согласно нашей EULA, распространять их нельзя.

        Но если хотите, Вы можете просто выложить свой пример и добавить в проект файл readme со ссылкой, по которой можно взять триальную версию наших компонентов.
        • +2
          Я сразу за такой подход не подумал, и это идея. Я мог бы таки образом добавить поддержку всех платных решений. Добавлю голосование, и если народу интерестно это увидеть, то добавлю в статью и к проекту все платные решения.
  • 0
    Из платных хорошо себя показали TeeChart, но это точно не для «просто график»
  • 0
    Посмотрели кучу фреймоворков и компонент, в т.ч. платных. Только CustomPaint, только хардкор :))) Из DevExpress здесь только зум/пан и степлайн



    Кстати, подавляющее большинство графиковых компонентов начинает вести себя неудовлетворительно медленно, как только количество точек больше 10-20 тыщ и при этом серий больше 2-3.
  • 0
    Могут ли какие-нибудь библиотеки хорошо строить графики функций с неявной зависимостью, т.е. когда f(x, y) = 0?
    • 0
      Дело в том, что все известные мне средства построения графиков для .NET принимают на вход уже подготовленные дискретные данные. И это правильно, каждый компонент должен решать только свою задачу. Поэтому Вам скорее всего придется найти решения функции численно, и скормить их компоненту. Здесь уже спрашивали за такое. Можно попытаться прикрутить матлаб, но имхо выйдет стрельба по воробьям из пушки. Ещё вроде бы gnuplot умеет такое, но у него нет удобного API для того что бы дергать его из c#.
  • 0
    Блин, сколько же надо будет времени убить, чтобы посмотреть их все. За тему — спасибо, мне очень актуально, потому что есть потребность в адекватном архивном тренде и тренде реального времени для отображения технологических величин в процессах автоматизации. Даже некоторый прототип своего движка под это дело набросал: www.youtube.com/watch?v=NEsYtjtS9PA
    • 0
      На видео Ваш движок визуализации? Если да, то почему решили писать свой, ведь доступно уже более чем достаточно достойных решений?
      Кстати, если Вам интересно, то скоро опубликую обзор платных решений, а также тех бесплатных, которые посоветовали в комментариях, но я ещё не успел их сюда добавить.
      • 0
        Да смотрел решения, но, пока исследуешь все нюансы — потратишь время, соизмеримое со временем написания своего собственного движка. На видео мое решение с нуля, пришел к нему из-за некоторой специфики рынка. Если в мой профиль посмотрите, то по статьям поймете, что не всегда согласен с проприетарными решениями и знаю, что можно даже слона переделать, если хобот кажется не такой мягкости и длинны :) Один фиг, все равно хочу готовое решение, как и все, но вот сформулировать требования к нему пока не могу осилить, хотя — в постановке вопроса (грамотной) обычно кроется примерно больше половины ответа. А у меня это ТЗ в основном заказчик должен писать, а не я, но в 100% случаев — заказчика приходится «сажать» на то, что есть, потому что он кроме «пасьянса» в винде и не видел ничего, куда ему до высоких материй… Зато, сколько потом у него гонора, когда начинает работать на том, что дали, и мнит себя супер-мега-профи в таких вопросах как юзабилити и только попробуй ему перечить, когда он критикует то, к чему даже капельки усилий не приложил, хотя должен был на все сто. :)
  • 0
    Dundas

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.