一些d3.js的圖


布局:layout

作用: 將不適合用于繪圖的數(shù)據(jù)轉(zhuǎn)換成了適合用于繪圖的數(shù)據(jù)。所以說愈魏,布局的作用可以解釋為:數(shù)據(jù)轉(zhuǎn)換。

今天選力導(dǎo)向圖(Force)和餅狀圖(Pie)作為例子。


力導(dǎo)向圖:

在二維或三維空間里配置節(jié)點寸宵,節(jié)點之間用線連接檩帐,稱為連線术幔。各連線的長度幾乎相等,且盡可能不相交湃密。節(jié)點和連線都被施加了力的作用诅挑,力是根據(jù)節(jié)點和連線的相對位置計算的四敞。根據(jù)力的作用,來計算節(jié)點和連線的運動軌跡拔妥,并不斷降低他們的能量忿危,最終達到一種能量很低的安定狀態(tài)。力導(dǎo)向圖能表示節(jié)點之間多對多的關(guān)系没龙。

現(xiàn)在我們拿到了這樣的一些初始數(shù)據(jù):

            var nodes = [ { name: "計科"    }, { name: "經(jīng)管" },
                      { name: "法學(xué)"    }, { name: "文藝"   },
                      { name: "理學(xué)"   }, { name: "信息"    },
                         { name: "土建"    } ];
                     
            var edges = [  { source : 0  , target: 1 } , { source : 0  , target: 2 } ,
                       { source : 0  , target: 3 } , { source : 1  , target: 4 } ,
                       { source : 1  , target: 5 } , { source : 1  , target: 6 }  ];    

這兩個數(shù)組分別是表示節(jié)點和連線铺厨。

要作圖,我們首先需要在頁面中定義一塊svg畫布硬纤。

// 定義一下svg的寬和高努释。
 var height = 1000;
 var width = 1000;
var svg = d3.select("body").append("svg").attr("width",width).attr("height",height); // 添加一塊svg畫布

接下來需要一個力導(dǎo)向圖的布局:

var force = d3.layout.force()
                     .nodes(nodes)
                     .links(links)
                     .size([width,height])
                     .linkDistance(150)
                     .charge([400]);
force.start()// 開始作用

上面的代碼中 nodes:指定節(jié)點數(shù)組 links :指定連線數(shù)組 size : 指定作用范圍 linkDistance:指定連線長度 charge: 相互之間的作用力


轉(zhuǎn)換后,節(jié)點對象里多了一些變量咬摇。其意義如下:
index - 節(jié)點的索引號
px, py - 節(jié)點上一個時刻的坐標
x, y - 節(jié)點的當前坐標
weight - 節(jié)點的權(quán)重


接下來伐蒂,繪制的圖形元素有:

  • line 線段,連線
  • cilcle 圓肛鹏,表示節(jié)點
  • text 文字逸邦,描述節(jié)點
//添加連線 
 var svg_edges = svg.selectAll("line")
     .data(edges)
     .enter()
     .append("line")
     .style("stroke","#ccc")  //線的顏色
     .style("stroke-width",1); // 線的寬度
 
 var color = d3.scale.category20(); //產(chǎn)生隨機顏色
 
 //添加節(jié)點 
 var svg_nodes = svg.selectAll("circle")
     .data(nodes)
     .enter()
     .append("circle")
     .attr("r",20)  // 圓的半徑
     .style("fill",function(d,i){
         return color(i);   // 填充圓的顏色
     })
     .call(force.drag);  //使得節(jié)點能夠拖動

 //添加描述節(jié)點的文字
 var svg_texts = svg.selectAll("text")
     .data(nodes)
     .enter()
     .append("text")
     .style("fill", "black")
     .attr("dx", 20)
     .attr("dy", 8) // 如果不要這兩行,字會出現(xiàn)在節(jié)點的右上角
     .text(function(d){
        return d.name;
     });

最后在扰,在監(jiān)聽器里完成刷新:

force.on("tick", function(){ //對于每一個時間間隔
    //更新連線坐標
    svg_edges.attr("x1",function(d){ return d.source.x; })
        .attr("y1",function(d){ return d.source.y; })
        .attr("x2",function(d){ return d.target.x; })
        .attr("y2",function(d){ return d.target.y; });
 
    //更新節(jié)點坐標
    svg_nodes.attr("cx",function(d){ return d.x; })
        .attr("cy",function(d){ return d.y; });

    //更新文字坐標
    svg_texts.attr("x", function(d){ return d.x; })
       .attr("y", function(d){ return d.y; });
 });

下面是餅狀圖的代碼:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>一個餅狀圖</title>
    </head>
    <body>
        <script src="http://d3js.org/d3.v3.min.js" charset="UTF-8"></script>>
        <script>
            var dataset = [40,23,15,34,55,23];
            var dataset2 = ["土建","法學(xué)","經(jīng)管","計科","制造","文藝"];
            
            var width = 1000;
            var height = 1000;
            
            var svg = d3.select("body")
                        .append("svg")
                        .attr("width",width)
                        .attr("height",height);
                        
            var color = d3.scale.category20();
            
            var pie = d3.layout.pie() //創(chuàng)建一個pie布局缕减,他擁有處理數(shù)據(jù)的能力
                        
            var piedata = pie(dataset); // 把數(shù)據(jù)交給pie來處理,結(jié)果保存在piedata中
            
            var outR = 300;  //設(shè)置餅狀圖的內(nèi)徑
            var innerR = 100; // 外徑
            
            //現(xiàn)在我們需要一個弧生成器
            var arc = d3.svg.arc()        
                        .innerRadius(innerR)
                        .outerRadius(outR);
            
            //svg中添加幾個g元素芒珠,每個用于放一段弧
            var arcs =svg.selectAll("g")
                         .data(piedata)
                         .enter()
                         .append("g")
                         .attr("transform","translate("+(width/2)+","+(width/2)+")"); 
            //平移桥狡,這里是指向右和向下各平移width/2;
            //給每個g添加一個path
            arcs.append("path")
                .attr("fill",function(d,i){
                    return color(i);
                })
                .attr("d",function(d,i){
                    return arc(d); arc(d)的d是被綁定的數(shù)據(jù),arc(d)返回值賦給路徑的d屬性
                });
                
            arcs.append("text")
                .attr("transform",function(d){
                    return "translate("+arc.centroid(d)+")" // 弧線中心
                })
                .attr("text-anchor","middle") //居中
                .text(function(d,i){
                    return dataset2[i]; // 這里將要添加的文本放入便可以了
                })
        </script>
    </body>
</html>

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末皱卓,一起剝皮案震驚了整個濱河市裹芝,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌娜汁,老刑警劉巖嫂易,帶你破解...
    沈念sama閱讀 222,627評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異掐禁,居然都是意外死亡怜械,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評論 3 399
  • 文/潘曉璐 我一進店門傅事,熙熙樓的掌柜王于貴愁眉苦臉地迎上來缕允,“玉大人,你說我怎么就攤上這事蹭越≌媳荆” “怎么了?”我有些...
    開封第一講書人閱讀 169,346評論 0 362
  • 文/不壞的土叔 我叫張陵般又,是天一觀的道長彼绷。 經(jīng)常有香客問我巍佑,道長,這世上最難降的妖魔是什么寄悯? 我笑而不...
    開封第一講書人閱讀 60,097評論 1 300
  • 正文 為了忘掉前任萤衰,我火速辦了婚禮,結(jié)果婚禮上猜旬,老公的妹妹穿的比我還像新娘脆栋。我一直安慰自己,他們只是感情好洒擦,可當我...
    茶點故事閱讀 69,100評論 6 398
  • 文/花漫 我一把揭開白布椿争。 她就那樣靜靜地躺著,像睡著了一般熟嫩。 火紅的嫁衣襯著肌膚如雪秦踪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,696評論 1 312
  • 那天掸茅,我揣著相機與錄音椅邓,去河邊找鬼。 笑死昧狮,一個胖子當著我的面吹牛景馁,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播逗鸣,決...
    沈念sama閱讀 41,165評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼合住,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了撒璧?” 一聲冷哼從身側(cè)響起透葛,我...
    開封第一講書人閱讀 40,108評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎沪悲,沒想到半個月后获洲,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,646評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡殿如,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,709評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了最爬。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片涉馁。...
    茶點故事閱讀 40,861評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖爱致,靈堂內(nèi)的尸體忽然破棺而出烤送,到底是詐尸還是另有隱情,我是刑警寧澤糠悯,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布帮坚,位于F島的核電站妻往,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏试和。R本人自食惡果不足惜讯泣,卻給世界環(huán)境...
    茶點故事閱讀 42,196評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望阅悍。 院中可真熱鬧好渠,春花似錦、人聲如沸节视。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽寻行。三九已至霍掺,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間拌蜘,已是汗流浹背杆烁。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留拦坠,地道東北人连躏。 一個月前我還...
    沈念sama閱讀 49,287評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像贞滨,于是被迫代替她去往敵國和親入热。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,860評論 2 361

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