d3数轴
来源:互联网 发布:免费空间域名注册 编辑:程序博客网 时间:2024/04/28 00:21
设定数轴
与比例尺相似,D3的数轴实际上也是由你来定义参数的函数。但与比例尺不同的是,调用数轴函数并不会返回值,而是会生成数轴相关的可见元素,包括轴线、标签和刻度。
使用d3.svg.axis()可以创建通用的数轴函数:
var xAxis = d3.svg.axis();
要使用数轴,最起码要告诉它基于什么比例尺工作。在此,我们把绘制散点图时定义的xScale传给它:
xAxis.scale(xScale);
还可以继续设置标签相对数轴显示在什么地方。默认位置是底部,也就是标签会出现在轴线下方。水平数轴的位置可 以在顶部也可以在底部。而垂直数轴则要么在左要么在右:
xAxis.orient("bottom");
把这些方法连缀在一行会更简洁:
- var xAxis = d3.svg.axis()
- .scale(xScale)
- .orient("bottom");
SVG中的其他元素都生成之后再生成数轴,这样数轴就可以出现在“上面了。想要生成数轴还要调用xAxis函数将其插入到svg元素中。
- svg.append("g")
- .call(xAxis);
前面的代码首先引用了svg,即DOM中的SVG元素。然后,append()在 这个元素的末尾追加了一个新的g元素。在SVG标签内,g元素就是一个分组(group)元素。分组元素是不可见的,跟line、rect和circle不一样,但它有两大用途:一是可以用来包含(或“组织”)其他元素,好让代码看起来简洁整齐;二是可以对整个分组应用变换,从而影响到该组中所有元素(line、rect和 circle)的视觉表现。D3的call()函数会取得(比如刚才代码链中)传递过来的元素,然后再把它交给其他函数。对我们这例子而言,传递过来的元素就是新的分组元素g(虽然这个元素不是必需的,但鉴于数轴函数需要生成很多线条和数值,有了它就可以把所有元素都封装在一个分组对象内)。而call()接着把g交给了xAxis函数,也就是要 在g元素里面生成数轴。
就该用到SVG变换(transform)了。只要添加一行代码,就可以把整个数轴分组平移到图表下方:
- svg.append("g") .attr("class", "axis")
- .attr("transform", "translate(0," + (h - padding) + ")") .call(xAxis);
新增的这行代码在attr()中设置了g元素的属性transform。SVG中的变换功 能非常强大,有多种不同的变换方式,包括缩放和旋转。但我们暂时只介绍平移 (translation)变换,它可以把整个g分组向下移动一定距离。平移变换的语法很简单,就是translate(x,y),其中x和y的含义都非常明确, 就是要把元素移动到的新位置的x和y坐标。
优化刻度
数轴的刻度线(tick)是用来传达信息的,但也不是越多越好,多过某个数量,刻度线反而会让图表显得混乱。使用ticks()方法就可以粗略地指定刻 度线的数量:
- varxAxis = d3.svg.axis()
- .scale(xScale)
- .orient("bottom")
- .ticks(5); //粗略地设置刻度线的数量
一个简单的散点图
- //svg的宽度和高度
- var w = 500;
- var h = 300;
- var padding = 30;
- //初始化数据点
- var dataset = [];
- var numDataPoints = 15;
- //x轴最大的数值
- var xRange = Math.random() * 1000;
- //y轴最大的数值
- var yRange = Math.random() * 1000;
- for (var i = 0; i < numDataPoints; i++) {
- var newNumber1 = Math.floor(Math.random() * xRange);
- var newNumber2 = Math.floor(Math.random() * yRange);
- dataset.push([newNumber1, newNumber2]);
- }
- //创建刻度尺
- var xScale = d3.scale.linear()
- .domain([0, d3.max(dataset, function(d) { return d[0]; })])
- .range([padding, w - padding * 2]);
- var yScale = d3.scale.linear()
- .domain([0, d3.max(dataset, function(d) { return d[1]; })])
- .range([h - padding, padding]);
- var rScale = d3.scale.linear()
- .domain([0, d3.max(dataset, function(d) { return d[1]; })])
- .range([2, 5]);
- //定义x轴
- var xAxis = d3.svg.axis()
- .scale(xScale)
- .orient("bottom")
- .ticks(5);
- //定义y轴
- var yAxis = d3.svg.axis()
- .scale(yScale)
- .orient("left")
- .ticks(5);
- //创建svg元素
- var svg = d3.select("body")
- .append("svg")
- .attr("width", w)
- .attr("height", h);
- //创建圆形
- svg.selectAll("circle")
- .data(dataset)
- .enter()
- .append("circle")
- .attr("cx", function(d) {
- return xScale(d[0]);
- })
- .attr("cy", function(d) {
- return yScale(d[1]);
- })
- .attr("r", function(d) {
- return rScale(d[1]);
- });
- //创建标签
- svg.selectAll("text")
- .data(dataset)
- .enter()
- .append("text")
- .text(function(d) {
- return d[0] + "," + d[1];
- })
- .attr("x", function(d) {
- return xScale(d[0]);
- })
- .attr("y", function(d) {
- return yScale(d[1]);
- })
- .attr("font-family", "sans-serif")
- .attr("font-size", "11px")
- .attr("fill", "red");
- //将x轴追加到g元素中
- svg.append("g")
- .attr("class", "axis")
- .attr("transform", "translate(0," + (h - padding) + ")")
- .call(xAxis);
- //将y轴追加到g元素中
- svg.append("g")
- .attr("class", "axis")
- .attr("transform", "translate(" + padding + ",0)")
- .call(yAxis);
其中坐标轴的css如下,这里需要注意的是,坐标轴是由text、line和path构成的:
- .axis path,
- .axis line {
- fill: none;
- stroke: black;
- shape-rendering: crispEdges;
- }
- .axis text {
- font-family: sans-serif;
- font-size: 11px;
- }
0 0
- d3数轴
- d3
- D3
- d3
- D3
- D3
- D3
- D3
- D3
- 数轴染色
- 数轴染色
- Wikioi-1191-数轴染色
- wiki-1191数轴染色
- 【wikioi1191】 数轴染色
- wikioi1191 数轴染色
- 数轴点覆盖
- codevs1191 数轴染色
- Codevs 数轴染色
- 黑马程序员——C语言基础---结构体
- 【开篇】心态、责任比技术能力更重要
- linux MISC 驱动模型分析
- 境由心造,自己选择的路跪着也要走完!
- cms6.1部署到tomcat服务器下报错记录
- d3数轴
- Objective-C-实例变量的可见度和方法
- IOS 第三方库- AFNetworking
- JavaScript语言核心知识图谱
- 人数骤增,对于管理的变化,主要是两个问题
- Remove Linked List Elements
- 两个栈实现队列与两个队列实现栈
- 【二分+最小生成树】bzoj2654 tree
- Leetcode -- Word Search