d3.js——单柱体柱状图(v5)

一、页面中引入相关函数

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>柱状图</title>
</head>
<body>
    <div id="container"></div>

    <script src="../lib/d3-5.9.7.min.js"></script>
    <script src="../js/histogram.js"></script>
</body>
</html>

二、单柱体柱状图绘制函数

//绘制柱状图
function histogram() {
    let svgAttr = {width:700,height:500};
    let marge = {top:60,bottom:60,left:60,right:60};
    let dataset = [10,20,30,23,13,40,27,35,20,5];
    let fruts = ['apple', 'pear', 'watermelon', 'peach', 'apricot', 'tomato', 'banana', 'pineapple', 'grape', 'litchi'];

    let svg = d3.select('#container').append('svg').style('width', svgAttr.width).style('height', svgAttr.height);
    let g = svg.append('g').attr('transform', 'translate('+marge.top+','+marge.left+')');

    //X轴比例尺
    let xScale = d3.scaleBand().domain(fruts).rangeRound([0, svgAttr.width-marge.left-marge.right]);
    let xAxis = d3.axisBottom(xScale);
    //Y轴比例尺
    let yScale = d3.scaleLinear().domain([0, d3.max(dataset)]).range([svgAttr.height-marge.top-marge.bottom, 0]);
    let yAxis = d3.axisLeft(yScale);

    g.append('g').attr('transform', 'translate('+0+','+(svgAttr.height-marge.bottom-marge.top)+')').call(xAxis)
        .selectAll('text').attr('transform', 'rotate(45 -20 20)');
    g.append('g').attr('transform', 'translate(0,0)').call(yAxis)
        .selectAll('line').attr('stroke-width', '0.5px').attr('x1', 0).attr('x2', function () {
        return svgAttr.width-marge.left-marge.right;
    });

    //绘制柱体
    let rectWidth = 30;
    let gRect = g.selectAll('.rect').data(dataset).enter().append('g');
    gRect.append('rect').attr('x', function (d, i) {
        return xScale(fruts[i]) + rectWidth/2;
    }).attr('y', function (d, i) {
        let min = yScale.domain()[0];
        return yScale(min);
    }).attr('width', function () {
        return rectWidth;
    }).attr('height', function () {
       return 0;
    }).attr('fill', '#22A7F2').attr('cursor', 'pointer').on('mouseover', function (d, i) {
        d3.select(this).transition().duration(100).attr('fill', '#2C81F3');
    }).on('mouseout', function (d, i) {
        d3.select(this).transition().duration(100).attr('fill', '#22A7F2');
    }).on('click', function () {
        alert('事件已触发!');
    })
        .transition().duration(1000).delay(function(d,i){
            return i*100;
        })
        .ease(d3.easeBack)
        .attr("y",function(d){
            return yScale(d);
        })
        .attr("height",function(d){
            return svgAttr.height-marge.top-marge.bottom-yScale(d);
        });

    //柱体顶部绘制文字
    gRect.append('text').attr('x', function (d, i) {
        return xScale(fruts[i])+rectWidth/2;
    }).attr('y', function () {
        let min = yScale.domain()[0];
        return yScale(min);
    }).attr('font-size', '12px').attr('fill', '#404040')
        .text(function (d) {
            return d;
        }).transition().duration(1000).delay(function (d, i) {
        return i*100;
    }).ease(d3.easeBack).attr('x', function (d, i) {
        return xScale(fruts[i])+rectWidth/2;
    }).attr('y', function (d) {
        return yScale(d)-1;
    });
}

window.onload = function () {
    histogram();
}

详情可联系  q317068568

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是使用d3.js生成一个简柱状图的示例代码: ```html <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>D3.js柱状图</title> <script src="https://d3js.org/d3.v6.min.js"></script> <style> .bar { fill: steelblue; } </style> </head> <body> <script> // 数据集 var dataset = [5, 10, 13, 19, 21, 25, 22, 18, 15, 13, 11, 12]; // 定义画布大小及边距 var margin = { top: 30, right: 30, bottom: 30, left: 30 }; var width = 600 - margin.left - margin.right; var height = 400 - margin.top - margin.bottom; // 创建svg元素 var svg = d3.select("body") .append("svg") .attr("width", width + margin.left + margin.right) .attr("height", height + margin.top + margin.bottom) .append("g") .attr("transform", "translate(" + margin.left + "," + margin.top + ")"); // 定义x轴比例尺 var xScale = d3.scaleBand() .domain(d3.range(dataset.length)) .rangeRound([0, width]) .paddingInner(0.1); // 定义y轴比例尺 var yScale = d3.scaleLinear() .domain([0, d3.max(dataset)]) .range([height, 0]); // 添加矩形 svg.selectAll(".bar") .data(dataset) .enter() .append("rect") .attr("class", "bar") .attr("x", function(d, i) { return xScale(i); }) .attr("y", function(d) { return yScale(d); }) .attr("width", xScale.bandwidth()) .attr("height", function(d) { return height - yScale(d); }); // 添加x轴 svg.append("g") .attr("class", "x axis") .attr("transform", "translate(0," + height + ")") .call(d3.axisBottom(xScale)); // 添加y轴 svg.append("g") .attr("class", "y axis") .call(d3.axisLeft(yScale)); </script> </body> </html> ``` 在这个示例代码中,我们使用了d3.js的选择集、比例尺、坐标轴等功能来生成一个简柱状图。具体实现过程可以参考代码注释。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值