【d3.js实践教程01】d3基本操作

学习d3.js(以下都简称d3)也有一段时间了,运行d3做了几个项目。我发现中文的d3教程很少,国外资料多但要求有一定的英文阅读能力(推荐网址:http://bl.ocks.org/mbostock),于是就萌发了写一个d3实际运用系列文章的想法,现在开始付之行动。在系列中,我会用d3+html5 canvas实现一些实际效果(如统计结果展示,地图数据展示等),希望可以跟大家共同学习交流。

代码我公布在git.cschina.com上,大家可以clone到本地运行,地址是:http://git.oschina.net/0604hx/d3lesson

运行环境是java 7+,tomcat 7.0.47+(以后会用到websocket,所以需要javaee7 跟 tomcat 7+的支持),IDE 是IntelliJ IDEA 13, 项目的视图使用了freemarker。

这一章的示例代码主要介绍了d3.js的基本使用,如选择元素,动态修改元素属性、样式,为元素添加动画、鼠标事件监听。

示例中包含了d3.js对html元素(div,p,span这些)的操作(增删改),也包含了对svg元素(circle 圆,rect 矩形,line 线条等)的操作。

这里重点说一下d3中的data函数,如下:

//创建一个长度为10的整形数组, 得到的是: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
var data = d3.range(10);
//然后可以利用这个数组,创建10个对应的div元素,数组中的每个对象对应一个div
//这里选取的是class=test的div(好跟其他的div区别开来),在一开始调用selectAll('div.test')得到的其实是一个空集合
//接着调用data方法,就会根据传入对象的长度,创建相应长度的集合(这时集合里面元素都是空的,是给之后的div预留的空位置)
//再接着调用enter()方法,就是进入具体的集合元素里面,这时可以用append()、insert()这些方法创建html元素
//创建好div后,就可以给这个div属性赋值了
//在这里,我给div设置了class属性,接着往div中加入了文字。可以看到每个div就对应了上一步创建的数据中的一个元素,可以使用数据元素的数据了
d3.selectAll("div.test")
    .data(data)
    .enter()
    .append("div")
    .attr("class","test")
    .html(function(d){
        return d;
    })
    ;

将从git中导出的项目部署到tomcat中,在浏览器可以看到如下首页

截图中有3个页面链接:

页面1  使用d3操作div元素,点击屏幕可以刷div的位置

页面2  效果同上,只是将div元素换成了svg的rect

页面3  介绍了d3对svg基本元素的操作,也包括data(),enter(),exit() 函数的使用

页面3的截图如下

附上核心代码:

/**
     * 根据cmd命令在执行任务
     */
    function work(cmd){
        cmd = cmd ||'';
        //随机画一个圆形
        if(cmd=='circle'){
            var c = g.append("circle")
                            .attr("class", "child")
                            .attr("cx", random(width))
                            .attr("cy", random(height))
                            .attr("r", random(100) + 20)
                            .attr("fill", colors(count))
            ;
            count ++;
        }
        else if(cmd=='rect'){
            var w = random(100)+20;
            var r = g.append("rect")
                            .attr("class", "child")
                            .attr("x", random(width))
                            .attr("y", random(height))
                            .attr("width", w)
                            .attr('height', w)
                            .attr("fill", colors(count))
                    ;
            count ++ ;
        }
        //随机线条
        else if(cmd=='line'){
            var l= g.append("line")
                            .attr("class", "child")
                            .attr("x1", random(width))
                            .attr("y1", random(height))
                            .attr("x2", random(width))
                            .attr("y2", random(height))
                            .attr("stroke", colors(count))
            ;
            count ++;
        }
        //清除最近添加的元素
        else if(cmd=='clear'){
                lastest.attr("opacity", 1)
                        .transition()
                        .duration(duration)
                        .attr("opacity", 0)
                        .each("end", function(){
                            d3.select(this)
                                    .remove();
                        })
            ;
        }
        //清空全部的元素
        else if(cmd=='clearAll'){
            g.selectAll(".child")
                    .attr("opacity", 1)
                    .transition()
                    .duration(duration)
                    .delay(function(d,i){
                        return 50*i;
                    })
                    .attr("opacity", 0)
                    .each("end", function(){
                        d3.select(this)
                                .remove();
                    })
        }
    }

完整代码见:http://git.oschina.net/0604hx/d3lesson/blob/master/web/WEB-INF/templates/chapter01/svg2.ftl

时间: 2024-11-09 14:14:32

【d3.js实践教程01】d3基本操作的相关文章

【d3.js实践教程特别篇】PornHub发布基于d3的网民观看成人视频时长分布交互式地图

学习d3.js(以下都简称d3)也有一段时间了,运行d3做了几个项目.我发现中文的d3教程很少,国外资料多但要求有一定的英文阅读能力(推荐网址:http://bl.ocks.org/mbostock),于是就萌发了写一个d3实际运用系列文章的想法,现在开始付之行动.在系列中,我会用d3+html5 canvas实现一些实际效果(如统计结果展示,地图数据展示等),希望可以跟大家共同学习交流. 代码我公布在git.cschina.com上,大家可以clone到本地运行,地址是:http://git.

【d3.js实践教程02】基于中国地图的高考一本录取率排行

学习d3.js(以下都简称d3)也有一段时间了,运行d3做了几个项目.我发现中文的d3教程很少,国外资料多但要求有一定的英文阅读能力(推荐网址:http://bl.ocks.org/mbostock),于是就萌发了写一个d3实际运用系列文章的想法,现在开始付之行动.在系列中,我会用d3+html5 canvas实现一些实际效果(如统计结果展示,地图数据展示等),希望可以跟大家共同学习交流. 代码我公布在git.cschina.com上,大家可以clone到本地运行,地址是:http://git.

vue.js初级教程--01.简介

Vue特点 渐进式框架 采用自底向上增量开发的设计 核心库只关注视图层 轻量级 22kb min+gzip 高性能 渲染性能:支持条件.循环.服务端渲染方式 更新性能:数据驱动.响应式 特性 数据驱动,支持双向数据绑定,异步批量DOM更新 组件化,支持组件独立.组件复用以及异步加载 模块化,模板.数据.外数据.方法.生命周期函数.样式 指令,支持内置指令和自定义指令 虚拟DOM 为什么需要虚拟DOM DOM是很慢的,其元素非常庞大,页面的性能问题鲜有由JS引起的,大部分都是由DOM操作引起的.如

Learning D3.js d3的path讲解

转帖: http://jsbin.com/omajal/23/edit?html,output svg的path标签被称为”可以组成任何形状的形状” SVG Path可以绘制任何形状的图形,包括矩形,圆形,椭圆,折线,多边形,直线,曲线等.W3 标准对SVG 的Path定义如下SVG路径代表一个形状的轮廓,可以描边,填充,用作剪切路径,或任何三者的结合.W3提供了一个形象的比喻,用钢笔和纸来表示svg的path* 想象一个钢笔放在一张纸上.* 钢笔在某点与纸接触.* 笔尖移动到另一处.* 这两个

【 D3.js 进阶系列 — 1.0 】 CSV 表格文件的读取

在入门系列的教程中,我们常用 d3.json() 函数来读取 json 格式的文件.json 格式很强大,但对于普通用户可能不太适合,普通用户更喜欢的是用 Microsoft Excel 或 OpenOffice Calc 等生成的表格文件,因为简单易懂,容易编辑.                       Microsoft Excel 通常会保存为 xls 格式, OpenOffice Calc 通常会保存为 ods 格式.这些格式作为表格文件来说都很强大,但要读取它们是有些麻烦的,D3

d3.js画图

论文需要用到美观的图,因此打算用d3.js呈现. 下载d3.zip,并解压到网页文件所在的文件夹 windows下,在命令行进入网页文件夹,输入 python -m http.server 在浏览器中输入127.0.0.1:8000/xxx.html 示例如下,html文件和data存在同一个目录下 https://bl.ocks.org/mbostock/3884955

d3.js初识

d3.js简单的入门 D3是一个JavaScript的框架:主要用途是数据的可视化, 所以他是在JavaScript下开发的,目前主要用的有D3.js 3.0版本和D3.js 4.0版本 使用方法非常简单,1.到官网下载d3.js,然后在html中添加就好了 . 2.或者直接链接到官网就行了. 它只能目前用于IE 8版本之上. 1.一些简单的操作 d3.select  //选择元素 d3.selectAll  //选择所有元素 d3.attr //修改属性 d3.append //添加元素 d3

怎么学习d3.js

vue是一个数据驱动视图的前端框架,一切皆可作为可重用的组件加以使用 d3则是数据可视化javascript库 D3.js基础 1.学习D3.js的语法 语法是必需的,建议自行去官网上学习其语法,如果可以的话最好了解一下函数式编程的curry与compose思想,不建议一开始就去接触高大上的众多在线Demo. 2.学习D3.js的编程思路 (1)语法其实可以体现其编程思路,起步当然是学习其强大的选择器: d3.select('body').style('background-color', 'b

D3.js的v5版本入门教程(第七章)—— 比例尺的使用

D3.js的v5版本入门教程(第七章) 比例尺在D3.js中是一个很重要的东西,我们可以这样理解d3.js中的比例尺——一种映射关系,从domain映射到range域(为什么会是domain和range呢?等一下你就会看到,因为我们在建立比例尺是常常会用到domain()和range()两个函数,当然不是绝对的,D3中有很多类型的比例尺) 下面介绍在本套教程中常用的两种比例尺 线性比例尺序数比例尺        线性比例尺 domain域和range域都可以连续变化 <body> <sc