1. 程式人生 > >【 D3.js 入門系列 --- 9.4 】 集群圖的制作

【 D3.js 入門系列 --- 9.4 】 集群圖的制作

all users bject nodes -- 部分 函數 選擇 water

本人的個人博客為: www.ourd3js.com

csdn博客為: blog.csdn.net/lzhlzz

轉載請註明出處,謝謝。


集群圖( Cluster )通經常使用於表示包括與被包括關系。

如今我們給出數據。並將其可視化。數據的內容為:中國裏包括的部分省份,省份裏包括的部分城市。

我們講數據文件寫在一個 JSON 文件裏,再用 D3 來讀取。

JSON(JavaScript Object Notation) 是一種輕量級的數據交換格式。關於它的語法規則。請各位自行查詢百度百科等。數據例如以下:

{
"name":"中國",
"children":
[
	{ 
	  "name":"浙江" , 
  	  "children":
  	  [
	  	  	{"name":"杭州" },
	  	  	{"name":"寧波" },
	  	  	{"name":"溫州" },
	  	  	{"name":"紹興" }
  	  ] 
  	},
  	
	{ 
		"name":"廣西" , 
		"children":
		[
			{"name":"桂林"},
			{"name":"南寧"},
			{"name":"柳州"},
			{"name":"防城港"}
		] 
	},
	
	{ 
		"name":"黑龍江",
		"children":
		[
			{"name":"哈爾濱"},
			{"name":"齊齊哈爾"},
			{"name":"牡丹江"},
			{"name":"大慶"}
		] 
	},
	
	{ 
		"name":"新疆" , 
		"children":
		[
			{"name":"烏魯木齊"},
			{"name":"克拉瑪依"},
			{"name":"吐魯番"},
			{"name":"哈密"}
		]
	}
]
}
事實上我們光從數據上看。也非常easy看出它們是用來表示什麽的。是什麽關系。好,如今開始進行可視化。

相同的,先要用 Layout 轉換數據。

var cluster = d3.layout.cluster()
    .size([height, width - 200]);
上面代碼定義了一個 cluster 的數據轉換函數。.size 函數用於設定轉換後的尺寸。接下來要用這個函數來轉換數據:

d3.json("city.json", function(error, root) {
	
  var nodes = cluster.nodes(root);
  var links = cluster.links(nodes);
  
  console.log(nodes);
  console.log(links);

}

d3.json 用於讀取 JSON 文件。

要註意。d3.json 僅僅能用於網絡讀取。所以您必須搭建一個server來使用它。比方用Apache等搭建一個簡易server來做試驗。假設你將網頁源文件和JSON文件放於本地同一目錄下。將會出現以下錯誤提示:
XMLHttpRequest cannot load file:///C:/Users/lzhlzz/Dropbox/lzh/d3js/9.4/city.json. Cross origin requests are only supported for HTTP.

json 函數後面跟一個無名函數 function ,裏面的參數 root 用於讀取數據的內容。後面兩行代碼調用 cluster 分別轉換數據。並保存到 nodes 和 links 中。

再後面兩行用於輸出轉換後的數據文件。例如以下圖所看到的:

nodes:

技術分享

links:

技術分享

nodes 中有各個節點的子節點、深度、名稱、位置(x,y)信息。links 中有連線兩端( source , target )的節點信息。

有了轉換後的數據,就能夠繪制了。

事實上 D3 已經基本上為我們準備好了繪制的函數。我們要學習的不過查詢並使用它們。

繪制線條。我們能夠使用:

var diagonal = d3.svg.diagonal()
    .projection(function(d) { return [d.y, d.x]; });
這是用於繪制對掉線的函數, .projection 用於設定它的投影。繪制的時候,我們這樣使用它:

var link = svg.selectAll(".link")
      .data(links)
      .enter()
      .append("path")
      .attr("class", "link")
      .attr("d", diagonal);
這樣就繪制了全部節點之間的連線。接下來我們再繪制節點。

節點還是使用 svg 中的 circle 來繪制。這裏就不復述了。前面已經講過了。您也能夠自己查看源碼。結果圖為:

技術分享

假設您想查看源碼,請點擊以下的網址。右鍵瀏覽器選擇查看:

http://www.ourd3js.com/demo/cluster.html






【 D3.js 入門系列 --- 9.4 】 集群圖的制作