D3.js核心概念

D3.js是一個JavaScript的函數(shù)庫,主要用來做數(shù)據(jù)可視化手趣。

本節(jié)內(nèi)容介紹了選擇集晌该、動態(tài)屬性、enter绿渣、exit朝群、update操作和過渡。選擇集描述如何選中想要操作的節(jié)點(diǎn)中符;動態(tài)屬性控制選中節(jié)點(diǎn)元素的屬性姜胖;enter、exit淀散、update分別來添加節(jié)點(diǎn)右莱、移除節(jié)點(diǎn)蚜锨、更新節(jié)點(diǎn);過渡用來制作動畫效果慢蜓。

下載最新版本(4.11.0)在這里:

也可直接鏈接亚再,拷貝下面片段:

<script src="https://d3js.org/d3.v4.min.js"></script>

D3教程:點(diǎn)擊這里

Selections

D3可以選擇某一種標(biāo)簽的所有節(jié)點(diǎn)進(jìn)行批量操作,也可以根據(jù)需要選擇單獨(dú)的節(jié)點(diǎn)進(jìn)行操作晨抡。當(dāng)使用JavaScrip對某一種標(biāo)簽節(jié)點(diǎn)操作時需要進(jìn)行迭代操作氛悬,而使用D3可以批量操作,減少代碼冗余耘柱。

選擇所有節(jié)點(diǎn)進(jìn)行操作:

d3.selectAll("p").style("color", "white");

選擇單獨(dú)節(jié)點(diǎn)進(jìn)行操作:

d3.select("body").style("background-color", "black");

以上示例是按照標(biāo)簽名來選擇節(jié)點(diǎn)元素(“p”和“body”)如捅,還可以按照attribute value、class调煎、id等選擇節(jié)點(diǎn)元素镜遣。與jQuery相似,使用#匹配id士袄,.匹配class......

Dynamic Properties

樣式悲关、屬性可以被指定為D3中數(shù)據(jù)的函數(shù),而不僅僅是簡單的常量窖剑。

例如坚洽,隨機(jī)初始化段落的顏色:

d3.selectAll("p").style("color", function() {
  return "hsl(" + Math.random() * 360 + ",100%,50%)";
});

根據(jù)奇偶設(shè)置段落的顏色:

d3.selectAll("p").style("color", function(d, i) {
  return i % 2 ? "#fff" : "#eee";
}); 

數(shù)據(jù)可以動態(tài)綁定到節(jié)點(diǎn)元素中丈积。數(shù)據(jù)被指定為一個數(shù)組砾莱,每個元素作為一個參數(shù)傳遞到函數(shù)中,默認(rèn)情況下是按索引逐個元素進(jìn)行傳遞妇押,數(shù)組中的第一個元素被傳遞給第一個節(jié)點(diǎn)需了,第二個元素被傳遞給第二個節(jié)點(diǎn)跳昼,以此類推。

例如肋乍,將數(shù)字?jǐn)?shù)組綁定到段落元素鹅颊,段落字體大小按數(shù)組中這些數(shù)字來依次顯示:

d3.selectAll("p")
  .data([4, 8, 15, 16, 23, 42])
  .style("font-size", function(d) { return d + "px"; });

Enter and Exit

使用enter和exit函數(shù),分別可以為傳入的數(shù)據(jù)創(chuàng)建新的節(jié)點(diǎn)和去除多余的節(jié)點(diǎn)墓造。

當(dāng)數(shù)組綁定到節(jié)點(diǎn)時堪伍,數(shù)組中的元素逐個與選中的節(jié)點(diǎn)進(jìn)行綁定。如果節(jié)點(diǎn)數(shù)量少于數(shù)組元素?cái)?shù)量時觅闽,會創(chuàng)建新節(jié)點(diǎn)綁定多出的數(shù)據(jù)帝雇。如果節(jié)點(diǎn)數(shù)量多于數(shù)組元素?cái)?shù)量時,會移除末尾多出的節(jié)點(diǎn)蛉拙。enter之后一般使用append來進(jìn)行節(jié)點(diǎn)元素的實(shí)際創(chuàng)建尸闸,exit之后一般使用remove來移除多出的節(jié)點(diǎn)。

例:

d3.select("body")
  .selectAll("p")
  .data([4, 8, 15, 16, 23, 42])
  .enter().append("p")
  .text(function(d) { return "I’m number " + d + "!"; });

更新節(jié)點(diǎn)元素。不會創(chuàng)建新的節(jié)點(diǎn)吮廉。

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

創(chuàng)建新的節(jié)點(diǎn)苞尝。當(dāng)節(jié)點(diǎn)數(shù)量小于數(shù)組元素?cái)?shù)量時,創(chuàng)建新的節(jié)點(diǎn)宦芦,使節(jié)點(diǎn)數(shù)量與數(shù)據(jù)元素?cái)?shù)量相等宙址。

// Enter...
p.enter().append("p")
    .text(function(d) { return d; });

刪除多余節(jié)點(diǎn)。當(dāng)節(jié)點(diǎn)數(shù)量大于數(shù)組元素?cái)?shù)量時踪旷,移除末尾多余的節(jié)點(diǎn)曼氛,使節(jié)點(diǎn)數(shù)量與數(shù)據(jù)元素?cái)?shù)量相等豁辉。

// Exit...
p.exit().remove();

Transitions

D3支持動畫效果令野,這種動畫效果可以通過對樣式屬性的過渡實(shí)現(xiàn)。其補(bǔ)間插值支持多種方式徽级,比如線性气破、彈性等。

d3-transition詳解:點(diǎn)擊這里

這里介紹四個函數(shù)餐抢。

transition()

啟動過渡效果现使。其前后是圖形變化前后的狀態(tài)(形狀、位置旷痕、顏色等等)碳锈。

duration()

指定過渡的持續(xù)時間,單位為毫秒欺抗。

ease()

指定過渡的方式售碳,常用的有:

  • linear:普通的線性變化
  • circle:慢慢地到達(dá)變換的最終狀態(tài)
  • elastic:帶有彈跳的到達(dá)最終狀態(tài)
  • bounce:在最終狀態(tài)處彈跳幾次

delay()

指定延遲的時間,表示一定時間后才開始轉(zhuǎn)變绞呈,單位同樣為毫秒贸人。此函數(shù)可以對整體指定延遲,也可以對個別指定延遲佃声。

例艺智,背景色過渡到黑色,1秒后開始過渡圾亏,過渡時長為1秒:

d3.select("body").transition()
        .delay(1000)
        .duration(1000)
        .style("background-color", "black");

更多內(nèi)容:Github個人博客
備注:本文發(fā)表于 https://cnyangkui.github.io/2017/10/11/d3core.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末十拣,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子志鹃,更是在濱河造成了極大的恐慌夭问,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,888評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件弄跌,死亡現(xiàn)場離奇詭異甲喝,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)铛只,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評論 3 399
  • 文/潘曉璐 我一進(jìn)店門埠胖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來糠溜,“玉大人,你說我怎么就攤上這事直撤》歉停” “怎么了?”我有些...
    開封第一講書人閱讀 168,386評論 0 360
  • 文/不壞的土叔 我叫張陵谋竖,是天一觀的道長红柱。 經(jīng)常有香客問我,道長蓖乘,這世上最難降的妖魔是什么锤悄? 我笑而不...
    開封第一講書人閱讀 59,726評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮嘉抒,結(jié)果婚禮上零聚,老公的妹妹穿的比我還像新娘。我一直安慰自己些侍,他們只是感情好隶症,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,729評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著岗宣,像睡著了一般蚂会。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上耗式,一...
    開封第一講書人閱讀 52,337評論 1 310
  • 那天胁住,我揣著相機(jī)與錄音,去河邊找鬼纽什。 笑死措嵌,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的芦缰。 我是一名探鬼主播企巢,決...
    沈念sama閱讀 40,902評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼让蕾!你這毒婦竟也來了浪规?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,807評論 0 276
  • 序言:老撾萬榮一對情侶失蹤探孝,失蹤者是張志新(化名)和其女友劉穎笋婿,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體顿颅,經(jīng)...
    沈念sama閱讀 46,349評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡缸濒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,439評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片庇配。...
    茶點(diǎn)故事閱讀 40,567評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡斩跌,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出捞慌,到底是詐尸還是另有隱情耀鸦,我是刑警寧澤,帶...
    沈念sama閱讀 36,242評論 5 350
  • 正文 年R本政府宣布啸澡,位于F島的核電站袖订,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏嗅虏。R本人自食惡果不足惜洛姑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,933評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望旋恼。 院中可真熱鬧吏口,春花似錦奄容、人聲如沸冰更。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,420評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蜀细。三九已至,卻和暖如春戈盈,著一層夾襖步出監(jiān)牢的瞬間奠衔,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,531評論 1 272
  • 我被黑心中介騙來泰國打工塘娶, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留归斤,地道東北人。 一個月前我還...
    沈念sama閱讀 48,995評論 3 377
  • 正文 我出身青樓刁岸,卻偏偏與公主長得像脏里,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子虹曙,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,585評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 對集合的操作 關(guān)于d3.attr 一個可以處理很多情況的函數(shù)迫横,當(dāng)只傳入一個參數(shù)時,如果是string酝碳,則返回該屬性...
    陳堅(jiān)生閱讀 2,536評論 0 2
  • 這篇筆記主要包含 Vue 2 不同于 Vue 1 或者特有的內(nèi)容矾踱,還有我對于 Vue 1.0 印象不深的內(nèi)容。關(guān)于...
    云之外閱讀 5,052評論 0 29
  • 王想是什么時候開始問我這個問題的疏哗,我想想呛讲,那一定是在一個十分普通的夜里,他安靜的躺在床上,然后平靜地問我:我到底是...
    百鬼夜行衣閱讀 583評論 0 0
  • One 依稀記得小學(xué)那會很調(diào)皮贝搁,總喜歡和領(lǐng)居家的小男孩一起追逐打...
    莫為浮云遮望眼閱讀 199評論 0 0
  • 認(rèn)識我,你后悔嗎关面? 輕易就相信別人坦袍, 不是因?yàn)槲疑担?而是人生已經(jīng)如此艱難, 有些謊言我不想拆穿…… 喜歡去幫助別...
    紫色音符閱讀 906評論 0 3