绘制标准的d3图表
2015-03-25 20:20
176 查看
使用d3开发一年有余,我认为d3是一个可定制化程度高,但复用性差,开发流程却相对固定的库。在这对d3应用的标准流程做一个整理,希望对你有所帮助。
由于d3本身是基于svg,提供风格类似jquery的dom操作。所以在图形数目(dom节点)较多的情况下,存在严重的性能问题。相比canvas,svg的优缺点都是十分明显的。
先说优点:
1. SVG(Scalable Vector Graphics)是矢量图形
2. SVG会生成dom节点,便于用户进行交互
再说缺点:
1. 改变dom会导致浏览器重排重绘,效率低下
2. 暴露绘图数据
3. 仅支持ie9及以上浏览器
据说使用aight可以兼容ie8(没用过),r2d3通常是我的解决方案,可以在部分情况下兼容ie7。
使用d3库进行开发的大致流程如下:
1. 准备工作,创建页面,引入d3库
2. 加载数据
3. 创建比例尺
4. 创建SVG
5. 注入数据绘制图像,设置过度动画,绑定交互事件
6. 添加辅助信息(数轴、提示标签、气泡等)
因为d3在对数据遍历的同时创建图像这种机制,第5步的三个动作通常是同时添加。
本着喂饱的精神,提供以下资料:
d3官网:http://d3js.org/
api文档:https://github.com/mbostock/d3/wiki/Api-%E5%8F%82%E8%80%83
书籍推荐:《数据可视化实战:使用D3设计交互式图表》
我们先来看一个基本的d3程序:
关键的步骤我已经有写注释,这里稍作展开。
1. 加载数据,这里是直接写死在上面,通常会使用d3的加载函数。d3.csv、d3.tsv、d3.json。语法如下:
d3.json(url, callback)
- callback是可选项,由于是异步加载资源请注意
2. 创建比例尺,d3中的比例尺分为两种:线性比例尺d3.scale.linear和序数比例尺d3.scale.ordinal。这里用到的线性比例尺,需要设置domain和range。
domain是输入的值域,range是转换后的输出范围。在这里通常会用到两个常用函数,d3.max和d3.min。前者返回数组中的最大值,后者则返回最小值。
下面是非常常见的写法:
// 直接用最小值和最大值取值
domain(d3.min(array), d3.max(array))
// 输出要考虑留白和数轴的位置
range(d3.min(array) + padding, d3.max(array) - padding)
3. 创建svg
4. 绘制条形图,svg中常见的标准图形包括rect、circle、path、text、line和polygon
因为本人经常访问d3官网慢的出奇,所以这里没有使用d3官网的cdn。
效果如下:
![](http://images.cnitblog.com/blog2015/735867/201503/251843323802308.png)
相关源码可以访问我的github: https://github.com/luankefei/d3
由于d3本身是基于svg,提供风格类似jquery的dom操作。所以在图形数目(dom节点)较多的情况下,存在严重的性能问题。相比canvas,svg的优缺点都是十分明显的。
先说优点:
1. SVG(Scalable Vector Graphics)是矢量图形
2. SVG会生成dom节点,便于用户进行交互
再说缺点:
1. 改变dom会导致浏览器重排重绘,效率低下
2. 暴露绘图数据
3. 仅支持ie9及以上浏览器
据说使用aight可以兼容ie8(没用过),r2d3通常是我的解决方案,可以在部分情况下兼容ie7。
使用d3库进行开发的大致流程如下:
1. 准备工作,创建页面,引入d3库
2. 加载数据
3. 创建比例尺
4. 创建SVG
5. 注入数据绘制图像,设置过度动画,绑定交互事件
6. 添加辅助信息(数轴、提示标签、气泡等)
因为d3在对数据遍历的同时创建图像这种机制,第5步的三个动作通常是同时添加。
本着喂饱的精神,提供以下资料:
d3官网:http://d3js.org/
api文档:https://github.com/mbostock/d3/wiki/Api-%E5%8F%82%E8%80%83
书籍推荐:《数据可视化实战:使用D3设计交互式图表》
我们先来看一个基本的d3程序:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>基础条形图</title> </head> <body> <div id="chart"></div> <script src="js/d3.v3.min.js"></script> <script> drawLineBar('#chart') function drawLineBar(selector) { // 示例数据 var dataset = [ 5, 10, 15, 20, 30, 50 ] var width = 500, height = 500 // 创建线性比例尺 var scale = d3.scale.linear() .domain([0, d3.max(dataset)]) .range([0, height]) // 创建svg var svg = d3.select(selector) .append('svg') .attr('width', width) .attr('height', height) // 绘制条形图 svg.selectAll('rect') .data(dataset) .enter() .append('rect') .attr('width', '20px') .attr('height', function(d, i) { return scale(d) }) .attr('y', function(d, i) { return height - scale(d) }) .attr('x', function(d, i) { return i * (width / dataset.length) }) .attr('fill', '#457eb4') } </script> </body> </html>
关键的步骤我已经有写注释,这里稍作展开。
1. 加载数据,这里是直接写死在上面,通常会使用d3的加载函数。d3.csv、d3.tsv、d3.json。语法如下:
d3.json(url, callback)
- callback是可选项,由于是异步加载资源请注意
2. 创建比例尺,d3中的比例尺分为两种:线性比例尺d3.scale.linear和序数比例尺d3.scale.ordinal。这里用到的线性比例尺,需要设置domain和range。
domain是输入的值域,range是转换后的输出范围。在这里通常会用到两个常用函数,d3.max和d3.min。前者返回数组中的最大值,后者则返回最小值。
下面是非常常见的写法:
// 直接用最小值和最大值取值
domain(d3.min(array), d3.max(array))
// 输出要考虑留白和数轴的位置
range(d3.min(array) + padding, d3.max(array) - padding)
3. 创建svg
4. 绘制条形图,svg中常见的标准图形包括rect、circle、path、text、line和polygon
因为本人经常访问d3官网慢的出奇,所以这里没有使用d3官网的cdn。
效果如下:
![](http://images.cnitblog.com/blog2015/735867/201503/251843323802308.png)
相关源码可以访问我的github: https://github.com/luankefei/d3
相关文章推荐
- 可视化工具–D3–基础图表的绘制(line)
- Office2010新体验-基于Office Visio 2010 图表绘制新体验
- 【自定义控件系列四】android绘制实战(一)通过Canvas+Path+Paint组合绘制图表
- Python图表绘制:matplotlib绘图库入门
- BotVS开发基础—2.5 绘制图表
- Android高阶自定义ChartView,让你几分钟掌握绘制,折线图,曲线图,柱状图,柱线图,分分钟写图表框架
- Echarts助力大数据绘制可视化图表零基础入门-针对运维
- d3 在中国地图上绘制城市
- Python图表绘制:matplotlib绘图库入门
- [Android]Android 如何绘制图表
- iOS 统计图表绘制(UITableView、UIBezierPath)
- 图形的绘制,如何使用自定义画笔(颜色,线宽,线形)。如何为程序中添加选项菜单和选项设置对话框,如何使用标准颜色对话框,如何使用字体对话框,在选项对话框中实现预览功能。实现选项对话框和窗口类中的数据交换。如何改变对话框和控件的背景色,如何改变控件的文本颜色,
- android使用mpandroidchart绘制图表
- ApacheBench 测试性能并使用GnuPlot绘制图表
- Python应用科学计算和图表绘制
- Android实现图表绘制和展示
- 推荐13款JavaScript图形和图表绘制工具
- 第三方Charts绘制图表四种形式:饼状图,雷达图,柱状图,直线图
- Android实现图表绘制和展示
- 绘制功能丰富的图表控件Essential Diagram for WPF