zoukankan      html  css  js  c++  java
  • d3.js学习13

    表格线


    先定义svg环境

    var height = 500,
          width = 500,
          margin = 25;
    
    var svg = d3.select("body").append("svg")
    	.attr("class","axis")
    	.attr("width", width)
    	.attr("height", height);
    

    绘制X轴

    function renderXAxis(){
    	var axisLength = width - 2 * margin;//定义尺度的值域
    	var scale = d3.scale.linear()
    		.domain([0,100])
    		.range([0,axisLength]);//设置尺度
    	var xAxis = d3.svg.axis()
    		.scale(scale)
    		.orient("bottom");//x轴
    	svg.append("g")//g代表一组图形,加到svg中
    		.attr("transform",function(){
    			return "translate(" + margin + "," + (height - margin) + ")";//transform.translate定义2d转换
    		})
              .attr("class","x-axis")//设定包含10个g的大类g类名为x-axis .call(xAxis);//call相当于调用xAxis这个变量或方法 } renderXAxis();

    可以看出,生成了值域为0-100的一组(10个)"g",它的类别为"tick"。在renderXAxis()方法中添加代码(call()方法之后)

    d3.selectAll("g.x-axis g.tick")//选中所有g下类别为tick
    	.append("line")
    	.classed("grid-line",true)
    	.attr("x1",0)//起点横坐标
    	.attr("y1",0)
    	.attr("x2",0)
    	.attr("y2",-(height - 2* margin));
    

    为什么要设置x-axis这个类别而不直接使用g.tick?因为一会儿还要画纵坐标。

    在svg中,0,0坐标代表左上角

    附translate.transform(x,y),在这里

    同理,绘制出renderYAxis()方法

    function renderYAxis(){
    	var axisLength = height - 2* margin;
    	var scale = d3.scale.linear()
    		.domain([100,0])
    		.range([0, axisLength]);
    	var yAxis = d3.svg.axis()
    		.scale(scale)
    		.orient("left");
    
    		svg.append("g")
    		.attr("class","y-axis")
    		.attr("transform",function(){
    			return "translate(" + margin + "," + margin + ")";
    		})
    		.call(yAxis);
    
    		d3.selectAll("g.y-axis g.tick")
    			.append("line")
    			.classed("grid-line",true)
    			.attr("x1",0)
    			.attr("y1",0)
    			.attr("x2",axisLength)
    			.attr("y2",0);
    }
    

    这里注意2点,第一点为值域为100到0,因为纵坐标是由上向下,第二点是虚线的位置。

    结果:

     动态尺度网格线


    var height = 500,
    	width = 500,
    	margin = 50,
    	xAxis, yAxis, xAxisLength, yAxisLength;
    
    var svg = d3.select("body").append("svg")
    	.attr("class","axis")
    	.attr("width", width)
    	.attr("height", height);
    

    横坐标函数,与上例基本一致,某些变量改为环境变量(用于rescale)

    function renderXAxis(){
    	xAxisLength = width - 2 * margin;//定义尺度的值域
    	var scale = d3.scale.linear()
    		.domain([0,100])
    		.range([0,xAxisLength]);//设置尺度
    	xAxis = d3.svg.axis()
    		.scale(scale)
    		.orient("bottom");//x轴
    	svg.append("g")//g代表一组图形,加到svg中
    		.attr("class","x-axis")
    		.attr("transform",function(){
    			return "translate(" + margin + "," + (height - margin) + ")";//transform.translate定义2d转换
    	})
    	.call(xAxis);//call相当于调用xAxis这个变量或方法
    
    	d3.selectAll("g.x-axis g.tick")
    		.append("line")
    		.classed("grid-line",true)
    		.attr("x1",0)//起点横坐标
    		.attr("y1",0)
    		.attr("x2",0)
    		.attr("y2",-(height - 2* margin));
    }
    

    Y坐标轴同理

    function renderYAxis(){
    	yAxisLength = height - 2* margin;
    	var scale = d3.scale.linear()
    		.domain([100,0])
    		.range([0, yAxisLength]);
    	yAxis = d3.svg.axis()
    		.scale(scale)
    		.orient("left");
    
    	svg.append("g")
    		.attr("class","y-axis")
    		.attr("transform",function(){
    			return "translate(" + margin + "," + margin + ")";
    		})
    		.call(yAxis);
    
    	d3.selectAll("g.y-axis g.tick")
    		.append("line")
    		.classed("grid-line",true)
    		.attr("x1",0)
    		.attr("y1",0)
    		.attr("x2",yAxisLength)
    		.attr("y2",0);
    }
    

    调整内部网格线的方法(删除旧的-添加新的-画线)

    function renderXGridLines(){
    	var lines = d3.selectAll("g.x-axis g.tick")
    		.select("line.grid-line")
    		.remove();
    
    	lines = d3.selectAll("g.x-axis g.tick")
    		.append("line")
    		.classed("grid-line",true);
    
    	lines.attr("x1",0)
    		.attr("y1",0)
    		.attr("x2",0)
    		.attr("y2",-yAxisLength);
    }
    function renderYGridLines(){
    	var lines = d3.selectAll("g.y-axis g.tick")
    		.select("line.grid-line")
    		.remove();
    
    	lines = d3.selectAll("g.y-axis g.tick")
    		.append("line")
    		.classed("grid-line",true);
    
    	lines.attr("x1",0)
    		.attr("y1",0)
    		.attr("x2", xAxisLength)
    		.attr("y2",0);
    }
    

    重做尺度,调用绘制新网格线

    这里生成了一个max的随机数,用于重做尺度值域,实际情况替换即可

    function rescale(){
    	var max = Math.round(Math.random()*100);
    
    	xAxis.scale().domain([0,max]);//更改值域
    	svg.select("g.x-axis")
    		.transition()
    		.call(xAxis);
    
    	yAxis.scale().domain([max,0]);//更改值域
    	svg.select("g.y-axis")
    		.transition()
    		.call(yAxis);
    
    	renderXGridLines();
    	renderYGridLines();
    }
    

    最后,依旧是调用绘制坐标轴

    renderXAxis();
    renderYAxis();
    

    使用button调用rescale函数

    <div class="control-group">
    	 <button onclick="rescale()">ReScale</button>
    </div>
    

    会生成具有动态效果的坐标轴

    这是我的个人日记本
  • 相关阅读:
    vue单页应用项目加入百度统计代码
    关于VUE Spa 项目html5-History模式在微信浏览器内IOS和安卓分享的问题
    iphone 上使用contenteditable 输入法无法换行
    javaScript 三目运算符初探
    javaScript for in循环遍历对象
    javaScript 原型与原型链学习笔记
    javaScript call与apply学习笔记
    javaScript 对象学习笔记
    javaScript 立即执行函数学习笔记
    javaScript [[scope]]学习笔记
  • 原文地址:https://www.cnblogs.com/valentineisme/p/4255203.html
Copyright © 2011-2022 走看看