我用 Protovis 做了很多工作,用 D3 做了一些事情。除了您提到的几点,我认为以下差异对我来说很突出:
Protovis 在您指定的视觉属性之间提供了一个简化的抽象层,而 D3 使用实际的 CSS 和 DOM 规范 - 因此您将使用or代替.width(10)
or 。在这些示例中,差异非常小,但是当您在 SVG 图像中绘制一条线时,就会有很大的不同。结果是使用 D3 感觉有点低级——你有更多的控制权,但你必须非常熟悉 SVG 语法才能更容易地完成 Protovis 所做的一些事情。.fillStyle('#00C')
.style('width', 10)
.attr('fill', '#00C')
正如您所注意到的,Protovis 全部以 SVG 呈现,而 D3 可以使用 DOM 的其他部分。这意味着,对于不需要基于 SVG 的视觉元素的可视化,即使在不支持 SVG 的浏览器中也可以使用 D3。这也意味着将 HTML 和 SVG 集成到同一个可视化中要容易得多,这对于处理文本之类的事情非常好(Protovis 中的文本操作和布局非常薄弱)。
D3 更改或删除了一些基本的 Protovis 实用程序,例如标度和数据操作。我对基本实用程序如pv.sum()
或pv.mean()
没有 D3 等价物一再感到恼火,尽管有些,如.nest()
,在两个库之间共享。2012 年 10 月 1 日编辑: D3 已填写其数据实用程序,但仍有一些 Protovis 包含而 D3 没有,例如pv.dict
、pv.numerate
和pv.repeat
. 据推测,它们被排除在外是因为它们被认为不太有用。
D3 为异步请求提供实用程序。当我想在 Protovis 中使用它时,我通常必须使用外部库(即 jQuery)。
与 Protovis 相当详细的文档相比,D3 API 文档几乎完全不完整。编辑 (8/30/13) : D3 现在在 GitHub 上有完整而详细的 API 文档,因此这一点不再相关。
最后,我在动画方面做得不多,但我认为你是完全正确的——D3 提供了比 Protovis 更多的动画支持,尤其是在动画过渡方面。Protovis 可以按需重新渲染部分或全部可视化,但不支持单步执行有限持续时间的动画 - 您必须使用setInterval
. D3 似乎使它成为图书馆更不可或缺的一部分。
编辑(2011 年 7 月 12 日):看起来有一个新的主要区别——截至 2011 年 6 月 28 日,Protovis 不再处于积极开发中,而 Protovis 团队正在推动 D3.js。最后一个版本相当稳定,所以这不应该阻止你使用它,但这绝对是一个需要考虑的问题。