d3学习

作者: 奋斗的小鸟cx | 来源:发表于2019-07-22 16:11 被阅读0次

    2. 我为什么用D3?

    1)结合HTML,SVG,CSS,D3可以图形化的,生动的展现数据。是目前最流行的数据可视化库,同时是Github上前端库排行第二(仅次于bootstrap)。

    2)比Processing这样的底层绘图库更简单,比Echarts这样高度封装的图表库更自由。

    3.D3的下载和使用

    D3官网

    D3github地址

    4.D3有哪些功能?

    行为 - 可重用的交互行为。

    核心 - 包括选择器,过渡,数据处理,本地化,颜色等。

    地理 - 球面坐标,经纬度运算。

    几何 - 提供绘制2D几何图形的实用工具。

    布局 - 推导定位元素的辅助数据。

    比例尺 - 数据编码和视觉编码之间转换。

    可缩放矢量图形 - 提供用于创建可伸缩矢量图形的实用工具。

    时间 - 解析或格式化时间,计算日历的时间间隔等。

    二、添加元素

    d3.select("body").append("p").text("小可爱!");

    解析:

    d3代表D3对象;

    d3的select()方法通过使用CSS选择器的语法来选择DOM元素(如body),并且选择的是第一个匹配的元素,使用 selectAll() 可以返回所有匹配元素。

    append()方法是在所选择元素内的末尾加上元素(如p),也即追加;

    text()方法写入元素内容。

    三、数据绑定

    D3 一个很强大的特点是能将数据绑定到 DOM 上,也就是绑定到文档上。

    例如网页中有段落元素  和一个整数 100,于是可以将整数 100 与 绑定到一起。绑定之后,当需要依靠这个数据才操作元素的时候,会很方便。

    1. D3可以处理哪些类型的数据?

    JS的数据类型。如数字,时间,字符串,布尔值,数组,对象等都可以。

    D3自定义的数据类型。如集合(Set),映射(Map),嵌套(Nest),及各种颜色空间(RGB,HSL,L*a*b,HSV)对象等

    最常用的是数组,JSON。特殊的有CSV,GeoJSON数据等。

    2.如何绑定?

    D3 中是通过以下两个函数来绑定数据的:

    datum():绑定一个数据到选择集上

    data():绑定一个数组到选择集上,数组的各项值分别与选择集的各元素绑定

    1)datum()

    在上面的代码中,用到了一个无名函数 function(d, i)。当选择集需要使用被绑定的数据时,常需要这么使用。其包含两个参数,其中:

    d 代表数据,也就是与某元素绑定的数据。

    i 代表索引,代表数据的索引号,从 0 开始。

    datum只是替换一组新的数据。

    2)data()

    3.代码解析

    selectAll("p")          //选择DOM中的所有段落。

    data(dataset)        //计数和分析我们的数据值。

    有五个值,之后我们的数据集执行了5次,每个值一次。

     enter()                 //绑定数据和DOM元素。

    这个方法将数据传递到DOM中。如果数据值比相应的DOM元素多,就用enter()创建一个新元素的占位符。

    append("p")                        //追加元素

    通过enter()创建的占位符 在DOM中插入一个p元素。

    text()              //为新创建的p标签插入一个文本值。

    四、使用数据

    五、绘制条形图

    1)attr("class","bar")  //设置属性

    2)d3.range(25) 生成25个数字:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24]。当然我们没有用它生成的数字,而只是用它来循环。真正生成数字的地方在map函数里。(数组)

    3)d3.map()  //构建一个新的map

    map函数,顾名思义映射,也就是生成一个对应该位置的一个数字(当然这里强大之处不仅仅是一个数字,还可以是对象)。(数组)

    4)我们用d3.round函数对随机数保留一位小数四舍五入。(格式化)

    5)我们用d3.random.normal(15,8)()生成一个满足期望是15,方差是8的正态分布的随机数。(数学)

    六、使用D3绘制SVG

    svg是可缩放矢量图语言,所以在svg上绘制的几何图形我们可以任意缩放,而不会导致像素模糊,当然也可以body上直接绘制空div,填充的方式,间接表现条形图,不过在通常来讲对前端人员来讲是不可能干的,所以我们一般在svg这个画布上绘制,先append一个div设置width,height,然后再添加rect,circle,svg上的几何图形有,rect,circle,还支持路径自由绘制。

    1)创建svg

    2)数据驱动的svg   select,data,enter,append

    3)绘制圆:圆心坐标,直径

    这里会使用D3经典的select-data-enter-append-attr/style的编程套路。

    也就是选择元素-绑定数据-添加新元素的占位符-添加元素-设置属性或样式。

    七、SVG绘制更自由的条形图

    1)创建svg

    2)绘制矩形,绑定数据

    3)矩形条的属性和样式

    绘制的思路是:

    - 条宽

    条宽 = 条实际宽度 + 间隙的宽度。

    其中条宽 = (w / dataset.length)

    间隙的宽度 = barPadding

    - 条高

    条高 = 条长-纵坐标(纵坐标是从上到下计算,即下方向为正) 即条高 = h - (d * 4)

    - 条的颜色

    条的颜色用据数据集生成的动态RGB值填充。

    4)文本标记(可是数值)

    x坐标:i * (w / dataset.length) + (w / dataset.length - barPadding) / 2

    y坐标:h - (d * 4) + 14;

    八、散点图绘制

    1)创建svg

    2)绘制圆,绑定数据

    3)圆的属性和样式

    九、线性比例尺

    1. 定义域和值域

    比例尺有两个最重要的函数:

    .domain([100, 500]) 定义域范围

    .range([10, 350]) 值域范围

    下面就是定义比例尺的方法:

    var scale = d3.scale.linear()

                .domain([100, 500])

                .range([10, 350]);

    比例尺最终都会对定义域执行相应的函数变换,然后再把这个中间数据线性变换到值域范围上。

    2. 坐标轴的缩放

    最大的X

    d3.max(dataset, function(d) {    //返回 480

        return d[0];  //返回每个子数组的第一个元素

    });

    X轴缩放

    var xScale = d3.scale.linear()

                 .domain([0, d3.max(dataset, function(d) { return d[0]; })])

                 .range([0, w]);

    3.设定圆心的坐标

    缩放后的坐标X值

    .attr("cx",function(d) {

        return xScale(d[0]);

    })

    4.设定文本坐标值

    .attr("x",function(d) {

        return xScale(d[0]);

    })

    注:点大小与圈大小成正比,想把大的放在下面,只要改变Y轴值域倒转即可: .range([h , 0]);

    注:为了SVG边缘不被截断可以设置边距: .range([h - padding, padding]);

    十、坐标轴

    1.定义和创建x轴

    //定义X轴

    var xAxis = d3.svg.axis()

         .scale(xScale)

         .orient("bottom");

    //创建X轴

    svg.append("g").call(xAxis);

    其中:

    scale函数用来指定坐标轴的比例尺。

    orient函数用来指定坐标轴的方位,可取值有left,right,top,bottom。

    调用的时候任意的选择器call调用轴,或者xAxis(选择器)均可。

    2. 调整X轴的样式

    把坐标轴平移到下面:

    svg.append("g")

    .attr("class","axis")

    .attr("transform","translate(0,"+ (h - padding) +")")

        .call(xAxis);

    3. 设置刻度数

    .ticks(5);  //设置刻度数

    注意这个ticks函数指定的数字只是一个大概的数量,具体生成多少D3会自动调整。

    4.Y轴

    十一、动画

    var tran = d3.transition() - 创建一个过渡对象

    tran.delay() - 设置延时时间,过渡经过一段时间后才会开始

    tran.duration() - 设定过渡的持续时间

    tran.ease() - 设定过渡的样式。

    tran.attr() - 设置过渡属性

    tran.style() - 设置过渡样式;

    相关文章

      网友评论

          本文标题:d3学习

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