简单的柱形图的实现

首先在d3.js 中 我们要知道几个概念

一个是比例尺

比例尺在d3.js中使用的函数是 d3.scale

在d3.js中又分为两种比例尺

1.线性比例尺

线性比例尺就是连续的数据

 var yScale = d3.scale.linear()                //定义一个线性比例尺
.domain([0, 10)]) //设置它的定义域 .range([0,10]); //设置它的长度

2.序数比例尺

序数比例尺是不连续的数据

 var xScale = d3.scale.ordinal()                //定义一个序数比例尺
.domain(d3.range(dataset.length)) //设置它的定义域 .rangeRoundBands([0, 10]); //设置它的值域

而另一个就是数轴的概念

 var xAxis = d3.svg.axis()                //定义数轴
.scale(xScale) //指定比例尺
.orient("bottom"); //确定数轴的方向

 

知道这个概念之后我们就可以在页面进行柱状图的构建了

首先我们要在页面上顶一个画布

    var height = 400;                          //设置高度
    var width = 400;                            //设置宽度

    var svg = d3.select("body")               //添加一个画布
        .append("svg")
        .attr("height", height)
        .attr("width", width);

然后定义两个比例尺一个x的一个y的

    var padding = {left: 30, right: 30, top: 20, bottom: 20};

    var dataset = [10, 20, 23, 30, 29, 40, 34, 23, 33];                     //设置数据

    var xScale = d3.scale.ordinal().domain(d3.range(dataset.length))    //设置x轴比例尺
        .rangeRoundBands([0, width - padding.left - padding.right]);

    var yScale = d3.scale.linear().domain([0, d3.max(dataset)])     //设置y轴比例尺
        .range([height - padding.top - padding.bottom, 0]);

接着就是定义x和y数轴

    var xAxis = d3.svg.axis().scale(xScale).orient("bottom");   //定义x坐标轴

    var yAxis = d3.svg.axis().scale(yScale).orient("left");   //定义y坐标轴

然后就是讲矩形添加到数轴上

    var rectPadding = 10;

    var rects = svg.selectAll(".MyRect")     //添加矩形文本
        .data(dataset)                    
.enter() .append(
"rect") .attr("class", "MyRect") .attr("transform", "translate(" + padding.left + "," + padding.top + ")") //通过transform下的translate定义矩形的位置x和y的起点位置 .attr("x", function (d, i) { return xScale(i) + rectPadding / 2; }) .attr("y", function (d) { return yScale(d); }) .attr("width", xScale.rangeBand() - rectPadding) .attr("y", function (d) { //给矩形添加动画效果 var min = yScale.domain()[0]; return yScale(min); }) .attr("height", function (d) { return 0; }) .transition() .delay(function (d, i) { return i * 200; }) .duration(2000) .ease("elastic") .attr("y", function (d) { return yScale(d); }) .attr("height", function (d) { return height - padding.top - padding.bottom - yScale(d); });

接着就是讲文字添加到数轴上

var texts = svg.selectAll(".MyText")
        .data(dataset)
.enter()
.append(
"text")
.attr("class", "MyText") .attr("transform", "translate(" + padding.left + "," + padding.top + ")") .attr("x", function (d, i) { return xScale(i) + rectPadding / 2; }) .attr("y", function (d) { return yScale(d); }) .attr("dx", function () { return (xScale.rangeBand() - rectPadding) / 2; }) .attr("dy", function (d) { return 20; }).text(function (d) { return d; }) .attr("y", function (d) { //给文字添加动画效果 var min = yScale.domain()[0]; return yScale(min); }) .attr("height", function (d) { return 0; }) .transition() .delay(function (d, i) { return i * 200; }) .duration(2000) .ease("elastic") .attr("y", function (d) { return yScale(d); });

最后实现

    svg.append("g").attr("class", "axis")
        .attr("transform", "translate(" + padding.left + "," + (height - padding.bottom) + ")")
        .call(xAxis);      //调用函数

    svg.append("g").attr("class", "axis")
        .attr("transform", "translate(" + padding.left + "," + padding.top + ")")
        .call(yAxis);    //调用函数

 

posted @ 2017-03-15 10:18  邹小凡  阅读(380)  评论(0编辑  收藏  举报