经过以前的学习实践了一阵子d3,可是不少效果实现都是照着demo改改下来的,没有本身一套完整的步骤。在通过更多地了解与学习以后,终于略知一二,其中最大关系的就是d3的布局(layout)。css
d3的绘图步骤相比Echarts等开箱即用
的框架复杂得多,这里拿来一张很棒的图(来源为十二月咖啡馆
,连接于文末)html
那么d3中什么是布局呢?跟CSS同样吗????
还有咱们以前的柱状图怎么就不须要这玩意了?——>由于图形太简单。
回到正题,这里我参考了三个不一样地方出处的理解:git
十二月咖啡馆:布局的做用是:将不适合用于绘图的数据转换成了适合用于绘图的数据。github
d3官方文档: Layout functions sets up and modifies data so that it can be rendered in different shapes. The layout functions don't do the drawing of the shapes.算法
Visualization on the Web Tutorials:Layouts make it
easier
to spatially arrange, shape and size elements representing data on the screen.数组
同时在实践以后,我添油加醋地给出了本身的理解:app
布局(layout)是一个函数,将要可视化的数据data放入布局函数中,通过算法处理,返回
方便
d3绘图的数据。同时,布局函数并不直接参与绘图,只是告诉你绘图所用的关键信息
框架
这么说可能仍是有点晦涩,接下来我以一个demo说明less
此demo学习了Visualization on the Web Tutorials的例子,连接置于文末,可是文中一个地方对d3函数链式返回理解有误。svg
。没什么好说的,可是仍是写在步骤里
<body>
<svg class="pie-svg"></svg>
</body>
复制代码
也没什么好说的,注意的一点就是svg的transform与css的有不一样
看看假设的数据data
,立刻用到
/** * 假设数据 */
const data = [
{
name: 'A',
percentage: 30
},
{
name: 'B',
percentage: 20
},
{
name: 'C',
percentage: 30
},
{
name: 'D',
percentage: 20
}
];
/** * 基础数值 */
const width = 800,
height = 500,
radius = Math.min(width, height)/2 - 10;
console.log(radius);
/** * 插入g容器 */
const g = d3.select('.pie-svg')
.attr('width', width)
.attr('height', height)
.append('g')
.attr('transform', `translate(${width/2}, ${height/2})`);//图形左上角相对画布偏移
复制代码
这里就是重点了!经过layout生成方便绘图的数据,先看代码👇
/** * 定义layout generator(怎么翻译??布局发生器??),此例中即为变量pie */
const pie = d3.pie();
//告诉layout generator怎么处理要可视化的数据
pie.value(function(d){
return d.percentage;
});
//多数文章将布局理解为用于数据转换,我我的添油加醋一番认为以下:
//原数据 ————> layout generator ————> 便于可视化布局的数据
const pieData = pie(data);
console.log('pieData:', pieData);//原数据于pieData[i].data之中
复制代码
截图pieData瞧瞧布局函数干了什么
layout给了咱们绘图的关键信息
,arc generator就是利用这些关键信息的工具
。
arc generator可利用startAngle,endAngle这些属性绘制path元素的d属性来描绘路径。
/** * 建立arc generator(此例中即为变量arc),经过pieData,生成path的d属性 * 上述原理:arc经过pieData数组中每一个元素对象的startAngle,endAngle进行计算(outerRadius与innerRadius在此例中设置了统一) * 流程图以下: * pieData[i]————>arc————>path元素d属性 * 具体请看文档:https://github.com/d3/d3-shape/blob/v1.3.4/README.md#arc */
const arc = d3.arc();
arc.outerRadius(radius);
arc.innerRadius(0);
console.log(`举例:生成path的d属性:\n`,arc(pieData[0]));
复制代码
瞧瞧控制台
最直观的绘图数据
了!下一步就是直接往“画布”上扔就能够了
/** * 如今有了处理后的数据(pieData)和生成path的arc generator(arc) * 能够开始画图了! */
//绑定数据,在g容器中插入g
const groups = g.selectAll('g').data(pieData)
.enter()
.append('g');
//画path
groups.append('path')
.attr('d', arc)//将pieData[i]传予arc
.style('fill', d=>color(d.data.name));
//画text
groups.append('text')
.text(d=>d.data.name)
.attr('transform', d=>`translate(${arc.centroid(d)})`) //计算path的中心位置
.attr('dy', '.35em')
.style('text-anchor', 'middle')
.style('font-size', '20px');
复制代码
最后完成
此demo只是最为简单的一个例子,但让人对布局(layout)有了大体的了解。
致于d3的绘图步骤,我在十二月咖啡馆
的图的基础上再次总结了一番:
Visualization on the Web Tutorials——Advanced D3: Layouts
十二月咖啡馆——布局
GitHub——D3 Layouts
d3.pie()
d3.arc()