企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
本章要绘制散列图,需要用到线性比例尺和平方根比例尺。线性比例尺已在上面介绍过,下面介绍平方根比例尺。 ## 平方根比例尺 平方根比例尺与线下比例尺的使用方法一样。输入和输出的头尾也相互对应,但是中间的映射过程并不是线性的,二是符合平方根变化。 ~~~ let scale = d3.scaleSqrt().domain([1,100]).range([0,10]) //scale(50) = 6.74563090207275 ~~~ 散点图是在两个不同坐标轴(水平轴和竖直轴)上表现两组对应值的常见图表。 ``` var dataset = [[1, 1], [2, 3], [5, 8], [13, 21], [34, 55]]; var w = 500; var h = 200; var padding = 3; //两个柱形之间的缝隙 var x_width = (w - padding * dataset.length) / dataset.length; // 横坐标的宽度 var yScale = d3.scaleLinear() //线性比例尺 .domain([0, d3.max(dataset, d=>d[1])]) //值域的范围 .range([0, h]); //映射到可视的区域 var rScale = d3.scaleSqrt() //平方根比例尺 .domain([0, d3.max(dataset, d=>d[1])]) .range([0, 20]); var data = [0.243, 0.584, 0.987, 0.153, 0.433]; var extent = d3.extent(data); d3.select('body').append('svg') .attr('width', w).attr('height', h) .selectAll('circle').data(dataset).enter().append('circle') .attr('cx', (d, i) => i * (x_width + padding)) //圆心的x .attr('cy', d => h - yScale(d[1])) //圆心的y,注意坐标0点在左上角 .attr('r', d => rScale(d[1])) //取y的平方根作为半径 .attr('fill', 'teal') ``` 效果如下。之所以用到平方根比例尺,是因为我们把数据看成是面积,我们想返回半径大小。而面积和半径大小就是平方根关系,至于还有一个系数`pi`,那个并不影响视觉。好像有的圆离开可视区域,我们下一章解决这个问题,让你更深刻的理解可视区域。后面还会谈到分组平移的思想,也解决这个问题。 ![](https://img.kancloud.cn/8c/68/8c68848ab3750676e55c749cf1610881_423x207.png)