• 简单的柱形图的实现


    首先在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);    //调用函数
  • 相关阅读:
    CodeForces
    POJ
    POJ 2260 Error Correction 模拟 贪心 简单题
    POJ
    HDU
    UVA
    CodeForces
    CodeForces
    常见的医学图像成像(总)
    ADNI数据集相关概念整理
  • 原文地址:https://www.cnblogs.com/zouxiaofan/p/6552800.html
Copyright © 2020-2023  润新知