d3js path generator vs layouts

我们知道d3的一般套路就是d3.selectAll(‘path.mypath‘).data(yourDataset).enter().append(‘path‘).attr(‘class‘,‘mypath‘).attr(‘d‘,thePathString)

而thePathString的获取,一般都是根据绑定的yourDataset来生成的。具体生成方式有:

1. 通过程序自己一节一节地拼凑起来path的d属性,比如在d3v4中由于取消了diagonal对角线生成器,我们可以通过下面的代码手工拼凑连接节点之间的link:

var link = svg.selectAll(".link")
    .data(root.descendants().slice(1))
  .enter().append("path")
    .attr("class", "link")
    .attr("d", function(d) {
      return "M" + d.y + "," + d.x
          + "C" + (d.y + d.parent.y) / 2 + "," + d.x
          + " " + (d.y + d.parent.y) / 2 + "," + d.parent.x
          + " " + d.parent.y + "," + d.parent.x;
    });

2. 通过d3.path()的相关命令API

const context = d3.path();
context.moveTo(50, 50);
context.lineTo(100, 50);
context.arc(100, 100, 50, -0.5 * Math.PI, 0);
context.lineTo(150, 150);
console.log(context.toString())
//输出 M50,50L100,50A50,50,0,0,1,150,100L150,150

3. 通过d3js built in path generator来创建

d3内置有以下path generator,都在d3-shape模块中可以找到: line, arc, pie,area,radialArea,stack, linkVertical,linkHorizontal(替代d3 v3中的diagonal),linkRadial,symbol

特别是第三种方法在常见的图表设计中非常常见,也很方便。但是虽然这种方法解放了我们拼凑d属性的烦恼,但是这些generator的data输入却有一定的要求。

比如arc()弧线生成器,它就要求输入data具有下面的数据结构:

var arcitemdata = {
 startAngle: 0, // 弧线的起始角度
 endAngle: Math.PI *0.6 // 弧线的结束角度
}

area()区域生成器,它就要求输入点data具有下面的数据结构(或者指定对应的accessor function来获取到对应的y0,y1数据):

var dataItemForArea =[
 {
 y0: 10, // y0为baseline的y轴值,一般所有的点y0值相等,也可以不等哦
 y1: 20, // y1为topline的y轴值
},
 {
 y0: 10,
 y1: 30,
},
 {
 y0: 10,
 y1: 25
}

而一般来说,我们有的数据是原始的数据,如何转换成方便被不同的路径生成器来使用的数据格式呢?当然你可以自己写一段程序一一映射,可以想象这,又是一个非常繁琐的过程。幸运的是d3也为我们考虑到了这些,它提供了被称为layout的函数,通过这些layout就能将原始的数据,转换为易于被可视化绘图所使用的数据(不一定非要用路径生成器来做可视化哦,很多情况下,你可以直接使用d3的select,data,enter,append,attr的模式来直接消费使用这些转换过来的数据!)

d3为一些复杂的图表分别内置了不同的layout函数。比如:

pie,Force, Chord, Tree, Cluster, Bundle, Pack, histogram generator(直方图),partition, Stack, Treemap,ribbon(d3-chord)(和弦图),geoPath(d3-geo),geoCircle,geoGraticule,axisTop,axisRight,axisBottom,axisLeft等。

比如说,我们给定一个数组,要求生成饼状图,这时我们想到的是首先将原始数据转换为arc元图所需数据数组,随后应用弧生成器来绘制。根据上面我们提到的,arc弧生成器需要一些startAngle, endAngle以及innerRadius,outerRadius来唯一描述一个弧段。这时,我们就可以应用arc layout来转换原始数据了!看下面的例子:

var data = [1, 1, 2, 3, 5, 8, 13, 21];
var arcsData = d3.pie()(data);
console.log(arcsData)
//[
//  {"data":  1, "value":  1, "index": 6, "startAngle": 6.050474740247008, //"endAngle": 6.166830023713296, "padAngle": 0},
//  {"data":  1, "value":  1, "index": 7, "startAngle": 6.166830023713296, //"endAngle": 6.283185307179584, "padAngle": 0},
//  {"data":  2, "value":  2, "index": 5, "startAngle": 5.817764173314431, //"endAngle": 6.050474740247008, "padAngle": 0},
//  {"data":  3, "value":  3, "index": 4, "startAngle": 5.468698322915565, //"endAngle": 5.817764173314431, "padAngle": 0},
//  {"data":  5, "value":  5, "index": 3, "startAngle": 4.886921905584122, //"endAngle": 5.468698322915565, "padAngle": 0},
// {"data":  8, "value":  8, "index": 2, "startAngle": 3.956079637853813, //"endAngle": 4.886921905584122, "padAngle": 0},
//  {"data": 13, "value": 13, "index": 1, "startAngle": 2.443460952792061, //"endAngle": 3.956079637853813, "padAngle": 0},
//  {"data": 21, "value": 21, "index": 0, "startAngle": 0.000000000000000, //"endAngle": 2.443460952792061, "padAngle": 0}
//]
// 接下来我们就可以使用arc generator了
var arcPath = d3.arc()
      arcPath.innerRadius = 0; // 内径为0,因此就是一个圆了,而不是扇形
      arcPath.outerRadius = 100; // 外径为100
svg.selectAll(‘path).data(arcsData).enter().append(‘path‘).attr(‘d‘,arcPath)

从上面这个pie图的例子中我们可以总结出来,在应用layout最终实现数据可视化时,也有章可循,分为三步:

1.  获取原始数据

2. 对原始数据调用对应的layout来转换数据(你也可以创作自己的layout函数哦!)

3. 使用路径生成器或者最原始的可视化pattern来使用第2.步骤转换来的中间数据!

时间: 2024-08-13 17:27:09

d3js path generator vs layouts的相关文章

d3js shape深入理解

本文将视图了解d3js提供的帮助我们创建矢量图形的helper函数,比如下面的: http://d3indepth.com/shapes/ lines curves pie chart segments symbols SVG 首先我们来认识一下SVG(scalable vector graphics).要知道上面例子中的图形实际上都是由SVG的path元素构成的.每张图都有不同的path元素来组成,这些path元素本身的d属性来定义图形的path.而path data由一系列的命令组成(比如:

SVG开发包, 20 个有用的 SVG 工具,提供更好的图像处理

20 个有用的 SVG 工具,提供更好的图像处理 SVG 现正在 Web 设计领域变得越发流行, 你可以使用 Illustrator 或者 Inkscape 来创建 SVG 图像. 但当进行 Web 设计时,我们还需要做一些优化来使得 SVG 变得更加轻量. 下面介绍的 20 个工具,可以帮助你快速有效的创建 SVG 图像.现有的在线工具已经可以帮助我们进行优化.转换.新建模式等工作. 更详细的介绍,参见:How To Create SVG Animation Using CSS 交互式 SVG

D3js-API介绍【英】

Everything in D3 is scoped under the d3 namespace. D3 uses semantic versioning. You can find the current version of D3 as d3.version. See one of: Behaviors - reusable interaction behaviors Core - selections, transitions, data, localization, colors, e

利用mybatis-generator生成po

import java.io.File; import java.util.ArrayList; import java.util.List; import org.mybatis.generator.api.MyBatisGenerator; import org.mybatis.generator.config.Configuration; import org.mybatis.generator.config.xml.ConfigurationParser; import org.myba

Promise 简介

Promise对象 Promise的含义 基本用法 Promise.prototype.then() Promise.prototype.catch() Promise.all() Promise.race() Promise.resolve() Promise.reject() 两个有用的附加方法 应用 async函数 Promise的含义 Promise是异步编程的一种解决方案,比传统的解决方案--回调函数和事件--更合理和更强大.它由社区最早提出和实现,ES6将其写进了语言标准,统一了用法

【D3 API 中文手册】提交记录

[D3 API 中文手册]提交记录 声明:本文仅供学习所用,未经作者允许严禁转载和演绎 <D3 API 中文手册>是D3官方API文档的中文翻译.始于2014-3-23日,基于VisualCrew小组的六次协作任务之上,目前已经大致翻译完毕,将陆续向官网提交D3 API 中文版. 本文主要内容有: 列举初版翻译/校对人员列表 记录中文翻译的官网提交情况 提供校对联系方式 提供D3 API简版翻译 翻译/校对人员列表 翻译人员列表 API项目 文档页数 单词数 翻译 校对 core.select

frontend learning site

CORS  http://caniuse.com/#search=cors Foundation http://foundation.zurb.com/docs/sass.html D3  http://d3js.org/ Generator https://github.com/yeoman/generator-webapp Angular  http://docs.ngnice.com/guide http://keithclark.co.uk/articles/loading-css-wi

关于promise的一些用法

Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果.从语法上说,Promise 是一个对象,从它可以获取异步操作的消息. Promise对象有以下两个特点. (1)对象的状态不受外界影响.Promise对象代表一个异步操作,有三种状态:pending(进行中).fulfilled(已成功)和rejected(已失败).只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态. (2)一旦状态改变,就不会再变.Promise对象的状

D3.js 线段生成器 (V3版本)

线段生成器 与线段生成器相关的方法: d3.svg.line() //创建一个线段生成器. line(data) //使用线段生成器绘制data数据. line.x([x]) //设置或获取线段x坐标的访问器,即使用什么数据作为线段的x坐标. line.y([y]) //同上.设置或获取y坐标的访问器. line.interpolate([interpolate]) //设置或获取线段的插值模式,共有13种. line.tension([tension]) //设置或获取张力系数,当插值模式为c