最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用D3.js制作圖表詳解

 更新時(shí)間:2017年08月13日 09:23:59   作者:Evelynzzz  
D3是目前最流行的JavaScript可視化圖表庫(kù)之一,D3的圖表類(lèi)型非常豐富,并且支持SVG格式,因此應(yīng)用十分廣泛,也有很多圖表插件基于D3開(kāi)發(fā),比如MetricsGraphics.js,在D3上構(gòu)建的數(shù)據(jù)圖表非常強(qiáng)大。

D3是用于數(shù)據(jù)可視化的Javascript庫(kù)。使用SVG,Canvas和HTML。結(jié)合強(qiáng)大的可視化技術(shù)和數(shù)據(jù)驅(qū)動(dòng)的DOM操作方法。

D3與JQuery的區(qū)別 D3是數(shù)據(jù)驅(qū)動(dòng)的,JQuery不是:我們使用JQuery直接操縱元素;但是使用D3
時(shí)我們需要通過(guò)D3專(zhuān)有的data(),enter()和exit()方法提供數(shù)據(jù)和回調(diào),然后D3操作元素。 D3通常用于數(shù)據(jù)可視化;JQuery用于創(chuàng)建Web應(yīng)用。D3有很多數(shù)據(jù)可視化擴(kuò)展;JQuery有很多Web應(yīng)用插件。兩者都是Javascript DOM操作庫(kù),提供CSS選擇器和流暢的API。

What is the difference between D3 and JQuery?

最常用的方法

d3.select(selector):選擇第一個(gè)匹配selector的元素。如果沒(méi)有匹配的元素,返回一個(gè)空的選擇(但不是null或undefined)。

d3.selectAll(selector):與select()不同的是,會(huì)選擇所有匹配的元素。

selection.append(type):如果指定的type是一個(gè)字符串,則將這個(gè)type(標(biāo)簽名稱(chēng))作為新元素附加到每個(gè)選定元素的最后一個(gè)子元素。

selection.attr(name, [value]):value確定時(shí),將selection中名為name的屬性值設(shè)置成value。value可以為常量或者方法。如果value沒(méi)有給出,返回selection中第一個(gè)非空元素的name屬性當(dāng)前值。

selection.data([data[,key]]):將數(shù)據(jù)和元素綁定起來(lái),并返回一個(gè)新的selection。

selection.enter():返回enter selection。此時(shí)DOM元素少于對(duì)應(yīng)的數(shù)據(jù)。用于添加缺少的DOM元素。比如:

var div = d3.select("body")
  .selectAll("div")
  .data([4, 8, 15, 16, 23, 42])
  .enter().append("div")
  .text(function(d) { return d; });

如果body是空的,上面的代碼就會(huì)根據(jù)數(shù)據(jù)創(chuàng)建新的div元素,然后添加到body元素中,并將文本內(nèi)容設(shè)置為對(duì)應(yīng)的數(shù)字。頁(yè)面結(jié)果如下:

 <div>4</div>
 <div>8</div>
 <div>15</div>
 <div>16</div>
 <div>23</div>
 <div>42</div>

selection.exit():返回exit selection。此時(shí)DOM元素多于對(duì)應(yīng)的數(shù)據(jù)。用于移除多余的DOM元素。比如,基于上面的例子,我們要更新數(shù)據(jù):

div = div.data([1, 2, 4, 8, 16, 32], function(d) { return d; });

因?yàn)榇藭r(shí)指定了key方法(用于指定數(shù)據(jù)和元素匹配的順序等),并且數(shù)據(jù)[4,8,16]匹配已經(jīng)存在的元素,所以u(píng)pdate selection只包含3個(gè)div元素。我們可以使用enter selection添加3個(gè)新元素:

div.enter().append("div").text(function(d) { return d; });

然后,還需要移除不需要的元素[15, 23, 42]:

div.exit().remove();

頁(yè)面結(jié)果:

 <div>1</div>
 <div>2</div>
 <div>4</div>
 <div>8</div>
 <div>16</div>
 <div>32</div>

制作柱狀圖


柱狀圖示例

使用D3的時(shí)候,要對(duì)SVG的結(jié)構(gòu)有一個(gè)了解。要繪出什么圖形,需要用到什么標(biāo)簽,標(biāo)簽需要定義什么屬性。
比如,制作一個(gè)柱狀圖,主要是XY坐標(biāo)軸和柱形。XY軸用到line標(biāo)簽繪制直線,以及text標(biāo)簽顯示刻度的文字。柱形用到rect標(biāo)簽繪制長(zhǎng)方形,那如果要帶圓角的長(zhǎng)方形,我們可以設(shè)置rect標(biāo)簽的rx或ry屬性,如果要定義長(zhǎng)方形的位置,需要設(shè)置x和y屬性等。就這樣,一部分一部分的組合到一起成為一張圖。

以下的內(nèi)容是基于D3 3.x 的API,有些接口跟D3 4.0是不同的。
D3 3.x API Reference
D3 4.0 API Reference

根部的svg

D3繪圖首先要?jiǎng)?chuàng)建一個(gè)svg元素并定義寬高等屬性:

var svg = d3.select(id).append("svg")
  .attr('class', 'svg_timeline')
  .attr("width", width + margin.left + margin.right)
  .attr("height", height + margin.top + margin.bottom);

坐標(biāo)軸
制作坐標(biāo)軸首先需要用到D3的比例尺。用到方法 axis.scale([scale]) ,設(shè)置坐標(biāo)軸的比例尺,或者返回當(dāng)前的比例尺。比例尺分為:

定量比例尺:連續(xù)的數(shù)據(jù),比如數(shù)字。時(shí)間比例尺:數(shù)據(jù)是時(shí)間。序數(shù)比例尺:離散的數(shù)據(jù),比如名稱(chēng),類(lèi)別等。

比如我們要制作一個(gè)有時(shí)間刻度的X軸和一個(gè)數(shù)字刻度的Y軸,就可以使用時(shí)間比例尺和定量比例尺,或者更具體的說(shuō),線性比例尺。

d3.scale.linear():創(chuàng)建一個(gè)線性比例尺。 d3.time.scale():創(chuàng)建一個(gè)時(shí)間比例尺??潭群涂潭雀袷脚渲脼楸镜貢r(shí)間。

確定比例尺之后還需要設(shè)置輸入域和輸出范圍。比如一個(gè)x軸的比例尺為:

var x = d3.time.scale()
  .range([0, 坐標(biāo)軸的寬度])
  .domain(最小日期, 最大日期);

最小日期和最大日期都是Date對(duì)象。然后設(shè)置X坐標(biāo)軸的比例尺并創(chuàng)建它:

//生成x坐標(biāo)軸
var xAxis = d3.svg.axis()    //新建一個(gè)默認(rèn)的坐標(biāo)軸
  .scale(x)    //設(shè)置比例尺
  .ticks(d3.time.day, 1)   //指定刻度生成的方式
  .tickFormat(function(d){  //自定義刻度文字格式
    var month = d.getMonth() + 1;
    return month+'月'+ d.getDate() +'日';
  })
  .tickPadding([15]) //坐標(biāo)軸線與文字之間的距離
  .tickSize(-height)
  .orient("bottom"); //位置

ticks的參數(shù)類(lèi)型取決于對(duì)應(yīng)的比例尺的類(lèi)型,這里傳的參數(shù)是時(shí)間間隔,也就是說(shuō)刻度與刻度之間是相隔一天的。
tickFormat則讓我們可以自定義刻度的文字格式。

值得一說(shuō)的是,如果數(shù)據(jù)中對(duì)應(yīng)X軸的數(shù)據(jù)是字符串,比如‘2017-08-12'。那綁定到頁(yè)面上的數(shù)據(jù)是需要被處理的。D3提供解析日期的接口以及日期格式化的接口。

format.parse(string):把一個(gè)字符串string解析為一個(gè)日期。 d3.time.format(specifier):根據(jù)給定的specifier創(chuàng)建一個(gè)當(dāng)?shù)貢r(shí)間格式化。

比如:

var parseDate = d3.time.format("%Y-%m-%d").parse; //時(shí)間解析器
var date = parseDate('2017-08-12'); //將字符串解析成日期

最后,在svg元素中添加坐標(biāo)軸:

//添加X(jué)軸元素
svg.append("g")
  .attr("class", "axis x")
  .attr("transform", "translate(0," + height + ")")
  .call(xAxis);

selection.call(function[, arguments…])方法調(diào)用指定的方法一次,并把selection跟隨參數(shù)一起傳遞到方法中。

柱狀圖中的長(zhǎng)方形
具體步驟:將數(shù)據(jù)跟頁(yè)面元素綁定,并創(chuàng)建所需要的頁(yè)面元素,具體設(shè)置每個(gè)頁(yè)面元素的樣式位置,以及事件監(jiān)聽(tīng)等。

//添加條形的元素
var bars = svg.selectAll(".barRect")
  .data(ddata)  //綁定數(shù)據(jù)
  .enter().append("g")  //創(chuàng)建缺少的頁(yè)面元素
  .attr('class', 'barRect')
  .attr("id", function(d, i) {
    return "barRect-" + i;
  });          

//定義矩形的位置
//x為矩形最左端的位置
//y為矩形最頂端的位置
bars.append("rect")
  .attr('class','bar-rect')
  .attr("width",16)  //長(zhǎng)方形的寬度
  .attr("y", function(d) {
    return y(d.value);   //使用比例尺確定坐標(biāo)Y值
  })
  .attr("x", function(d) {
    return x(d.date) - 8;  //使用比例尺確定坐標(biāo)X值
  })
  .attr("height", function(d) {  //條形的高度
    return height - y(d.value);
  })
  .attr('rx',10) //圓角
  .attr('ry',10) //圓角
  .attr('fill','url(#linear-gradient)'); //填充漸變色

相關(guān)文章

  • JavaScript?引用類(lèi)型之原始值包裝類(lèi)型String

    JavaScript?引用類(lèi)型之原始值包裝類(lèi)型String

    這篇文章主要介紹了JavaScript?引用類(lèi)型之原始值包裝類(lèi)型String,String是對(duì)應(yīng)字符串的引用類(lèi)型。要?jiǎng)?chuàng)建一個(gè)String?對(duì)象,使用String?構(gòu)造函數(shù)并傳入一個(gè)數(shù)值,更多相關(guān)內(nèi)容需要的朋友可以參考一下
    2022-07-07
  • js檢查是否關(guān)閉瀏覽器的方法

    js檢查是否關(guān)閉瀏覽器的方法

    這篇文章主要介紹了js檢查是否關(guān)閉瀏覽器的方法,涉及javascript針對(duì)窗口事件的判定與操作相關(guān)技巧,需要的朋友可以參考下
    2016-08-08
  • layui: layer.open加載窗體時(shí)出現(xiàn)遮罩層的解決方法

    layui: layer.open加載窗體時(shí)出現(xiàn)遮罩層的解決方法

    今天小編就為大家分享一篇layui: layer.open加載窗體時(shí)出現(xiàn)遮罩層的解決方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-09-09
  • JavaScript自定義文本框光標(biāo)

    JavaScript自定義文本框光標(biāo)

    本篇文章主要介紹了JavaScript自定義文本框光標(biāo)的方法實(shí)例,具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧
    2017-03-03
  • JS設(shè)計(jì)模式之責(zé)任鏈模式應(yīng)用詳解

    JS設(shè)計(jì)模式之責(zé)任鏈模式應(yīng)用詳解

    JS責(zé)任鏈模式是一種行為型設(shè)計(jì)模式,它允許多個(gè)對(duì)象按照順序處理請(qǐng)求,直到其中一個(gè)對(duì)象能夠處理請(qǐng)求為止,這樣的對(duì)象鏈被稱(chēng)為責(zé)任鏈,本文將給大家詳細(xì)講講責(zé)任鏈模式在JS中的應(yīng)用,需要的朋友可以參考下
    2023-08-08
  • 第一次接觸JS require.js模塊化工具

    第一次接觸JS require.js模塊化工具

    第一次接觸JS require.js模塊化工具,本文為大家介紹了JS模塊化工具require.js教程第一課認(rèn)識(shí)require.js,編寫(xiě)require.js,感興趣的小伙伴們可以參考一下
    2016-04-04
  • javascript實(shí)現(xiàn)淘寶幻燈片廣告展示效果

    javascript實(shí)現(xiàn)淘寶幻燈片廣告展示效果

    這篇文章主要介紹了javascript實(shí)現(xiàn)淘寶幻燈片廣告展示效果的方法,以實(shí)例形式完整講述了javascript實(shí)現(xiàn)幻燈效果的javascript、css及html實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2015-04-04
  • ES6 Object方法擴(kuò)展的應(yīng)用實(shí)例分析

    ES6 Object方法擴(kuò)展的應(yīng)用實(shí)例分析

    這篇文章主要介紹了ES6 Object方法擴(kuò)展的應(yīng)用,結(jié)合實(shí)例形式總結(jié)分析了ES6針對(duì)對(duì)象方法的擴(kuò)展與優(yōu)化,需要的朋友可以參考下
    2019-06-06
  • Table凍結(jié)表頭示例代碼

    Table凍結(jié)表頭示例代碼

    Table凍結(jié)表頭,大家對(duì)此應(yīng)該不會(huì)很陌生,實(shí)現(xiàn)很簡(jiǎn)單,下面為大家詳細(xì)介紹下具體的實(shí)現(xiàn),感興趣的朋友可以參考下
    2013-08-08
  • JS判斷鼠標(biāo)從什么方向進(jìn)入一個(gè)容器實(shí)例說(shuō)明

    JS判斷鼠標(biāo)從什么方向進(jìn)入一個(gè)容器實(shí)例說(shuō)明

    偶然將想到的一個(gè)如何判斷鼠標(biāo)從哪個(gè)方向進(jìn)入一個(gè)容器的問(wèn)題,并且做了一系列的設(shè)想,代碼部分不是很多,我直接寫(xiě)了個(gè)示例, 感興趣的朋友可以了解下,或許本文對(duì)你有所幫助
    2013-02-02

最新評(píng)論

团风县| 鹤峰县| 武威市| 浙江省| 崇信县| 安顺市| 梁河县| 西贡区| 喀喇| 贵定县| 信阳市| 朔州市| 体育| 上饶市| 武穴市| 陇川县| 安顺市| 苏州市| 新兴县| 定兴县| 固镇县| 内乡县| 怀化市| 什邡市| 南华县| 榆中县| 宜兰市| 且末县| 南京市| 宁国市| 冀州市| 家居| 桂林市| 桦南县| 彭水| 宾阳县| 浦东新区| 霍邱县| 拉孜县| 商河县| 东丰县|