D3.js的v5版本入门教程(第九章)——完整的柱状图

D3.js的v5版本入门教程(第九章)

    

    一个完整的柱状图应该包括的元素有——矩形、文字、坐标轴,现在,我们就来一一绘制它们,这章是前面几章的综合,这一章只有少量新的知识点,它们是

  • d3.scaleBand():这也是一个坐标轴,可以根据输入的domain的长度,等分rangeRound域(类比range域)
  • d3.range():这个比较复杂,建议去看百度(或者官方API),在这里我只讲一下这个返回一个等差数列

    1、得到SVG画布

        var marge = {top:60,bottom:60,left:60,right:60}
    	var svg = d3.select("svg");//得到SVG画布
    	var width = svg.attr("width");//得到画布的宽
    	var height = svg.attr("height");//得到画布的长
    	var g = svg.append("g")
    		.attr("transform","translate("+marge.top+","+marge.left+")");

    2、数据集

var dataset = [10,20,30,23,13,40,27,35,20];

    3、分别在x方向和y方向绘制坐标轴

        var xScale = d3.scaleBand()
    		.domain(d3.range(dataset.length))
    		.rangeRound([0,width-marge.left-marge.right]);
    	var xAxis = d3.axisBottom(xScale);
    		
    	var yScale = d3.scaleLinear()
    		.domain([0,d3.max(dataset)])
    		.range([height-marge.top-marge.bottom,0]);
    	var yAxis = d3.axisLeft(yScale);

    代码说明:

        -这里出现了d3.scaleBand(),这是一个坐标轴

        -d3.range(dataset.length),前面说过,这里返回的是一个等差数列,dataset.length=9,所以返回的是0到8的等差数列,其实d3.range()这个函数中可以有三个参数!如果想了解的话,建议去百度,不要看官方API(难找)

    4、为每个矩形和对应的文字创建一个分组<g>

var gs = g.selectAll(".rect")
    		.data(dataset)
    		.enter()
    		.append("g");

    代码说明:

扫描二维码关注公众号,回复: 44686 查看本文章

        -这里有牵涉到enter(),这回大家应该熟悉了吧!这里的返回值是一个包含有dataset.length个<g>元素的选择集

    5、绘制矩形

var rectPadding = 20;//矩形之间的间隙
    	gs.append("rect")
    		.attr("x",function(d,i){
    			return xScale(i)+rectPadding/2;
    		})	
    		.attr("y",function(d){
    			return yScale(d);
    		})
    		.attr("width",function(){
    			return xScale.step()-rectPadding;
    		})
    		.attr("height",function(d){
    			return height-marge.top-marge.bottom-yScale(d);
    		})
    		.attr("fill","blue");

    这可能有点复杂,因为需要计算矩形左上角的坐标和长宽!读者自己慢慢琢磨会比较好

    6、绘制文字

gs.append("text")
    		.attr("x",function(d,i){
    			return xScale(i)+rectPadding/2;
    		})
    		.attr("y",function(d){
            return yScale(d);
        	})
        	.attr("dx",function(){
        		(xScale.step()-rectPadding)/2;
        	})
        	.attr("dy",20)
        	.text(function(d){
        		return d;
        	})

    这里也是一样,需要计算位置信息

    最后,附上截图

        

效果浏览:点击浏览效果

源码浏览:点击源码浏览

猜你喜欢

转载自blog.csdn.net/qq_34414916/article/details/80032731