D3.js初体验

作者: 俊爷拒做学渣 | 来源:发表于2016-05-08 21:16 被阅读304次

在之前的项目里面我们已经玩过echarts了,但它的封装程度太高了,容我们发挥的空间不大(但是在做基础的交互图表时十分方便)。所以,今次我们来玩玩强大的D3.js,这可谓是近年来最受欢迎的可视化组件了。

D3的自由度非常高,可以提供给玩家们很多想象与发挥空间,支持创作多种自定义的图形。一般玩家在创作复杂的可视化图形时更加倾向使用D3。但是其优点同时也是其缺点:创作一个简单的条形图也要耗费比较多时间!

D3 = Data-Driven Documents,数据驱动的文件。也就是文档内容的生成以及更新等一系列过程是基于数据的改变来驱动的。
其中有三个状态:ENTER-UPDATE-EXIT。简单解释一下:ENTER状态就是为已有的数据添加图形;UPDATE就是更新数据与图形;EXIT就是为根据数据删去多余的图形。以下就是根据D3这个基本的运行模式来实现的动态数据更新的例子:(注意D3.js的“函数即对象”的链式写法,与jQuery类似)

运行效果:(每1.5s会更新一次数据)。可见,就话这几个条条也需要几十行的代码。


<!DOCTYPE html>
<html>
    <head>
    <meta charset="utf-8">
        <title>Array as Data</title>
        <script type="text/javascript" src="d3.js"></script>
        <style>
        body{
            font-family: "helvetica";
        }
        .h-bar {
            min-height: 15px;
            min-width: 10px;
            background-color: steelblue;
            margin-bottom: 2px;
            font-size: 11px;
            color: #fff;
            text-align: right;
            padding-right: 2px;
        }
        </style>
    </head>
    
    <body>
        <script type="text/javascript">
        var data = [10, 15, 30, 50, 80, 65, 55, 30, 20, 10, 8];
        
        var dataRange = d3.scale.linear() //创建一个值域的线性比例尺
        .domain([0,100])
        .range([0,300]);
        
        var colorRange = d3.scale.linear() //创建一个颜色的线性比例尺
        .domain([0,100])
        .range(["#99CCCC", "#003333"]);
        
        function render(data) { 
        // Enter
            d3.select("body").selectAll("div.h-bar") //“应该”选择第一个body元素以及其下的类名为"h-bar"的div标签
             .data(data) //绑定数据与图形
             .enter() //进入状态(增加图形匹配多余的数据)
             .append("div") //添加div
              .attr("class","h-bar") //添加类名
              .append("span"); //添加span
        // Update
            d3.select("body").selectAll("div.h-bar") //选择第一个body元素以及其下的类名为"h-bar"的div标签
             .data(data) //绑定数据与图形
             .style("width",function(d){
                return dataRange(d) + "px"; //调用函数返回与该图形绑定的数据d
             })
             .style("background-color",function(d){
                return colorRange(d); //调用函数返回与该图形绑定的数据d
             })
             .select("span")
              .text(function(d){
                return d; //调用函数返回与该图形绑定的数据d
             });
        // Exit
            d3.select("body").selectAll("div.h-bar")
             .data(data)
             .exit() //退出状态(删除没有数据的多余的图形)
              .remove();
        }
        setInterval(function(){
            data.shift(); //删除数组的第一个数据
            data.push(Math.round(Math.random() * 100)); //在数组后增加一个1-100的随机数
            render(data);
        },1500); //2s执行一次
        render(data);
        </script>
    </body>
</html>

相关文章

  • D3.js初体验

    在之前的项目里面我们已经玩过echarts了,但它的封装程度太高了,容我们发挥的空间不大(但是在做基础的交互图表时...

  • [译] D3.js 之 d3-shap 简介

    [译] D3.js 之 d3-shap 简介 译者注 原文: 来自 D3.js 作者 Mike Bostock 的...

  • [译]D3.js 之 d3-selection 原理

    [译]D3.js 之 d3-selection 原理 译者注 原文: 来自 D3.js 作者 Mike Bosto...

  • yii初体验(7-15)

    yii初体验(7)视图 yii初体验(8)模块 yii初体验(9) 小部件widgets yii初体验(10) 前...

  • 用D3.js 十分钟实现字符跳动效果

    用D3.js 十分钟实现字符跳动效果 注 本文基于 D3.js 作者 Mike Bostock 的 例子 原文分为...

  • D3.js + Canvas 绘制组织结构图

    D3.js + Canvas 绘制组织结构图 使用 D3.js 默认的 svg 渲染 D3默认的树状图画图使用的是...

  • d3.js

    d3.js d3画图

  • 2018-11-18

    d3.js生成动画详解 1引入d3.js,这里采用的是4.x 2添加canvas并设置canvas的绘制环增 3,...

  • 技术分享——用D3.js框架V5版本入门基础

    技术分享——用D3.js框架V5版本入门基础 一、前言 ​ 在最近公司项目中,因为需求原因需要使用D3.js实...

  • D3.js

    D3.js 为什么学习D3 D3.js和threejs的应用场景完全不一样。threejs主要应用与基于webGL...

网友评论

    本文标题:D3.js初体验

    本文链接:https://www.haomeiwen.com/subject/pjgsrttx.html