首页 > 代码库 > D3基础--数轴
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 axis2 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 functions100 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 axis130 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 axis144 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 element160 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 circles172 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 labels204 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 axis242 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 axis254 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!
参考书籍:《数据可视化实战》