d3.js沿着一条线包装

前端之家收集整理的这篇文章主要介绍了d3.js沿着一条线包装前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我得到了一个数据集,其中每个样本的大小(0-1000)和值(1-5级).我想用一条直线(域轴)的不同大小的圆圈可视化数据,非常像:

http://www.nytimes.com/interactive/2013/05/25/sunday-review/corporate-taxes.html?_r=1&

(请注意,即使具有相同的有效税率,圆圈也不会重叠)

示例数据:

>样本1:大小300值3.2
>样本2:大小45值3.8
>样本3:大小4400值4.0
>样本5:大小233值0.2
>样本6:大小4000值4.2

如何使用线上的圆来显示上面的数据(大小决定直径,值决定线上的近似位置),以便圆圈不重叠?

我一直在研究D3的包装布局,但据我所知,它不支持开箱即用.任何人对如何处理这个有任何想法?

解决方法

哦,这个是一个难题……

如果您查看NYTimes图形的代码,它会在数据文件中使用预先计算的坐标,因此没有多大用处.

但是,脚本顶部有一个未使用的变量声明,暗示原始版本使用d3.geom.quadtree来布置圆圈.四叉树实际上不是布局方法;它用于创建相邻节点的搜索树,因此当您需要在给定区域中查找节点时,您不必搜索整个集合. Example here.

因此,四叉树可用于识别哪些数据点可能在x轴上相互重叠.然后你必须弄清楚你需要多少偏移它们以避免重叠.变量半径使两个函数复杂化……

我在这里实现了一个测试用例:
http://fiddle.jshell.net/6cW9u/5/

打包算法并不完美:我总是在现有圆圈的外部添加新的圆圈,而不测试它们是否可能更贴近,所以有时候当圆圈的边缘相互碰撞时,你会得到明显的额外空白. (运行几次以了解可能性 – 请注意,我将x变量分布为随机正态和r变量分布为随机均匀.)我在一个递归方法中也有一个堆栈溢出N = 100的迭代 – 随机分布显然不能很好地分布为四叉树优化.

但它有基本的功能.如果您不能遵循我的代码注释的逻辑,请在此处发表评论.

–ABR

更新

这里有新的小提琴:http://fiddle.jshell.net/6cW9u/8/

经过大量的重新安排,我得到了打包算法来寻找现有泡沫之间的差距.我已经切换了排序顺序(以便首先添加最大的圆圈)来展示如何在空白中添加小圆圈 – 尽管正如我在代码注释中提到的那样,这会降低四叉树搜索的效率.

添加了各种装饰和过渡,以便您可以清楚地看到圆圈的定位方式,并将r标度设置为平方根,因此面积(非半径)与数据中的值成正比(这更加真实,以及OP要求的内容).

猜你在找的JavaScript相关文章