可视化工具D3.js教程 入门 (第十章)—— 交互式操作

可视化工具D3.js教程 入门 (第十章)—— 交互式操作

这里所说的交互式操作,就是说的图表的事件监听

on(‘eventName’,funvtion(){ … } )

第一个参数是要监听的事件名称

第二个参数是要执行的函数,跟jquery类似。

在上一张的柱状图基础上 ,给柱状图增加鼠标移入与移出事件改变其颜色

代码:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="https://d3js.org/d3.v5.min.js"></script>
</head>

<body>

    <svg width="500" height="400"></svg>

</body>

<script>

    var data = [30, 45, 12, 36, 54, 27, 54, 66];
    var margin = 30;//svg 上下左右边距

    var svg = d3.select('svg');
    var width = svg.attr('width');
    var height = svg.attr('height');

    //创建分组
    var g = svg.append('g').attr('transform', 'translate(' + margin + ',' + margin + ')');

    //定义 x y 轴比例尺
    var scaleX = d3.scaleBand()
        .domain(d3.range(data.length))
        .range([0, width - margin * 2]);
    var scaleY = d3.scaleLinear()
        .domain([0, d3.max(data)])
        .range([height - margin * 2, 0]);

    //绘画 x y  轴
    var axisX = d3.axisBottom(scaleX);
    var axisY = d3.axisLeft(scaleY);

    g.append('g').attr('transform', 'translate(0,' + (height - margin * 2) + ')').call(axisX);
    g.append('g').attr('transform', 'translate(0,0)').call(axisY);

    // 创建矩形分组
    var gs = g.selectAll('rect').data(data).enter().append('g');


    //绘 柱状图  +  过度效果
    var rectP = 10;//柱状图间距
    gs.append('rect')
        .attr('x', function (d, i) {
            return scaleX(i) + rectP / 2;
        })
        .attr('y', function (d, i) {
            return scaleY(d);
        })
        .attr('width', function (d, i) {
            return scaleX.step() - rectP;
        })
        .attr('height', function (d, i) {
            return height - margin * 2 - scaleY(d);

        })
        .attr('fill', 'pink')

        //添加鼠标划入划出事件
        .on('mouseover', function () {//鼠标划入矩形事件
            d3.select(this)//这里的this指向就是当前的矩形

                .transition()
                .duration(1000)
                .delay(200)
                .attr('fill', '#306ade');
        })
        .on('mouseout', function () {
            d3.select(this)

                .transition()
                .duration(1000)
                .delay(200)
                .attr('fill', 'pink');
        })



    //绘 文字  +  过度效果

    gs.append('text')
        .attr('x', function (d, i) {
            return scaleX(i) + rectP / 2;
        })
        .attr('y', function (d, i) {
            //            return scaleY(d);
            return height - 2 * margin; //这里的初始化效果 同上面的矩形初始化效果一样
        })
        .attr('dx', function (d, i) {
            return -2;
        })
        .attr('dy', function (d, i) {
            return 20;
        })
        .text(function (d, i) {
            return d;
        })
        .transition()
        .duration(2000)
        .delay(function (d, i) {
            return i * 300;//300毫秒
        })
        .attr('y', function (d, i) {
            return scaleY(d);
        });


</script>

</html>

效果

在这里插入图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值