Zhihao's Studio.

数据可视化之散点图

Word count: 492 / Reading time: 2 min
2014/11/15 Share

D3.js是当下最火的可视化库之一,这篇博客记录了如何实现一个最基本的散点图,并用三角形表示数据点。

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
\<!DOCTYPE html\>
\<html\>
\<head lang="en"\>
\<meta charset="UTF-8"\>
\<title\>\</title\>
\<script type="text/javascript" src="script/d3.v3.js"\> \</script\>
\</head\>
\<style\>
body {
font: 10px sans-serif;
}
.axis path,
.axis line {
fill: none;
stroke: #000;
shape-rendering: crispEdges;
}
.point {
fill: steelblue;
stroke: #000;
}
\</style\>
\<body\>
\<script\>
var margin = {top:20,right:20,bottom:30,left:40},
width = 960-margin.left-margin.right,
height = 500-margin.top-margin.bottom;
var x = d3.scale.linear().range([0,width]());
var y = d3.scale.linear().range([height,0]());
var svg = d3.select('body').append('svg').attr('width',width+margin.left+margin.right)
.attr('height',height+margin.top+margin.bottom)
.append('g')
.attr('transform',"translate("+margin.left+","+margin.top+')');
d3.csv('tmp.csv',function(error,data){
if(error) throw error;
data.forEach(function(d){
d.x=+d.x;
d.y=+d.y;
})
// console.log(data);
x.domain(d3.extent(data,function(d){return d.x})).nice();
y.domain(d3.extent(data,function(d){return d.y})).nice();
svg.append('g')
.attr('class','x axis')
.attr('transform','translate(0,'+height+")")
.call(d3.svg.axis().scale(x).orient('bottom'));
svg.append('g')
.attr('class','y axis')
.call(d3.svg.axis().scale(y).orient('left'));
svg.selectAll('.point')
.data(data).enter()
.append('path')
.attr('class','point')
.attr('d',d3.svg.symbol().type('triangle-up'))
.attr('transform',function(d){return "translate("+x(d.x)+","+y(d.y)+")"});
})
\</script\>
\</body\>
\</html\>

代码本身是很基本的,不过代码里面有一些可以学习的好习惯,比如:

  1. 使用var margin = {top:20,right:20,bottom:30,left:40}变量来表示距离上下左右的距离,这样统一管理,只有一个变量。

  2. data.forEach(function(d){
    d.x=+d.x;
    d.y=+d.y;
    })
    使用这种方式直接转换成数值型的变量,免去了使用其他函数的麻烦。

  3. .nice()函数的使用,可以适当扩大extent的范围,这样最大最小值在坐标轴上看起来不会在极端的位置上。
  4. .attr(‘d’,d3.svg.symbol().type(‘triangle-up’)) 使用不局限于circle的图形来表示一个点
  5. svg.append(‘g’).attr(‘class’,’y axis’).call(d3.svg.axis().scale(y).orient(‘left’));
    一句话里指定要绘制坐标轴需要的所有东西。
CATALOG