D3.js V6发布

2020-08-27 07:54:21

PermalLink GitHub是5000多万开发人员的家园,他们一起工作,共同托管和审查代码、管理项目和构建软件。

报名。

本文档仅涵盖主要更改。有关微小更改和修补程序的更改,请参阅发行说明。

所有D3模块现在都采用了ES2015。需要保持与旧浏览器兼容性的开发人员将使用转换。[详情]。

负值符号的默认符号为Unicode减号,而不是连字符减号。[详情]。

D3现在使用承诺而不是异步回调来加载数据。承诺简化了异步代码的结构,特别是在支持异步和等待的现代浏览器中。(请参阅关于可观察性承诺的介绍。)。例如,要在v4中加载CSV文件,您可以说:

注意,您不需要重新抛出错误-Promise将自动拒绝,如果需要,您可以Promise.catch。使用AWAIT,代码甚至更简单:

随着Promises的采用,D3现在使用FETCH API而不是XMLHttpRequest:d3-request模块已经被d3-FETCH取代。FETCH支持许多强大的新功能,例如流式响应。D35.0还弃用并删除了d3-queue模块。使用Promise.all并行运行一批异步任务,或使用p-Queue等帮助器库来控制并发性。

D3不再提供d3.schemeCategory20*分类配色方案。这些二十色方案是有缺陷的,因为它们的分组设计可能会错误地暗示数据中的关系:共享色调可能意味着编码的数据是组(超类别)的一部分,而相对亮度可能意味着顺序。取而代之的是,d3现在包括d3尺度色度,它实现了ColorBrewer的优秀方案,包括分类方案、发散方案、顺序单色方案和顺序多色调方案。这些方案有离散型和连续型两种。

D3现在提供行进方块和密度估计的实现,通过d3-轮廓!有两种新的d3选择方法:selection.clone用于插入所选节点的克隆,d3.create用于创建分离的元素。地理投影现在支持projection.angle,这使得Philippe Rivière的几个奇妙的新多面体投影成为可能。

最后,D3的Package.json不再固定依赖的D3模块的确切版本。这修复了重复安装D3模块的问题。

D3 4.0是模块化的。现在,D3不再是一个库,而是多个旨在协同工作的小型库。您可以根据自己的喜好拾取和选择要使用的部件。每个库都维护在自己的存储库中,允许分散所有权和独立的发布周期。默认捆绑包结合了大约30个这样的微库。

如前所述,您可以在默认捆绑包上加载可选插件,如ColorBrewer Scale:

您不需要使用默认捆绑包!如果您只是使用d3-select,请将其用作独立库。与默认捆绑包一样,您可以使用普通脚本标记或RequireJS加载D3微库(非常适合HTTP/2!):

您还可以将D3微库CAT到自定义捆绑包中,或者使用webpack和Rollup等工具创建优化的捆绑包。自定义包对于使用D3特性子集的应用程序非常有用;例如,Reaction图形库可以使用D3进行缩放和形状,并对DOM进行响应来操作DOM。D3微库以ES6模块的形式编写,Rollup允许您在符号级别进行选择,以生成更小的捆绑包。

小文件很好,但模块化也是为了让D3更有趣。微库更容易理解、开发和测试。它们让新人更容易参与进来并做出贡献。它们减少了“核心模块”和“插件”之间的区别,并加快了D3特性的开发速度。

如果您不关心模块性,那么您基本上可以忽略此更改并继续使用缺省捆绑包。然而,采用ES6模块有一个不可避免的后果:D34.0中的每个符号现在共享一个平面名称空间,而不是D33.x中的嵌套名称空间。例如,d3.scale.line现在是d3.scaleLine,d3.layout.treemap现在是d3.treemap。ES6模块的采用也意味着D3现在以严格模式独占编写,具有更好的可读性。对D3的特性还有许多其他重大改进!(D33.x中的几乎所有代码都已重写。)。这些更改如下所述。

默认的UMD捆绑包现在是匿名的。如果检测到AMD或CommonJS,则不会导出d3全局。在普通环境中,d3微库共享d3全局,即使您独立加载它们;因此,无论您是否使用缺省包,您编写的代码都是相同的。(有关更多信息,请参阅我们制作一个(D3)插件。)。生成的包不再存储在Git存储库中;Bower已被重新指向d3-Bower,您可以在npm上找到生成的文件,也可以将其附加到最新版本。未缩小的默认捆绑包不再损坏,使其更具可读性,并保留内联注释。

令一些用户惊愕的是,3.x使用了λ,φ,τ和π等unicode变量名来简洁地表示数学运算。这种方法的一个缺点是,如果使用ISO-8859-1而不是UTF-8加载未缩小的D3,则会发生语法错误。3.x还使用Unicode字符串文字,例如1e-6的SI前缀µ。4.0仅使用ASCII变量名和ASCII字符串文字(请参阅roll-plugin-ascii),避免了编码问题。

新的d3.scan方法执行数组的线性扫描,根据指定的比较器返回最小元素的索引。这类似于d3.min和d3.max,不同之处在于您可以使用它来查找极值元素的位置,而不仅仅是计算极值。

VAR数据=[{Name:";Alice";,Value:2},{Name:";Bob";,Value:3},{Name:";Carol";,Value:1},{Name:";Dwayne";,Value:5}];var i=d3。扫描(数据,函数(a,b){返回a.。值-b。Value;});//2数据[i];//{名称:";卡罗尔";,值:1}。

新的d3.ticks和d3.tickStep方法对于生成人类可读的数字记号很有用。这些方法是来自d3尺度的Continuous.ticks的低级替代。新的实现也更加准确,返回通过相对误差测量的最佳刻度数。

当step不是整数时,d3.range方法不再精心尝试避免浮点错误。返回值严格定义为start+i*step,其中i为整数。(了解有关浮点数学的更多信息。)。D3.range返回无限范围的空数组,而不是抛出错误。

可选访问器的方法签名已更改为与数组方法(如array.forEach)更一致。forEach:向访问器传递当前元素(D)、索引(I)和数组(Data),但这是未定义的。这会影响d3.min、d3.max、d3范围、d3.sum、d3平均值、d3中值、d3分位数、d3方差和d3偏差。D3.Quantile方法以前没有接受访问器。一些具有可选参数的方法现在将这些参数视为缺少参数(如果它们为空或未定义),而不是严格检查arguments.length。

新的d3.histgraph API取代了d3.layout.histgraph。直方图不是在每个返回的bin上公开bin.x和bin.dx,而是公开bin.x0和bin.x1,从而保证bin.x0与前一个bin上的bin.x1完全相等。不再支持“频率”和“概率”模式;每个bin只是输入数据中的一个元素数组,因此在频率模式下,bin.length等于D33.x的bin.y。要计算概率分布,请将每个面元中的元素数量除以元素总数。

为了与比例保持一致,Histogram.range方法已重命名为histogram.domain。Histogram.bins方法已重命名为histogram.Thresholds,不再接受上限:n个阈值将生成n+1个bin。如果您指定了所需的仓位数,而不是阈值,则d3直方图现在使用d3.ticks来计算合适的仓位阈值。除了默认的斯特奇斯公式之外,D3现在还实现了Freedman-Diaconis规则和Scott的正常参考规则。

<;样式>;。轴路径、。轴线{填充:无;笔划:#000;形状渲染:清晰边缘;}。轴文本{font:10 px sans-serif;}<;/style>;<;脚本>;d3。选择(";.轴";)。呼叫(d3.。SVG.。轴()。比例(X)。Orient(";底部";);;<;/script>;

D34.0提供默认样式和更短的语法。取代了d3.svg.axis和axis.orient,D34.0现在为每个方向提供了四个构造函数:d3.axisTop、d3.axisRight、d3.axisBottom和d3.axisLeft。这些构造函数接受比例,因此您可以将上述所有内容简化为:

与前面一样,您可以通过应用样式表或修改AXIS元素来自定义轴外观。默认外观已稍作更改,将轴偏移半像素;这修复了Safari上的边缘清晰呈现问题,在Safari中轴将绘制为两个像素厚。

现在有一个axis.tickArguments方法,作为axis.ticks的替代方法,它还允许检查轴记号参数。Axis.tickSize方法已更改为在设置刻度大小时仅允许单个参数。Axis.innerTickSize和axis.outerTickSize方法已分别重命名为axis.tickSizeInternal和axis.tickSizeOu.。

取代了d3.svg.笔刷,现在有三类笔刷用于沿x维和/或y维进行笔刷:d3.brushX、d3.brushY和d3.brushY。画笔不再依赖于比例;相反,每个画笔在屏幕坐标中定义一个选区。如果要计算相应的数据域,则可以颠倒此选择。现在不再依赖天平的范围来确定可刷区域,而是使用Brush.Extension方法来设置它。如果不设置画笔范围,则默认为所有者SVG元素的全范围。Brush.clip方法也已取消;笔刷始终限于笔刷范围定义的可笔刷区域。

画笔不再在内部存储活动画笔选择(即高亮显示的区域;画笔的位置)。笔刷的位置现在存储在已应用笔刷的任何元素上。画笔的位置可以在画笔事件中作为event.election获得,也可以通过对给定元素调用d3.brushSelection来获得。若要以编程方式移动画笔,请使用带有给定选区或过渡的brush.move;请参见画笔捕捉示例。Brush.event方法已删除。

笔刷交互已得到改进。默认情况下,画笔现在会忽略用于上下文菜单的右键单击;您可以使用brush.filter更改此行为。笔刷还会忽略iOS上的模拟鼠标事件。按住Shift(⇧)的同时画笔锁定画笔的x或y位置。在按住Meta(⌘)的同时单击并拖动将开始一个新的选区,而不是平移现有的选区。

画笔的默认外观也得到了改进和略微简化。以前,需要对画笔应用样式以使其具有合理的外观,例如:

这些样式现在默认作为属性应用;如果要自定义画笔外观,仍可以应用外部样式或修改画笔元素。(D3 4.0具有与AXIS类似的改进。)。新的brush.handleSize方法允许您覆盖画笔手柄大小;它的默认值为6像素。

画笔现在使用已处理的事件,从而更容易与其他交互行为(如拖动和缩放)相结合。Brushstart和brushend事件已分别重命名为start和end。笔刷事件不再报告区分调整笔刷大小和拖动笔刷的event.mode。

为了与arc.padangle保持一致,chord.pAddding也已重命名为ribon.padangle。一个新的Ribon.context方法允许您将弦图呈现到画布上!另请参见d3-path。

D3.set构造函数现在接受用于制作副本的现有集。如果将数组传递给d3.set,还可以传递一个值访问器。此访问器接受标准参数:当前元素(D)、索引(I)和数组(Data),但未定义。例如:

VAR收益率=[{产量:22.13333,品种:";满洲里";,年份:1932年,地点:";大急流:},{产量:26.76667,品种:";泥炭地";,年份:1932年,地点:";大急流:},{产量:28.10000,品种:";第462"号;,年份:1931年,地点:";德卢斯;},{产量:38.50000,品种:";斯万索塔,年份:1932年,地点:";瓦塞卡},{产量:40.46667,品种:";斯万索塔;},年份:1931年,地点:";克鲁克斯顿";},{产量:36.03333,品种:";泥炭地,年份:1932年,地点:";瓦塞卡},{产量:34.46667,品种:";威斯康星州第38号,年份:1931年,地点:";大急流城}];SET(收益率,函数(D){Return d.。Site;});//大急流城、德卢斯、瓦塞卡、克鲁克斯顿。

Map.forEach和set.forEach方法已分别重命名为map.each和set.each。Map.each的参数顺序也已更改为value、key和map,而set.each的参数顺序现在为value、value和set。这更接近ES6map.forEach和set.forEach。与ES6Map和Set一样,map.set和set.add现在返回当前集合(而不是附加值),以便于方法链接。可以使用新的map.clear和set.clear方法清空集合。

现在,nest.map方法总是返回d3.map实例。对于普通对象,请改用nest.object。当与nest.roll up结合使用时,nest.entry现在返回叶条目的{key,value}对象,而不是{key,values}。这使得nest.roll更容易与层次结构结合使用,就像这个Nest树地图示例一样。

现在,所有颜色的不透明度都显示为color。不透明度,它是[0,1]中的一个数字。您可以将可选的不透明度参数传递给颜色空间构造函数d3.rgb、d3.hsl、d3.lab、d3.hcl或d3.cubehelix。

现在可以解析rgba(…)。和HSLA(…)。CSS颜色说明符或使用d3.color的字符串“透明”。“透明”颜色被定义为具有零不透明度和未定义的红、绿、蓝通道的RGB颜色;这与将其定义为透明黑色的CSS略有不同,但对于简化颜色内插逻辑非常有用,其中起始颜色或结束颜色都具有未定义的通道。ToString方法现在同样返回一个rgb(…)。或rgba(…)。具有整数通道值的字符串,而不是十六进制RGB格式,与CSS计算值一致。当元素的开始样式与结束样式匹配时,这可以通过短路过渡来提高性能。

新的d3.color方法是解析颜色的主要方法:它在适当的颜色空间中返回d3.color实例,如果CSS颜色说明符无效,则返回NULL。例如:

变量红色=d3。Color(";hsl(0,80%,50%)";);//{h:0,l:0.5,s:0.8,不透明度:1}。

解析实现现在更加健壮。例如,您不能再在rgb(…)中混合使用整数和百分比。,并且它可以正确处理空格、小数点、数字符号和其他边缘情况。颜色空间构造器d3.rgb、d3.hsl、d3.lab、d3.hcl和d3.cubehelix现在总是返回转换到相应颜色空间的输入颜色的副本。虽然Color.rgb保持不变,但rgb.hsl已被删除;使用d3.hsl将颜色转换为RGB颜色空间。

RGB颜色空间在创建颜色时不再贪婪地量化和钳制通道值,从而提高了颜色空间转换的准确性。现在,在格式化要显示的颜色时,可以在color.toString中进行量化和钳制。您可以使用新颜色。可显示来测试颜色是否超出色域。

RGB.BIGHTER方法不再是特殊情况下的黑色。这是一个乘法运算符,定义了新颜色r‘,g’,b‘,其中r’=r×power(0.7,k),g‘=g×power(0.7,k)和b’=b×power(0.7,k);较亮的黑色仍然是黑色。

有一个新的d3.cubehelix配色空间,推广了dave Green的配色方案!(另请参见d3.interpolateCubehelixDefault from d3-Scale。)。您也可以继续定义您自己的自定义色彩空间;有关示例,请参阅d3-hsv。

现在,Dispatch对象不再使用每个事件类型来修饰Dispatch对象,而是公开了将类型字符串作为第一个参数的通用Dispatch.call和Dispatch.Apply方法。例如,在D3 3.x中,您可以说:

On方法现在接受多个类型名,允许您同时添加或删除多个事件的侦听器。例如,要将foo和bar事件发送到同一监听程序,请执行以下操作:

这与d3-select中selection.on的新行为相匹配。On方法现在验证说明符侦听器是一个函数,而不是在将来抛出错误。

新的实现d3调度速度更快,使用更少的闭包来提高性能。还有一种新的dispatch.copy方法,用于复制调度器;在转换中的所有元素都具有相同的转换事件侦听器的常见情况下,d3-Transition使用该方法来提高转换的性能。

拖动行为d3.behavior.Drag已重命名为d3.Drag。Drag.Origin方法已替换为drag.Subject,它允许您定义在拖动手势开始时拖动的对象。这对于Canvas特别有用,在Canvas中,可拖动对象通常共享一个Canvas元素(与SVG相反,在SVG中,可拖动对象通常具有不同的DOM元素);请参阅圆形拖动示例。

新的drag.tainer方法允许您覆盖定义拖动手势坐标系的父元素。这默认为应用拖动行为的元素的父节点。对于在画布元素上拖动,您可能希望使用画布元素作为容器。

拖动事件现在公开了一个event.on方法,用于在当前拖动手势的持续时间内注册临时侦听器;这些侦听器可以捕获当前手势(如正在拖动的对象)的状态。新的event.active属性允许您检测多个(多点触摸)拖动手势是否同时处于活动状态。DragStart和DragEnd事件已重命名为Start和End。默认情况下,拖动行为现在忽略用于上下文菜单的右键单击;使用drag.filter控制忽略哪些事件。拖动行为还会忽略iOS上的模拟鼠标事件。拖动行为现在使用已处理的事件,从而更容易与其他交互行为(如缩放)相结合。

新的d3.dragEnable和d3.dragDisable方法提供了一个低级API,用于跨浏览器和设备实现拖动手势。其他D3组件(如笔刷)也使用这些方法。

但是,用于加载相应格式文件的d3.csv和d3.tsv方法尚未重命名!这些都是在d3-request中定义的。不再有d3.dsv方法,它具有定义DSV格式化程序、DSV解析器和DSV请求器的三重功能;取而代之的是d3.dsvFormat,您可以。

.