d3.js入門

本來一直是使用echarts來畫圖的,結(jié)果畫好了以后,公司又要使用d3來畫,沒有對它進(jìn)行特別的深入,只是了解了一下,能完成需求.
還有就是雖然有d3的官網(wǎng)可以學(xué)習(xí),但是我不翻墻的話網(wǎng)站基本上是沒辦法進(jìn)去的 ,為了以后可以方便的使用d3的一些東西,我覺得自己有必要把它寫下來.
先看效果圖


image.png

是不是感覺和echarts畫出來的一毛一樣,我也這么覺得......下次再研究兩者有啥區(qū)別吧.

代碼直接貼過來

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        #container{
            background-color: #ddd;
            width: 500px;
            height: 350px;
        }
        path{
            fill: none;
            stroke: #4682B4;
            stroke-width: 2 ;
        }
        .domain,.tick line{
            stroke: gray;
            stroke-width: 1;
        }
    </style>
</head>
<body>
<div id="container"></div>
<script src="d3.js"></script>
<script>
    var width = 500,
        height = 300,
        margin = {left:50,top:30,right:20,bottom:20},
        g_width = width-margin.left-margin.right,
        g_height = height-margin.top-margin.bottom;
    var svg = d3.select("#container")
        .append("svg")
        .attr("width",width)
        .attr("height",height)
    var g = d3.select("svg")
        .append("g")
       .attr("transform","translate("+margin.left+","+margin.top+")")
    var dataset = [
        {x: 0, y: 11}, {x: 1, y: 35},
        {x: 2, y: 23}, {x: 3, y: 78},
        {x: 4, y: 55}, {x: 5, y: 18},
        {x: 6, y: 98}, {x: 7, y: 100},
        {x: 8, y: 22}, {x: 9, y: 65}
    ];

    var scale_x = d3.scale.linear()
        .domain(d3.extent(dataset, function(d) {
            return d.x;
        }))
        .range([0,g_width])
    var scale_y = d3.scale.linear()
        .domain([0, d3.max(dataset,function(d) {
            return d.y;
        })])
        .range([g_height,0])
    var x_axis = d3.svg.axis().scale(scale_x),
        y_axis = d3.svg.axis().scale(scale_y).orient("left");
    g.append("g")
        .call(x_axis)
        .attr("transform","translate(0,"+g_height+")")
    g.append("g")
        .call(y_axis)
        .append("text")
        .text("Price($)")
        .attr("transform","rotate(-90)")
        .attr("text-anchor","end")
        .attr("dy","1em")

     //繪制曲線
        var line_generator = d3.svg.line()
            .x(function(d){
                return scale_x(d.x);
            })
            .y(function(d){
                return scale_y(d.y);
            })
       
            .interpolate("cardinal");
        d3.select("g")
            .append("path")
            .attr("d",line_generator(dataset))
</script>
</body>

上面的代碼同樣html css js三部分

HTML部分


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
     css代碼
</head>
<body>
<div id="container"></div>

<script src="d3.js"></script>
<script>
      js代碼
</script>
</body>

css部分

    <style>
        #container{
            background-color: #ddd;
            width: 500px;
            height: 350px;
        }
        path{
            fill: none;//可以對曲線進(jìn)行填充色
            stroke: #4682B4;/*曲線的顏色*/
            stroke-width: 2 ;/*曲線的寬度*/
        }
        .domain,.tick line{/*刻度尺的樣式*/
            stroke: gray;
            stroke-width: 1;
        }
    </style>

path 是對曲線進(jìn)行的一系列樣式設(shè)置

JS部分

  • 0 模擬數(shù)據(jù)
   var dataset = [
        {x: 0, y: 11}, {x: 1, y: 35},
        {x: 2, y: 23}, {x: 3, y: 78},
        {x: 4, y: 55}, {x: 5, y: 18},
        {x: 6, y: 98}, {x: 7, y: 100},
        {x: 8, y: 22}, {x: 9, y: 65}
    ];

  • 1 設(shè)置圖表大小:首先要設(shè)置畫布的大小,然后用margin來存儲(chǔ)圖表的邊距信息,計(jì)算出圖表的寬度和高度
 var width = 500,
        height = 300,
        // SVG畫布邊緣與圖表內(nèi)容的距離
        margin = {left:50,top:30,right:20,bottom:20},
        g_width = width-margin.left-margin.right,
        g_height = height-margin.top-margin.bottom;
  • 2 添加畫布
 //svg  // 創(chuàng)建一個(gè)分組用來組合要畫的圖表元素
    var svg = d3.select("#container")
        .append("svg")
        //屬性:寬二蓝、高
        .attr("width",width)
        .attr("height",height)
    //g元素
    var g = d3.select("svg")
        .append("g")
        // // 設(shè)置該分組的transform屬性
        .attr("transform","translate("+margin.left+","+margin.top+")")

d3.select("#container")選擇container元素.往這個(gè)里面添加一個(gè)子元素"svg".,給這個(gè)svg設(shè)定一些屬性峰档,再往“svg”中添加一個(gè)”g”元素并設(shè)定一些屬性。

  • 3 設(shè)置橫軸方向和縱軸方向的區(qū)域(Domains)和范圍(Ranges)
    畫布添加好了 可是我要怎么畫呢 ?首先要確定定義域和值域
 //設(shè)置比例縮放
    //創(chuàng)建x軸的比例尺(線性比例尺)
    var scale_x = d3.scale.linear()//創(chuàng)建了線性比例尺
        .domain(d3.extent(dataset, function(d) {//定義定義域
            return d.x;
        }))
        .range([0,g_width])//定義值域
    // 創(chuàng)建y軸的比例尺(線性比例尺)
    var scale_y = d3.scale.linear()
        .domain([0, d3.max(dataset,function(d) {//定義定義域
            return d.y;
        })])
        .range([g_height,0])//定義值域

這段代碼是為了讓我們導(dǎo)入的數(shù)據(jù)與圖表的大小相適應(yīng)篡悟,range知道是圖表范圍的大小,他是一個(gè)尺寸大小躲雅。這段代碼告訴D3我們要畫些東西在x軸上粮揉,這些東西是時(shí)間/日期的一個(gè)實(shí)體织中。

而domain指的是數(shù)據(jù)的區(qū)域,extent返回的是最小的x或y到最大的x或y這樣一個(gè)跨度病游,所以唇跨,最小的x或y就對應(yīng)于上面range的最小值0

對于y軸的值域,g_height 表示的是當(dāng)數(shù)據(jù)為最大值即“8”的時(shí)候,輸出最高點(diǎn)為g_height衬衬。這里要注意由于瀏覽器從左到右买猖、從上到下的坐標(biāo)系數(shù)值是逐漸增到,因此我們將range的值設(shè)成[g_height佣耐,0]即可實(shí)現(xiàn)整一個(gè)的翻轉(zhuǎn)
//政勃,因?yàn)镾VG畫布的y軸與傳統(tǒng)認(rèn)知上的y軸的方向是反著來的,所以在定義y軸的定義域和值域?qū)?yīng)關(guān)系時(shí)兼砖,也需要反著來

  • 4 設(shè)置x,y坐標(biāo)軸
    設(shè)置好坐標(biāo)比例問題,就要開始創(chuàng)建坐標(biāo)軸,添加坐標(biāo)軸函數(shù):axis()
  //創(chuàng)建x軸 添加坐標(biāo)軸函數(shù):axis()
    var x_axis = d3.svg.axis().scale(scale_x),
        // 創(chuàng)建y軸
        y_axis = d3.svg.axis().scale(scale_y).orient("left").ticks(5);;

坐標(biāo)軸axis初始化方法通過d3.svg.axis()來調(diào)用奸远,然后調(diào)用.scale(scale_x)用前面定義的scale_x來給坐標(biāo)軸設(shè)定刻度既棺, .orient()設(shè)定刻度相對坐標(biāo)軸的位置,.ticks()告訴D3在坐標(biāo)軸上設(shè)定差不多幾個(gè)刻度就夠了懒叛,比方說你要D3給你的Y軸設(shè)定大概20個(gè)刻度 y_axis = d3.svg.axis().scale(scale_y).orient("left").ticks(20);

image.png
  • 5 添加x,y坐標(biāo)軸
    既然比例設(shè)置好了,坐標(biāo)軸也設(shè)置好了,畫布也添加完成了,那么就先把坐標(biāo)軸畫出來
    //依次添加X丸冕、Y坐標(biāo)軸,并通過偏移量的設(shè)置使得X坐標(biāo)軸往下移
    // 添加SVG元素并與x軸進(jìn)行“綁定”
    g.append("g")
        .call(x_axis)
        .attr("transform","translate(0,"+g_height+")")
    // 添加SVG元素并與y軸進(jìn)行“綁定”
    g.append("g")
        .call(y_axis)
        .append("text")
        .text("Price($)")
        .attr("transform","rotate(-90)")
        .attr("text-anchor","end")
        .attr("dy","1em")
  • 6 繪制曲線
    什么都準(zhǔn)備好了,就可以繪制曲線了
//繪制曲線
        var line_generator = d3.svg.line()
            .x(function(d){
                return scale_x(d.x);
            })
            .y(function(d){
                return scale_y(d.y);
            })
            // 選擇線條的類型
            .interpolate("cardinal");
    // 添加path元素,并通過line_generator()計(jì)算出值來賦值
        d3.select("g")
            .append("path")
            .attr("d",line_generator(dataset))

這樣,一個(gè)曲線圖就完成啦 !!

如果想在曲線上添加點(diǎn)的話,就加入下面的代碼

d3.select("g").selectAll('circle')
        .data(dataset)
        .enter()
        .append('circle')
        .attr('cx', function(d) {
            return scale_x(d.x);
        })
        .attr('cy', function(d) {
            return scale_y(d.y);
        })
        .attr('r', 3)
        .attr('fill', function(d) {
            return "white";
        });

這樣畫出來的曲線圖就有點(diǎn)啦


image.png

有曲線圖當(dāng)然也有面積圖 ,如果你想繪制面積圖表,注意需要三個(gè)參數(shù),y0將原來的線型圖變成了封閉的面積圖咯 將上述步驟6中繪制曲線的代碼直接換成一下代碼就可以實(shí)現(xiàn)了

 var myArea = d3.svg.area()
            .x(function (d) {
                return scale_x(d.x)
            })
            .y0(g_height)
            .y1(function(d){
                return scale_y(d.y)
            })
            .interpolate("cardinal")

        d3.select("g")
            .append("path")
            .attr("d",myArea(dataset))
            .style("fill","pink")
image.png

完成了這些基本上就可以應(yīng)付一些簡單的d3畫圖啦

官網(wǎng):http://www.w3.org
不過我老是訪問不了 汗(⊙﹏⊙)b!!!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末薛窥,一起剝皮案震驚了整個(gè)濱河市胖烛,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌诅迷,老刑警劉巖佩番,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異罢杉,居然都是意外死亡趟畏,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進(jìn)店門滩租,熙熙樓的掌柜王于貴愁眉苦臉地迎上來赋秀,“玉大人,你說我怎么就攤上這事律想×粤” “怎么了?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵技即,是天一觀的道長著洼。 經(jīng)常有香客問我,道長姥份,這世上最難降的妖魔是什么郭脂? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮澈歉,結(jié)果婚禮上展鸡,老公的妹妹穿的比我還像新娘。我一直安慰自己埃难,他們只是感情好莹弊,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著涡尘,像睡著了一般忍弛。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上考抄,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天细疚,我揣著相機(jī)與錄音,去河邊找鬼川梅。 笑死疯兼,一個(gè)胖子當(dāng)著我的面吹牛然遏,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播吧彪,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼待侵,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了姨裸?” 一聲冷哼從身側(cè)響起秧倾,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎傀缩,沒想到半個(gè)月后那先,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡赡艰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年胃榕,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瞄摊。...
    茶點(diǎn)故事閱讀 40,561評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖苦掘,靈堂內(nèi)的尸體忽然破棺而出换帜,到底是詐尸還是另有隱情,我是刑警寧澤鹤啡,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布惯驼,位于F島的核電站,受9級(jí)特大地震影響递瑰,放射性物質(zhì)發(fā)生泄漏祟牲。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一抖部、第九天 我趴在偏房一處隱蔽的房頂上張望说贝。 院中可真熱鬧,春花似錦慎颗、人聲如沸乡恕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽傲宜。三九已至,卻和暖如春夫啊,著一層夾襖步出監(jiān)牢的瞬間函卒,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工撇眯, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留报嵌,地道東北人虱咧。 一個(gè)月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像沪蓬,于是被迫代替她去往敵國和親彤钟。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評論 2 359

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

  • D3.js 入門教程(連載) 近年來跷叉,可視化越來越流行逸雹,許多報(bào)刊雜志、門戶網(wǎng)站云挟、新聞媒體都大量使用可視化技術(shù)梆砸,使得...
    極客學(xué)院Wiki閱讀 12,349評論 2 25
  • 本教程是一個(gè)簡單的入門教程,能夠幫助初學(xué)者快速掌握D3的基礎(chǔ)知識(shí)园欣。 本節(jié)內(nèi)容介紹了添加元素帖世、綁定數(shù)據(jù)、使用數(shù)據(jù)沸枯、矢...
    笨笨的笨小孩閱讀 2,026評論 0 1
  • D3是用于數(shù)據(jù)可視化的Javascript庫日矫。使用SVG,Canvas和HTML绑榴。結(jié)合強(qiáng)大的可視化技術(shù)和數(shù)據(jù)驅(qū)動(dòng)的...
    Evelynzzz閱讀 7,896評論 7 5
  • 2017-6-18學(xué)經(jīng)匯報(bào): 一哪轿、學(xué)經(jīng)日期:2017年6月18日 農(nóng)歷五月廿五 陰 星期日 寶...
    b0a4ca4b06a4閱讀 519評論 0 0
  • 窮人是被匱乏的生活遮蔽了視野才一直處于貧困中?歷史學(xué)家布雷格曼說翔怎,不對窃诉,窮人之所以窮就是因?yàn)槿卞X。這個(gè)答案有...
    會(huì)飛的貓666閱讀 402評論 0 0