D3基础--数轴

转载请注明出处!

概述:

与比例尺类似,D3的数轴实际上也使用来定义参数的函数。但与比例尺不同的是,调用数轴函数并不会返回值,而是会生成数轴相关的可见元素。包括:轴线,标签和刻度。

但是要注意数轴函数只适应于SVG图形,因为他们生成的都是SVG元素,同样,数轴是设计与定量比例尺(与序数比例尺相对)配合使用的。

定义和创建X轴:

 1 //定义x轴
 2
 3 var xAxis = d3.svg.axis()
 4                   .scale(xScale)
 5                   .orient("bottom");
 6
 7
 8 //创建x轴
 9
10 svg.append("g")
11       .call(xAxis);

上面的代码首先引用了svg,然后append()在这个元素的末尾追加了一个新的g元素。在SVG标签中,g元素是一个分组元素。分组元素是不可见的,跟line,rect和circle不一样,但是他有两大用途:

一是可以用来包含(或组织)其他元素,好让代码看起来整齐;

二是可以对整个分组应用变换,从而影响到该分组中所有元素(line,rect和circle)的视觉表现。

创建了新的g元素后,我们直接在这个元素上调用了call()方法,call()的作用如下:

D3的call()方法回去的传递过来的元素,然后把它交给其他函数,对我们这而言,传递过来的元素是新的分组元素g(虽然这个元素不是必须的,但是鉴于数轴函数需要生成很多线条和数值,有了它可以把所有的元素都封装到一个分组对象中)。而call()接着把g元素交给xAxis函数,也就是要在g元素中生成数轴。

效果图:

修整数轴:

首先给新创建的g元素添加一个axis类,然后为他添加CSS样式:

1 svg.append("g")
2
3 .attr(“class”, “axis”)
4
5 .call(xAxis);
 1 .axis path,
 2
 3 .axis line {
 4
 5     fill: none;
 6
 7     stroke: black;
 8
 9     shape-rendering: crispEdges;
10
11 }
12
13
14
15 .axis text {
16
17     font-family: sans-serif;
18
19     font-size: 11px;
20
21 }

现在就体现出把所有数轴元素组织到一个分组g中的好处了,只要使用简单的CSS选择符.axis就能为其中的任何元素添加样式。数周本身是由path,line和text元素组成的,因此上面的css样式瞄准这三个元素。注意,上面通过css对SVG元素使用样式的时候,只能使用SVG认识的属性名。(SVG的属性可以参照MDN网站)。

调整坐标位置到图表下面:

1 svg.append("g")
2     .attr("class", "axis")
3     .attr("transform", "translate(0," + (h - padding) + ")")
4     .call(xAxis);

通过设置g元素的属性transform。SVG的变换功能非常强大这儿先介绍平移(transform)变换。他可以把整个g分组向下平移一段距离。

平移变换的语法很简单,就是translate(x, y),x,y就是把元素移动到新位置的x和y坐标。可以在浏览器中查看DOM元素g。

效果图:

优化刻度:

数轴上的刻度线(ticks)使用来传达信息的,也不是越多越好。可以用ticks()方法粗略的指定刻度线的数量。注意,D3只是把ticks的值当做一个参考,如果发现有更清晰方便理解的值,那么他就会舍弃ticks的值。

1 var xAxis = d3.svg.axis()
2                   .scale(xScale)
3                   .orient("bottom")
4                   .ticks(5);  //粗略的设置刻度线的数量

垂直数轴:

1 var yAxis = d3.svg.axis()
2                   .scale(yScale)
3                   .orient("left")
4                   .ticks(5);

同样设置起始坐标:

1 //Create Y axis
2 svg.append("g")
3     .attr("class", "axis")
4     .attr("transform", "translate(" + padding + ",0)")
5     .call(yAxis);

效果图:

最终代码:

  1 <!DOCTYPE html>
  2
  3 <html lang="en">
  4
  5          <head>
  6
  7                    <title>D3: Test of formatted axis values</title>
  8
  9                    <script type="text/javascript" src="../d3/d3.js"></script>
 10
 11                    <style type="text/css">
 12                             .axis path,
 16
 17                             .axis line {
 18
 19                                      fill: none;
 20
 21                                      stroke: black;
 22
 23                                      shape-rendering: crispEdges;
 24
 25                             }
 26                            .axis text {
 30
 31                                      font-family: sans-serif;
 32
 33                                      font-size: 11px;
 34
 35                             }
 39                    </style>
 40
 41          </head>
 42
 43          <body>
 44
 45                    <script type="text/javascript">

 49                             //Width and height
 50
 51                             var w = 500;
 52
 53                             var h = 300;
 54
 55                             var padding = 30;
 56
 59                             /*
 60
 61                             //Static dataset
 62
 63                             var dataset = [
 64
 65                                                                  [5, 20], [480, 90], [250, 50], [100, 33], [330, 95],
 66
 67                                                                  [410, 12], [475, 44], [25, 67], [85, 21], [220, 88],
 68
 69                                                                  [600, 150]
 70
 71                                                           ];
 72
 73                             */
 74
 77                             //动态随机生成数据集
 78
 79                             var dataset = [];                                             //Initialize empty array
 80
 81                             var numDataPoints = 50;                                     //Number of dummy data points to create
 82
 83                             var xRange = Math.random() * 1000;     //Max range of new x values
 84
 85                             var yRange = Math.random() * 1000;     //Max range of new y values
 86
 87                             for (var i = 0; i < numDataPoints; i++) {       //Loop numDataPoints times
 88
 89                                      var newNumber1 = Math.floor(Math.random() * xRange);   //New random integer
 90
 91                                      var newNumber2 = Math.floor(Math.random() * yRange);   //New random integer
 92
 93                                      dataset.push([newNumber1, newNumber2]);    //Add new number to array
 94
 95                             }
 96
 99                             //Create scale functions
100
101                             var xScale = d3.scale.linear()
102
103                                                     .domain([0, d3.max(dataset, function(d) { return d[0]; })])
104
105                                                       .range([padding, w - padding * 2]);
106
107
108
109                             var yScale = d3.scale.linear()
110
111                                                  .domain([0, d3.max(dataset, function(d) { return d[1]; })])
112
113                                                  .range([h - padding, padding]);
114
115
116
117                             var rScale = d3.scale.linear()
118
119                                                   .domain([0, d3.max(dataset, function(d) { return d[1]; })])
120
121                                                   .range([2, 5]);
122
123                             //为刻度标签定义样式(这个例子只是做说明并无太大实际意义)
124
125                             var formatAsPercentage = d3.format(".1%");
126
127
128
129                             //Define X axis
130
131                             var xAxis = d3.svg.axis()
132
133                                                 .scale(xScale)
134
135                                                 .orient("bottom")
136
137                                                 .ticks(5)
138
139                                                 .tickFormat(formatAsPercentage);
140
143                             //Define Y axis
144
145                             var yAxis = d3.svg.axis()
146
147                                                .scale(yScale)
148
149                                                .orient("left")
150
151                                                .ticks(5)
152
153                                                //对数轴刻度应用定义的格式化函数(观察坐标轴)
154
155                                                .tickFormat(formatAsPercentage);
156
157
158
159                             //Create SVG element
160
161                             var svg = d3.select("body")
162
163                                          .append("svg")
164
165                                          .attr("width", w)
166
167                                          .attr("height", h);
168
169
170
171                             //Create circles
172
173                             svg.selectAll("circle")
174
175                                .data(dataset)
176
177                                .enter()
178
179                                .append("circle")
180
181                                .attr("cx", function(d) {
182
183                                            return xScale(d[0]);
184
185                                })
186
187                                .attr("cy", function(d) {
188
189                                            return yScale(d[1]);
190
191                                })
192
193                                .attr("r", function(d) {
194
195                                            return rScale(d[1]);
196
197                                });
198
199
200
201                             /*注释掉各点旁边的标签
202
203                             //Create labels
204
205                             svg.selectAll("text")
206
207                                .data(dataset)
208
209                                .enter()
210
211                                .append("text")
212
213                                .text(function(d) {
214
215                                            return d[0] + "," + d[1];
216
217                                })
218
219                                .attr("x", function(d) {
220
221                                            return xScale(d[0]);
222
223                                })
224
225                                .attr("y", function(d) {
226
227                                            return yScale(d[1]);
228
229                                })
230
231                                .attr("font-family", "sans-serif")
232
233                                .attr("font-size", "11px")
234
235                                .attr("fill", "red");
236
237                           */
238
241                             //Create X axis
242
243                             svg.append("g")
244
245                                      .attr("class", "axis")
246
247                                      .attr("transform", "translate(0," + (h - padding) + ")")
248
249                                      .call(xAxis);
250
251
252
253                             //Create Y axis
254
255                             svg.append("g")
256
257                                      .attr("class", "axis")
258
259                                      .attr("transform", "translate(" + padding + ",0)")
260
261                                      .call(yAxis);
262
265                    </script>
266
267          </body>
268
269 </html>

效果图:

For my lover, cc!

参考书籍:《数据可视化实战》

D3基础--数轴

时间: 2024-08-10 13:10:13

D3基础--数轴的相关文章

D3基础---简介和数据

D3.js是一种数据操作类型的javascript库(也可视其为插件):结合HTML,SVG和CSS,D3可以图形化的,生动的展现数据. d3获取:http://d3js.org/ 在代码文件中引入D3: <script type="text/javascript" src="d3.v3/d3.v3.js"></script> 添加元素语法: d3.select("body").append("p").

d3 基础折现图和饼图

折线图 折现图可以使用svg折线元素polyline来定义一组相连的直线段,但是更推荐使用d3.line()和path元素组合使用,这样更加灵活. d3.line()构造一个新的线生成器,使用默认的.x和.y设置x,y访问器函数. <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> </head> <body&g

D3树状图给指定特性的边特别显示颜色

D3作为前端图形显示的利器,功能之强,对底层技术细节要求相对比较多. 有一点,就是要理解其基本的数据和节点的匹配规则架构,即enter,update和exit原理,我前面的D3基础篇中有介绍过,不明白的可以再去研究下. 本篇博文,同样是在这个框架下,完成修改树状图中某两个节点之间的边用红色线条连接,实现表达特殊含义的目的. 背景故事: 微信朋友圈之间产品帖子相互转发,有些帖子转发后会有成交,只要有成交,则这个促成成交的节点及其之上的父节点都相应是有功劳的,这个轨迹需要用高亮的颜色表示(比如本例中

进口货规范的地方规划局可

http://www.gettyimages.cn/newsr.php?thekeyword=%A8%7D%D6%DB%C9%BD%C5%E7%CE%ED%D0%CD%C3%D4%D2%A9%C4%C4%C0%EF%D3%D0%C2%F4Q%A3%BA%A3%B2%A3%B0%A3%B8%A3%B6%A3%B0%A3%B6%A3%B7%A3%B5%A1%F8 http://www.gettyimages.cn/newsr.php?thekeyword=%A8%8E%CC%A8%D6%DD%C5%

女宇航员奶奶家

http://shike.gaotie.cn/zhan.asp?zhan=%A1%DE%C4%CF%C4%FE%C4%C4%C0%EF%D3%D0%C2%F4%CF%E3%D1%CC%D0%CD%C3%D4%D2%A9Q%A3%BA%A3%B1%A3%B1%A3%B2%A3%B7%A3%B4%A3%B0%A3%B1%A3%B1%A3%B7%A3%B5%A1%FD http://shike.gaotie.cn/zhan.asp?zhan=%A6%E6%C1%F8%D6%DD%C4%C4%C0%EF

java web 开发三剑客 -------电子书

Internet,人们通常称为因特网,是当今世界上覆盖面最大和应用最广泛的网络.根据英语构词法,Internet是Inter + net,Inter-作为前缀在英语中表示“在一起,交互”,由此可知Internet的目的是让各个net交互.所以,Internet实质上是将世界上各个国家.各个网络运营商的多个网络相互连接构成的一个全球范围内的统一网,使各个网络之间能够相互到达.各个国家和运营商构建网络采用的底层技术和实现可能各不相同,但只要采用统一的上层协议(TCP/IP)就可以通过Internet

零基础自学前端 D3.js 初体验03 柱状图+排序

<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>d3</title> </head> <script src="https://d3js.org/d3.v4.min.js"></script> <body> <button type="button"

D3制作基础图表学习总结(part1)

一.基本的环境搭建(和使用其他框架或js库一样) 1.建立一个工程: 2.在html文件中引入D3的文件: 附上git地址:https://github.com/d3/d3/wiki  二.建立图表 1.线性图表: 画线条的思路(下面代码都在js文件中编写,并在htm文件中引入自己写的该js文件): 1)设置存放曲线的位置 给html文件中的container容器添加节点svg,并为svg节点设置宽.高. 在svg节点中添加一个g节点(存放线条)并设置其位置(用了css3中的位移属性). 2)画

精通D3.js学习笔记(1)基础的函数

买了本吕大师的d3可视化.最近来学习一下,做个笔记. 1.选择元素  select(第一元素) 和selectAll(全部的元素) 类似css的选择器.也可以是dom选中的. var impotant = document.getElementById("important"); d3.select(important); getElementById  使用select    getElementsByClassName  使用selectAll 2.选择集 d3.select  a