Protovis против D3.js

84

TL; DR: есть ли у кого-нибудь опыт работы с protovis и D3.js, чтобы прояснить различия между ними?

Я играю с protovis в течение последних 2 недель, и пока все идет отлично. Только вот сейчас я, кажется, натолкнулся на кирпичную стену с анимацией.

protovis: http://vis.stanford.edu/protovis/

Я хочу сделать довольно простую анимацию, но с protovis она кажется менее интуитивной - я начинаю думать, что protovis никогда не предназначался для анимации. Итак, я начал смотреть на D3.js:

http://mbostock.github.com/d3/ex/stack.html

Выглядит очень похоже, но:

  • Кажется более легким
  • Похоже, ориентирован на взаимодействие с другими элементами DOM, а также с SVG
  • Кажется, ориентирован на добавление анимации

Кто-нибудь может осветить какие-либо другие отличия?

Буду очень благодарен за любой вклад

Ричард Пауэлл
источник

Ответы:

117

Я довольно много поработал с Protovis и кое-что с D3. Помимо упомянутых вами моментов, я думаю, что меня выделяют следующие отличия:

  • Если Protovis предоставляет упрощенный уровень абстракции между определяемыми вами визуальными свойствами, D3 использует фактические спецификации CSS и DOM, поэтому вместо .width(10)or .fillStyle('#00C')вы бы использовали .style('width', 10)or .attr('fill', '#00C'). В этих примерах разница довольно тривиальна, но когда вы делаете что-то вроде рисования линии на изображении SVG, есть большие различия. В результате использование D3 может показаться немного более низким - у вас больше контроля, но вы должны быть хорошо знакомы с синтаксисом SVG, чтобы выполнять некоторые из вещей, которые Protovis делает намного проще.

  • Как вы заметили, все Protovis отображается в SVG, а D3 может использовать другие части DOM. Это означает, что для визуализаций, не требующих визуальных элементов на основе SVG, вы можете использовать D3 даже с браузерами, не поддерживающими SVG. Это также означает, что гораздо проще интегрировать HTML и SVG в одну визуализацию, что действительно хорошо для таких вещей, как работа с текстом (манипуляции с текстом и макетом в Protovis довольно слабы).

  • D3 изменяет или удаляет некоторые из основных утилит Protovis, таких как масштабирование и манипулирование данными. Меня неоднократно раздражало, что базовые утилиты, такие как pv.sum()или pv.mean()не имеют эквивалентов D3, хотя некоторые, например .nest(), используются в двух библиотеках. Edit 10/1/12: D3 заполнила свои утилиты данных, но есть еще несколько , которые Protovis включает в себя и D3 не, например pv.dict, pv.numerateи pv.repeat. Предположительно, они не были учтены, потому что считались менее полезными.

  • D3 предоставляет утилиты для асинхронных запросов. Когда я хочу этого в Protovis, мне обычно приходится использовать внешнюю библиотеку (например, jQuery).

  • Документация по D3 API почти полностью отсутствует , по сравнению с довольно подробной документацией для Protovis. Изменить (30.08.13) : D3 теперь имеет полную и подробную документацию по API на GitHub , поэтому этот момент больше не актуален.

  • Наконец, я мало что сделал с анимацией, но я думаю, что вы совершенно правы - D3 обеспечивает большую поддержку анимации, чем Protovis, особенно в плане анимированных переходов. Protovis может повторно рендерить часть или всю визуализацию по запросу, но не поддерживает пошаговое выполнение анимации с ограниченной продолжительностью - вам придется кодировать все это вручную setInterval. D3, похоже, делает его гораздо более неотъемлемой частью библиотеки.

Изменить (7/12/11) : похоже, есть новое существенное отличие - по состоянию на 28 июня 2011 года Protovis больше не находится в активной разработке, и вместо этого команда Protovis продвигает D3.js. Последний выпуск достаточно стабилен, так что это не должно помешать вам его использовать, но это определенно следует учитывать.

Нрабинович
источник
Довольно правильно, за исключением третьего пункта. Вы можете встроить графику Protovis в произвольный HTML-элемент.
Джефф
@Jeff - возможно, я преувеличил. Я хотел сказать, что D3 предназначен для работы с произвольными элементами, в то время как для этого с Protovis (AFAIK) требуется работа вне установленного API (например, путем установки $domсвойства root ). Я смягчу этот момент.
nrabinowitz
1
@Jeff - Если подумать, я полностью забываю об этом - почему-то я никогда не замечал эту Panel#canvasсобственность. Спасибо за замечание.
nrabinowitz
Большое спасибо за подробный ответ - это было действительно полезно
Ричард Пауэлл
2
с марта 2013 года справочник по API версии 3 для D3 кажется полным и производит действительно хорошее впечатление. Кроме того, есть хорошая документация с множеством руководств и хороших примеров.
Mobiletainment
32

Есть руководство, в котором подробно описаны различия между D3 и Protovis . Я согласен с описанием @nrabinowitz, но отмечу, что недавно мы добавили обширную документацию по API .

mbostock
источник
1
Да, я только вчера это заметил (очень признателен!). Обновлю свой ответ для потомков :).
nrabinowitz
6

Существует недавняя статья авторов Protovis / d3.js, опубликованная в 2011 г. http://vis.stanford.edu/files/2011-D3-InfoVis.pdf, в основном о d3.js, но содержащая некоторые причины, по которым они изменили определенные вещи на пути от Protovis к d3.js.

пинчо
источник
Я нашел эту бумагу полезной . Не делая каких - либо испытаний, он дает мне оценку того , где он работает и где это несовершенное. Благодарю.
Майк Гейл,