D3.js基礎(chǔ)篇

本教程是一個(gè)簡(jiǎn)單的入門(mén)教程,能夠幫助初學(xué)者快速掌握D3的基礎(chǔ)知識(shí)肥败。

本節(jié)內(nèi)容介紹了添加元素、綁定數(shù)據(jù)愕提、使用數(shù)據(jù)馒稍、矢量圖SVG、比例尺Scale和坐標(biāo)軸Axis浅侨。綁定數(shù)據(jù)介紹了從tsv文件綁定數(shù)據(jù)纽谒,從json文件、csv文件綁定數(shù)據(jù)用法相同如输。SVG用來(lái)繪制簡(jiǎn)單圖形鼓黔,是重點(diǎn)又是基礎(chǔ)央勒。Scale可以來(lái)控制縮放比例,Axis可以繪制坐標(biāo)軸澳化。

參考教程:D3 Tutorials - Scott Murray

1. 添加元素

d3.select("body").append("p").text("New paragraph!")

在html中添加了一個(gè)p標(biāo)簽崔步,p標(biāo)簽text值為“New paragraph!”。

2. 綁定數(shù)據(jù)

2.1 Array

var dataset = [5, 10, 15, 20, 25];
d3.select("body")
    .selectAll("p")
    .data(dataset)
    .enter()
    .append("p")
    .text("New paragraph!");

d3.select("body")——在DOM中找到body節(jié)點(diǎn)缎谷。

.selctAll("p")——在上一步找到的body節(jié)點(diǎn)中選擇所有的p標(biāo)簽節(jié)點(diǎn)井濒。如果沒(méi)有,返回空慎陵,但是這個(gè)空代表將要存在的段落眼虱。

.data(dataset)——綁定數(shù)據(jù)到選擇的DOM元素上。

.enter()——enter()將創(chuàng)建一個(gè)占位符元素席纽,用來(lái)綁定數(shù)據(jù)捏悬。

.append("p")——獲取enter()創(chuàng)建的占位符,將p元素插入到DOM中润梯。

.text("New paragraph!")——為每個(gè)p元素插入文本值过牙。

html中添加了5個(gè)p標(biāo)簽,text值均為“New paragraph!”纺铭。

2.2 TSV

TSV是一種方便的表格數(shù)據(jù)格式寇钉。該表格可以從Microsoft Excel等表格程序?qū)С觯部梢栽谖谋揪庉嬈髦惺止ぞ帉?xiě)舶赔。每一行代表一個(gè)表行扫倡,其中每行的數(shù)據(jù)由制表符Tab分隔組成。第一行是標(biāo)題行竟纳,并指定列名撵溃。例如,我們的數(shù)據(jù)文件data.tsv內(nèi)容如下:

name    value
Locke   4
Reyes   8
Ford    15
Jarrah  16
Jone    23
Kwon    42

要在瀏覽器中使用此數(shù)據(jù)锥累,需要從服務(wù)器下載文件缘挑,然后解析文件,將文件的文本轉(zhuǎn)換為可用的JavaScript對(duì)象桶略。這件事情可以由函數(shù)d3.tsv實(shí)現(xiàn)语淘。

下載是異步的。當(dāng)調(diào)用d3.tsv時(shí)际歼,文件在后臺(tái)下載然后返回?cái)?shù)據(jù)惶翻。在下載完成后的某個(gè)時(shí)候,回調(diào)函數(shù)將使用新數(shù)據(jù)調(diào)用蹬挺,如果下載失敗维贺,則返回錯(cuò)誤。

// 1. 這里的代碼首先運(yùn)行巴帮,處于文件下載前溯泣。
d3.tsv("data.tsv", function(error, data) {
    //3. 這里的代碼最后運(yùn)行虐秋,此時(shí)文件下載完成。
});
// 2. 這里的代碼第二時(shí)間運(yùn)行垃沦,文件正在下載中客给。

TSV文件的文本轉(zhuǎn)換為JavaScript對(duì)象是這個(gè)樣子:

var data = [
    {name: "Locke", value: 4},
    {name: "Reyes", value: 8},
    {name: "Ford", value:15},
    {name: "Jarrah", value: 16},
    {name: "Jone", value: 23},
    {name: "Kwon", value: 42}
]

使用d3.jsond3.csv能夠分別從json文件肢簿、csv文件綁定數(shù)據(jù)靶剑,用法相同。

3. 使用數(shù)據(jù)

var dataset = [5, 10, 15, 20, 25];
d3.select("body")
    .selectAll("p")
    .data(dataset)
    .enter()
    .append("p")
    .text(function(d) { return d; });

創(chuàng)建了5個(gè)p標(biāo)簽池充,text值分別為5桩引,10,15收夸,20坑匠,25。

4. 繪制div

<!DOCTYPE html>
<html>
<head>
<title></title>
<style type="text/css">
    div.bar {
        display: inline-block;
        width: 20px;
        height: 75px;   /* We'll override this later */
        background-color: teal;
        margin-right: 2px;
    }
</style>
</head>
<body>
<script src="https://d3js.org/d3.v4.min.js"></script>
<script type="text/javascript">
    var dataset = [];                        //Initialize empty array
    for (var i = 0; i < 25; i++) {           //Loop 25 times
        var newNumber = Math.random() * 30;  //New random number (0-30)
        dataset.push(newNumber);             //Add new number to array
    }
    d3.select("body").selectAll("div")
        .data(dataset)
        .enter()
        .append("div")
        .attr("class", "bar")
        .style("height", function(d) {
            var barHeight = d * 5;
            return barHeight + "px";
        });
</script>
</body>
<html>

5. SVG

在繪制任何東西之前卧惜,必須先創(chuàng)建一個(gè)SVG元素厘灼,并將該SVG元素作為繪制視覺(jué)效果的畫(huà)布。最好指定SVG的寬度和高度咽瓷。

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

常用的svg標(biāo)簽有rect设凹、circleellipse茅姜、line闪朱、textpath钻洒。

5.1 rect

rect繪制一個(gè)矩形监透。使用x和y指定左上角的坐標(biāo),width和height分別指定矩形的寬度和高度航唆。

<rect x="0" y="0" width="500" height="50" />

效果圖:

rect.png

5.2 circle

circle繪制一個(gè)圓。使用cx和cy指定圓心的坐標(biāo)院刁,r指定半徑糯钙。

<circle cx="250" cy="25" r="25" />

效果圖:

circle.png

5.3 ellipse

ellipse繪制一個(gè)橢圓。與圓類似退腥,使用cx和cy指定中心的坐標(biāo)任岸,但是對(duì)于每個(gè)軸需要單獨(dú)的半徑值。rx為橫軸方向的半徑狡刘,ry為縱軸方向的半徑享潜。

<ellipse cx="250" cy="25" rx="100" ry="25" />

效果圖:

ellipse.png

5.4 line

line繪制一條線條。使用x1和y1來(lái)指定線一端的坐標(biāo)嗅蔬,x2和y2指定另一端的坐標(biāo)剑按。必須指定線條的顏色使線條可見(jiàn)疾就。

<line x1="0" y1="0" x2="500" y2="50" stroke="black" />

效果圖:

line.png

5.5 text

text呈現(xiàn)文字。使用x指定左邊緣的位置艺蝴,y指定基線的垂直位置猬腰。

<text x="250" y="25">Hello World</text>

效果圖:

text.png

text繼承父元素CSS指定的字體樣式。我們也可以覆蓋格式如下:

<text x="250" y="25" font-family="sans-serif" font-size="25" fill="steelblue">Hello World</text>

效果圖:

text.png

5.6 path

path用于繪制更為復(fù)雜的內(nèi)容(如地理圖的國(guó)家輪廓等)〔赂遥現(xiàn)在姑荷,我們先掌握簡(jiǎn)單的形狀。

6. Scale

D3的scale函數(shù)可以定義一個(gè)縮放比例缩擂。調(diào)用scale函數(shù)時(shí)鼠冕,傳入一個(gè)數(shù)據(jù)值,可以返回一個(gè)縮放后的輸出值胯盯。

創(chuàng)建一個(gè)Scale:

//d3.js 3.x版本
var scale = d3.scale.linear();
//d3.js 4.x版本
var scale = d3.scaleLinear();

使用domain函數(shù)可以設(shè)置數(shù)據(jù)的輸入域:

scale.domain([100, 500]);

使用range函數(shù)可以設(shè)置數(shù)據(jù)的輸出域:

scale.range([10, 350]);

可以將上述步驟鏈接在一行代碼中:

var scale = d3.scale.linear()
    .domain([100, 500])
    .range([10, 350]);

scale(100); //Returns 10
scale(300); //Returns 180
scale(500); //Returns 350

7. Axis

axis函數(shù)用來(lái)創(chuàng)建坐標(biāo)軸懈费。

創(chuàng)建一個(gè)Axis:

var xAxis = d3.svg.axis();

每個(gè)軸需告知操作的尺度規(guī)模大小,即scale:

xAxis.scale(xScale);

我們還需要指定標(biāo)簽刻度值在軸上顯示的位置。默認(rèn)值為bottom陨闹,表示標(biāo)簽刻度值顯示在軸線的下方楞捂。

xAxis.orient("bottom");

可以使用ticks函數(shù)告訴坐標(biāo)軸粗略的設(shè)置幾個(gè)刻度:

xAxis.ticks(5);

我們也可以把代碼鏈接起來(lái):

var xAxis = d3.svg.axis()
    .scale(xScale)
    .orient("bottom")
    .ticks(5);

最后,我們把生成的軸插入到SVG中趋厉。

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

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末寨闹,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子君账,更是在濱河造成了極大的恐慌繁堡,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件乡数,死亡現(xiàn)場(chǎng)離奇詭異椭蹄,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)净赴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)绳矩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人玖翅,你說(shuō)我怎么就攤上這事翼馆。” “怎么了金度?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵应媚,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我猜极,道長(zhǎng)中姜,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任跟伏,我火速辦了婚禮丢胚,結(jié)果婚禮上翩瓜,老公的妹妹穿的比我還像新娘。我一直安慰自己嗜桌,他們只是感情好奥溺,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著骨宠,像睡著了一般浮定。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上层亿,一...
    開(kāi)封第一講書(shū)人閱讀 51,365評(píng)論 1 302
  • 那天桦卒,我揣著相機(jī)與錄音,去河邊找鬼匿又。 笑死方灾,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的碌更。 我是一名探鬼主播裕偿,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼痛单!你這毒婦竟也來(lái)了嘿棘?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤旭绒,失蹤者是張志新(化名)和其女友劉穎鸟妙,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體挥吵,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡重父,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了忽匈。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片房午。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖丹允,靈堂內(nèi)的尸體忽然破棺而出歪沃,到底是詐尸還是另有隱情,我是刑警寧澤嫌松,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站奕污,受9級(jí)特大地震影響萎羔,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜碳默,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一贾陷、第九天 我趴在偏房一處隱蔽的房頂上張望缘眶。 院中可真熱鬧,春花似錦髓废、人聲如沸巷懈。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)顶燕。三九已至,卻和暖如春冈爹,著一層夾襖步出監(jiān)牢的瞬間涌攻,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工频伤, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留恳谎,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓憋肖,卻偏偏與公主長(zhǎng)得像因痛,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子岸更,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354

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

  • D3是用于數(shù)據(jù)可視化的Javascript庫(kù)鸵膏。使用SVG,Canvas和HTML坐慰。結(jié)合強(qiáng)大的可視化技術(shù)和數(shù)據(jù)驅(qū)動(dòng)的...
    Evelynzzz閱讀 7,894評(píng)論 7 5
  • 2016-04-07 本文談?wù)?d3 中的數(shù)據(jù)綁定较性、scale、坐標(biāo)軸结胀。 一赞咙、d3.js 介紹 1. d3 是什么...
    HeyDelilah閱讀 1,358評(píng)論 0 4
  • 對(duì)集合的操作 關(guān)于d3.attr 一個(gè)可以處理很多情況的函數(shù),當(dāng)只傳入一個(gè)參數(shù)時(shí)糟港,如果是string攀操,則返回該屬性...
    陳堅(jiān)生閱讀 2,528評(píng)論 0 2
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)、插件秸抚、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,102評(píng)論 4 62
  • 沢田綱吉心里吃驚道:“波風(fēng)水門(mén)速和!竟然是四代火影波風(fēng)水門(mén)著。難怪三代火影對(duì)鳴人偷封印之書(shū)不管不問(wèn)還有點(diǎn)縱容剥汤,原來(lái)本來(lái)...
    白蘭杰索閱讀 886評(píng)論 0 0