D3 学习笔记

D3简介

D3全称是Data-Driven Documents数据驱动文档,是一个开源的javascript库,可以用于数据可视化图形的创建,但不仅仅只是这些。可以查看d3帮助文档还有样例演示

安装D3

  1. 从github上面fork最新版本d3文件,地址在D3源文件

  2. 引用d3.js

    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="utf-8">
    <title>D3 Test</title>
    <script type="text/javascript" src="d3/d3.js"></script>
    </head>
    <body>
    <div>this is a test for d3</div>
    <script type="text/javascript">
    # we can write code in here...
    </script>
    </body>
    </html>
  3. 配置web服务器

    d3很多地方使用异步加载的方式,需要从后台服务器取回数据。我们可以采用apache服务器,或者采用python终端配置方案。二者都很简单实。采用python实现的话,只需要切换到项目所在的文件夹,然后再终端执行如下命令即可构建一个简单的web服务器进程。

    ptyhon -m SimpleHTTPServer 8888 &

    其中8888为指定端口,也可单独选择其他端口 末尾的&表示作为后台进程执行,终端关闭之后服务器进程而不会关闭。

  4. 显示数据

    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="utf-8">
    <title>D3 Test</title>
    <script type="text/javascript" src="d3/d3.js"></script>
    </head>
    <body>
    <div>this is a test for d3</div>
    <script type="text/javascript">
    var dataset; //声明全局变量
    // test for d3 select function
    d3.select("body")
    .append("p")
    .text("this is a append paragraph");
    // csv read and we will print the data to console
    d3.csv("test.csv",function(error,data){
    //callback function
    if(error){
    console.log(error);
    }else{
    dataset=data; //复制到全局变量
    console.log(data);
    }
    });
    //read json
    d3.json("testjson.json",function(json){
    console.log("hello");
    console.log(json);
    });
    </script>
    </body>
    </html>
  5. 控制台查看

数据绑定

上面我们会看到 d3.select("body").append("p").text("this is a append paragraph");这么一段,是d3的连缀方法,类似于设计模式中的责任链模式,将处理完后的工作交给责任链条中的下一个环节进行继续处理。

绑定数据:参考如下代码

var dataset=[1,8,5,62,1,23,454,22];
// test for d3 select function
d3.select("body")
.selectAll("div")
.data(dataset)
.enter()
.append("div")
.style("color",function(d){
if(d>5){
return "red";
}else{
return "black";
}
})
.text(function (d){
//匿名回调函数 对每个数据执行一次同样的方法 把数据返回给前台
return d;
});

具体研究d3责任链的过程,先是选择dom节点body,然后选择所有p标签,此时还没有这个标签,于是返回空元素,可以理解为马上创建这个段落(p标签),在然后的data(dataset)解析并取出数据值,此后的所有方法均会针对每个值执行一次,enter表示创建并绑定新的元素,相当于把数据绑定到了p标签上然后交给下一个方法进行处理,接下来就比较明白了。

关于匿名函数的问题,在d3的使用中遇到了很多的匿名函数,就是系统会自动返回一个对应的值给被调用的对象,这个对象接收到这个值之后可以进行相应的处理,比如上面的d参数,实际上是每个元素的值,绑定之后以这种方式返回并以匿名函数的方式显示到text中,另外针对多个值的变量,这里面维护了一个索引值i,我们可以通过这个i来定位当前操作的是哪一个元素。如下所示,其中的i为数组下标索引。

<script type="text/javascript">
var dataset=[1,3,5,7,9]
var w=960;
var h=325;
var svg=d3.select("body")
.append("svg")
.attr("width",w)
.attr("height",h);
var circles=svg.selectAll("circle")
.data(dataset)
.enter()
.append("circle");
circles.attr("cx",function(d,i){
return (i*125)+25;
})
.attr("cy",h/2)
.attr("r",function(d){
return d*6;
});
</script>

路径绘制

效果图

需要进行数据的处理,预处理成Geojson格式。

原始数据可以从Natural Earth下载.地图数据制作方法可以参照中国地图GeoJson制作方法

源代码(其中china.json在这里)

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>D3 Test fro SVG</title>
<script type="text/javascript" src="d3/d3.js"></script>
</head>
<body>
<script type="text/javascript"> var w=1000;
var h=1000; var svg=d3.select("body")
.append("svg")
.attr("width",w)
.attr("height",h); var projection = d3.geo.mercator()
.center([107, 31])
.scale(850)
.translate([w/2, h/2]); var path = d3.geo.path().projection(projection);
var color = d3.scale.category20();
d3.json("china.json",function(error,json){
if(error){
console.log(error);
}
svg.selectAll("path")
.data(json.features)
.enter()
.append("path")
.attr("d",path)
.attr("stroke","#000")
.attr("stroke-width",1)
.attr("fill", function(d,i){
return color(i);
})
.on("mouseover",function(d,i){
d3.select(this)
.attr("fill","yellow");
})
.on("mouseout",function(d,i){
d3.select(this)
.attr("fill",color(i));
}); //console.log(json);
});
console.log("hello json");
</script>
</body>
</html>

经纬度映射

接下来要做的就是如何将经纬度数据映射到地图中,并按照时间的先后顺序链接这些点形成路径,为车辆路径分析做辅助分析使用。。。

参考资料

D3 学习的更多相关文章

  1. D3学习笔记一

    D3学习笔记一 什么是D3? D3(全称Data Driven Documents)是一个用来做Web数据可视化的JavaScript函数库.D3也称之为D3.js. D3是2011年由Mike Bo ...

  2. D3学习之地图

    D3学习之地图 (2017.03.09-03.11) 地图的意义 在可视化领域中,将数据点投影和关联到地理区域上,是一个非常关键的内容(体现了可视化中利用读者自身知识常识从而加速吸收信息的原则). G ...

  3. D3学习之动画和变换

    D3学习之动画和变换 ##(17.02.27-02.28) 主要学习到了D3对动画和缓动函数的一些应用,结合前面的选择器.监听事件.自定义插值器等,拓展了动画的效果和样式. 主要内容 单元素动画 多元 ...

  4. d3学习之路

    d3学习历程: 轻量化编译器:HbuiderXHbuiderX使用教程   理解HTMl js CSS 三者关系   学习html js css :1)w3school           2)moo ...

  5. 【D3】D3学习轨迹-----学习到一定层度了再更新

    1.  首先了解SVG的基本元素 http://www.w3school.com.cn/svg/ 2.  了解d3的专有名词  http://www.cnblogs.com/huxiaoyun90/p ...

  6. D3学习之:D3.js中的12中地图投影方式

    特别感谢:1.[张天旭]的D3API汉化说明.已被引用到官方站点: 2.[馒头华华]提供的ourd3js.com上提供的学习系列教程,让我们这些新人起码有了一个方向. 不得不说,学习国外的新技术真的是 ...

  7. D3学习之画布制作

    最近大半个月都和d3斗争,学习艰辛(呜呜……)如果觉得作者写的对你有用,可以打赏作者哦!owo 起言:结合自己的学习之路,我认为要想使用d3画图搞清楚布局很重要,层次分明,就给了你很大的灵活性,写起代 ...

  8. D3学习教程

    [ D3.js 入门系列 ] 入门总结 | OUR D3.JS http://www.ourd3js.com/wordpress/?p=396

  9. D3学习之坐标系绘制

    坐标轴的绘制我们需要搞清楚以下三个要点: 1).axis函数 2)..call()函数用于组合 3).坐标轴的平移旋转 关于第三点其实就是"transform","tra ...

随机推荐

  1. Redis源码分析-底层数据结构盘点

    前段时间翻看了Redis的源代码(C语言版本,Git地址:https://github.com/antirez/redis), 过了一遍Redis数据结构,包括SDS.ADList.dict.ints ...

  2. PAT L2-006【二叉树中序后序构造树】

    #include<bits/stdc++.h> using namespace std; typedef long long LL; struct BT{ int w; BT *L; BT ...

  3. java 提取(解压)rar文件中特定后缀的文件并保存到指定目录

    内容简介 本文主要介绍使用junrar来提取rar压缩文件中特定后缀(如:png,jpg)的文件并保存到指定目录下. 支持v4及以下版本压缩文件,不支持v5及以上. 在rar文件上右键,查看属性,在压 ...

  4. C#中参数值传递和址传递

    概论 我认为的形参和实参是这样的,形参是形式上的参量,和"抽象类"的概念差不多,不是实际存在的.不用的时候不占用内存,被调用的时候分配内存,调用结束,释放内存.类似于"抽 ...

  5. CF 980D Perfect Groups(数论)

    CF 980D Perfect Groups(数论) 一个数组a的子序列划分仅当这样是合法的:每个划分中的任意两个数乘积是完全平方数.定义a的权值为a的最小子序列划分个数.现在给出一个数组b,问权值为 ...

  6. uva 1608 不无聊的序列

    uva 1608 不无聊的序列 紫书上有这样一道题: 如果一个序列的任意连续子序列中都至少有一个只出现一次的元素,则称这个序列时不无聊的.输入一个n个元素的序列,判断它是不是无聊的序列.n<=2 ...

  7. 浅析localstorage、sessionstorage

    原文链接:http://caibaojian.com/localstorage-sessionstorage.html 简介 html5 中的 web Storage 包括了两种存储方式:sessio ...

  8. SKlearn中分类决策树的重要参数详解

    学习机器学习童鞋们应该都知道决策树是一个非常好用的算法,因为它的运算速度快,准确性高,方便理解,可以处理连续或种类的字段,并且适合高维的数据而被人们喜爱,而Sklearn也是学习Python实现机器学 ...

  9. 打造H5动感影集的爱恨情仇–动画性能篇

    “你听说过动感影集么?” 动感影集是QQ空间新功能,可以将静态的图片轻松转变为动态的视频集,且载体是HTML5(简称H5)页面,意味着可以随时分享到空间或朋友圈给好友欣赏! 移动端区别于PC年代的相册 ...

  10. Linux重新挂载磁盘

    Linux下磁盘和目录的概念与WIN不同:比如,分了一个系统分区默认挂载了根(/)目录,根下还有其它目录,比如/user /lib等.如果系统分区不够用,可以再分出分支,把根下其它目录分别挂载出来,例 ...