Protovis vs D3.js

84

TLDR: Czy ktoś ma doświadczenie zarówno z protovisem, jak i D3.js, aby wyjaśnić różnice między nimi?

Gram z protovisem od 2 tygodni i do tej pory było świetnie. Tyle że teraz wydaje mi się, że uderzyłem w kawałek cegły z animacją.

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

Chcę zrobić całkiem prostą animację, ale z protovis wydaje się to mniej niż intuicyjne - zaczynam myśleć, że protovis nigdy tak naprawdę nie był przeznaczony do animacji. Więc zacząłem patrzeć na D3.js:

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

Wygląda bardzo podobnie, ale:

  • Wydaje się lżejszy
  • Wydaje się być nastawiony na interakcję z innymi elementami DOM, a także SVG
  • Wydaje się nastawiony na dodawanie animacji

Czy ktoś może wyjaśnić inne różnice?

Byłbym bardzo wdzięczny za wszelkie uwagi

Richard Powell
źródło

Odpowiedzi:

117

Wykonałem sporo pracy z Protovisem i kilka rzeczy z D3. Oprócz punktów, o których wspomniałeś, myślę, że wyróżniają mnie następujące różnice:

  • Tam, gdzie Protovis zapewnia uproszczoną warstwę abstrakcji między określonymi właściwościami wizualnymi, które określasz, D3 używa rzeczywistych specyfikacji CSS i DOM - więc zamiast .width(10)lub .fillStyle('#00C')użyjesz .style('width', 10)lub .attr('fill', '#00C'). W tych przykładach różnica jest dość trywialna, ale gdy robisz coś takiego jak rysowanie linii na obrazie SVG, występują duże różnice. W rezultacie używanie D3 może wydawać się nieco niższe - masz większą kontrolę, ale musisz dość dobrze znać składnię SVG, aby wykonać niektóre rzeczy, które Protovis robi znacznie łatwiej.

  • Jak zauważyłeś, cały Protovis jest renderowany w SVG, podczas gdy D3 może używać innych części DOM. Oznacza to, że w przypadku wizualizacji, które nie wymagają elementów wizualnych opartych na SVG, można używać D3 nawet w przeglądarkach, które nie obsługują SVG. Oznacza to również, że znacznie łatwiej jest zintegrować HTML i SVG w tej samej wizualizacji, co jest naprawdę przydatne w przypadku takich rzeczy, jak praca z tekstem (manipulacja tekstem i układ są dość słabe w Protovis).

  • D3 zmienia lub upuszcza niektóre podstawowe narzędzia Protovis, takie jak skale i manipulacja danymi. Wielokrotnie denerwuje mnie to, że podstawowe narzędzia, takie jak pv.sum()lub pv.mean()nie mają odpowiedników D3, chociaż niektóre, na przykład .nest(), są współdzielone w obu bibliotekach. Edit 01.10.12: D3 wypełnił swoje narzędzia danych, ale nadal istnieje kilka, które Protovis obejmuje i D3 nie robi, na przykład pv.dict, pv.numeratei pv.repeat. Prawdopodobnie pominięto je, ponieważ uznano je za mniej przydatne.

  • D3 zapewnia narzędzia do żądań asynchronicznych. Kiedy chcę tego w Protovis, generalnie muszę użyć zewnętrznej biblioteki (tj. JQuery).

  • Dokumentacja API D3 jest prawie całkowicie niekompletna, w porównaniu z dość szczegółową dokumentacją dla Protovis. Edycja (30.08.13) : D3 ma teraz pełną i szczegółową dokumentację API na GitHub , więc ten punkt nie ma już znaczenia.

  • Wreszcie, nie zrobiłem zbyt wiele z animacją, ale myślę, że masz całkowitą rację - D3 zapewnia więcej wsparcia dla animacji niż Protovis, szczególnie jeśli chodzi o animowane przejścia. Protovis może ponownie renderować część lub całość wizualizacji na żądanie, ale nie ma żadnego wsparcia dla przechodzenia przez animację o ograniczonym czasie trwania - musisz to wszystko zakodować ręcznie setInterval. Wydaje się, że D3 sprawia, że ​​jest to znacznie bardziej integralna część biblioteki.

Edycja (12.07.11) : Wygląda na to, że pojawiła się nowa duża różnica - od 28 czerwca 2011 r. Protovis nie jest już aktywnie rozwijany, a zespół Protovis naciska zamiast tego na D3.js. Ostatnia wersja jest dość stabilna, więc nie powinno to przeszkadzać w korzystaniu z niej, ale zdecydowanie warto to rozważyć.

nrabinowitz
źródło
Całkiem poprawne, z wyjątkiem trzeciego punktu. Możesz osadzić grafikę Protovis w dowolnym elemencie HTML.
Geoff
@Jeff - Być może zawyżałem sprawę. Chodziło mi o to, że D3 ma pracować z dowolnymi elementami, podczas gdy robienie tego z Protovis (AFAIK) wymaga pracy poza ustalonym API (np. Poprzez ustawienie $domwłaściwości root ). Złagodzę ten punkt.
nrabinowitz
1
@Jeff - Po namyśle całkowicie porzucam tę kwestię - jakoś nigdy nie zauważyłem tej Panel#canvasnieruchomości. Dzięki za wiadomość.
nrabinowitz
Dziękuję bardzo za szczegółową odpowiedź - to była naprawdę pomocna
Richard Powell,
2
od marca 2013 roku dokumentacja API dla wersji 3 D3 wydaje się być kompletna i robi naprawdę dobre wrażenie. Ponadto istnieje dobra dokumentacja z wieloma samouczkami i ładnymi przykładami.
Mobiletainment
32

Istnieje samouczek, który szczegółowo omawia różnice między D3 i Protovis . Zgadzam się z opisem @ nrabinowitz, chociaż zaznaczę, że ostatnio dodaliśmy obszerną dokumentację API .

mbostock
źródło
1
Tak, właśnie zauważyłem to wczoraj (bardzo docenione!). Zaktualizuję odpowiedź dla potomnych :).
nrabinowitz
6

Niedawno opublikowano artykuł autorów Protovis / d3.js opublikowany w 2011 r. Http://vis.stanford.edu/files/2011-D3-InfoVis.pdf głównie na temat d3.js, ale zawierający kilka powodów, dla których zmienili pewne rzeczy w drodze z Protovis do d3.js.

pintxo
źródło
Ten papier okazał się przydatny . Bez przeprowadzania żadnych testów pozwala mi ocenić, gdzie działa i gdzie jest niedoskonały. Dzięki.
Mike Gale