數據可視化【十一】樹狀圖

Constructing a node-link tree visualization

首先將節點之間的連線畫出來。
使用json函數讀取文件以后,使用hierarchy等函數得到連線的數組,然后綁定這個數組,給每個元素添加一個path,繪畫使用的是一個函數linkHorizontal(因為這里是水平的樹狀圖,如果你想繪制垂直的也可以使用linkVertical,需要注意的是,水平的需要交換每個連線的x和y,垂直的不需要)
index.js

json('data.json').then(data =>{const root = hierarchy(data);const links = treeLayout(root).links();const linkPathGenerator = linkHorizontal().x(d => d.y).y(d => d.x)//上面的x和y進行了替換,是因為我們想要繪制水平的樹狀圖,如果使用垂直的,x和y應該是對應的g.selectAll('path').data(links).enter().append('path').attr('d', linkPathGenerator);
}

style.css

path {fill: none;stroke: #f7a4a4;
}

Adding text labels to the nodes

通過root.descendants獲得每個節點的位置數組,綁定這個數組以后添加text,同樣需要注意水平的xy需要分開。然后使用一些技巧使得文字變得更加好看

const treeLayout = tree().size([Height, Width]);json('data.json').then(data =>{const root = hierarchy(data);const links = treeLayout(root).links();const linkPathGenerator = linkHorizontal().x(d => d.y).y(d => d.x)//上面的x和y進行了替換,是因為我們想要繪制水平的樹狀圖,如果使用垂直的,x和y應該是對應的g.selectAll('path').data(links).enter().append('path').attr('d', linkPathGenerator);g.selectAll('text').data(root.descendants()).enter().append('text').attr('x', d => d.y).attr('y', d => d.x).text(d => d.data.data.id);});

Using the Margin Convention(約定)

為了讓文字布局更加好看,我們需要設置Margin來設置邊框

const margin = {top:0, right: 70, bottom: 0, left:90};
const innerWidth = width - margin.left - margin.right;
const innerHeight = height - margin.top - margin.bottom;const treeLayout = tree().size([innerHeight, innerWidth]);const zoomG = svg.attr('width', width).attr('height', height).append('g');const g = zoomG.append('g')
.attr('transform',`translate(${margin.left},${margin.top})`);

然后后面都在g上添加元素即可。這里設置了兩層g實際上是為了后面放大縮小的時候使用

Tweaking(調整) label alignment(隊列) and size

我們還需要設置標簽的位置,標簽的字體大小:
index.js

g.selectAll('text').data(root.descendants()).enter().append('text').attr('x', d => d.y).attr('y', d => d.x).attr('dy', '0.32em')//使得節點被線從中間穿過.attr('text-anchor', d => d.children ? 'middle' : 'start')//將文字放在中間.attr('font-size', d => 3.2-d.depth + 'em')	//使得文字大小隨層數遞減.text(d => d.data.data.id);

style.css

text {text-shadow:
/*  給標簽添加白色的陰影,這樣就不會被線擋住    */-1px -1px 3px white,-1px 1px 3px white,1px -1px 3px white,1px 1px 3px white;pointer-events: none;	
/*   鼠標經過文字的時候不會變成可編輯的樣子(因為本來就是不可編輯的) */
}

Panning & Zooming

這個和以前一樣,在call函數里面添加zoom函數:
index.js

svg.call(zoom().on('zoom',() =>{zoomG.attr('transform', event.transform);
}));

Curran說弄兩層g這樣就可以解決放大再縮小以后邊框丟失的問題,但是我發現好像并沒有什么卵用。。。

Using a custom font

選擇一個好看的字體也很重要,首先在Google Fonts里面找到一個喜歡的字體,然后點擊select
在這里插入圖片描述
然后把link放在html文件里面,后面的字體放在對應的選擇器里面就可以了。

效果圖:在這里插入圖片描述
在這里插入圖片描述
代碼地址:https://vizhub.com/Edward-Elric233/706152caf5ca4aae992cc371f2d5891a

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/383602.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/383602.shtml
英文地址,請注明出處:http://en.pswp.cn/news/383602.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

數據可視化【十二】 顏色圖例和尺寸圖例

有了前面的知識,制作一個圖例應該不是很難,關鍵是我們想要制作一個可以在其他地方進行使用的圖例,這樣就需要能夠動態地設置圖例的大小,位置,等等。 這里直接上代碼: colorLegend.js export const color…

數據可視化【十三】地區分布圖

在前面的博客中已經介紹了如何繪制地圖,這一節學習如何繪制地區分布圖。如果對繪制地圖還不熟悉的話可以了解一下之前我寫的博客:數據可視化【十】繪制地圖 Intergrating(整合) TopoJSON with tabular data(列表數據) 在前面的博客中沒有使用到tsv文件…

3.01【python正則表達式以及re模塊】

python正則表達式以及re模塊 元字符 正則表達式的語法就由表格中的元字符組成,一般用于搜索、替換、提取文本數據 元字符含義.匹配除換行符以外的任何單個字符*匹配前面的模式0次或1次匹配前面的模式1次或多次?匹配前面的模式0次或1次[]用于定義字符集&#xff…

Linux配置編程環境+云服務器上傳文件

Java環境配置 Ubuntu https://www.cnblogs.com/lfri/p/10437266.html Centos https://blog.csdn.net/qq_21077715/article/details/85536399 Tomcat配置 Centos https://blog.csdn.net/qq_21077715/article/details/85541685 https://www.cnblogs.com/newwind/p/9904561…

gbd + cgbd

gbd:傳送門 cgbd:傳送門 | 傳送門

數據可視化【十四】交互式過濾地區分布圖

在前面的博客中已經介紹了如何繪制地區分布圖,這一節學習如何繪制交互式過濾地區分布圖。如果對繪制地區分布圖還不熟悉的話可以了解一下之前我寫的博客:數據可視化【十三】地區分布圖 整體的框架仍然是在之前的基礎上進行修改,主要是添加交…

Ubuntu環境搭建

本文記錄了一些常用的Ubuntu軟件 然后首先修改軟件源:軟件和更新->Ubuntu軟件->下載自:其他站點(修改為阿里云) 在關閉的時候需要更新什么的 然后修改更新方式,將不支持的更新去掉 常用的Windows軟件 網易云…

1 兩數之和

雖然只是一道很簡單的題,但是也給我很多思考。 剛看到這道題的時候沒有仔細思考,直接寫了個排序和二分查找,想著對每個數字查找另一個數字會不會出現,復雜度是O(nlognnlogn)O(nlognnlogn)O(nlognnlogn),主要訓練了一下…

834 樹中距離之和

這道題我自己的想法只有對每個點都用一遍Dijkstra然后再求和,顯然會超時,所以我都沒有嘗試。 研究了一下題解,發現題解很巧妙,自己對樹的處理還是太稚嫩,之前樹鏈剖分學的都忘光了。 對于固定根節點的,我…

75 顏色分類

題目已經提示可以一遍掃描了但是我還是沒有想到,其實雙指針的想法我已經有了,但是一想到有問題就覺得無法實現。這也揭示了我思維上的問題:用一種方法解決問題遇到困難第一件事情不是想著如何攻克而是想著換一種方法。對自己的思維也不自信。…

141 環形鏈表

要求使用空間復雜度為O(1)的方法,可是我并沒有想到。我想到的只有用一個哈希表記錄一下所有訪問過的節點。 題解給出的空間復雜度為O(1)的方法是使用兩個指針,然后讓一個一次跑一步,一個一次跑兩步,如果跑的快的能追上跑的慢的就…

數據可視化【十五】

經驗法則:在顏色不相鄰的時候加上背景顏色顏色的個數為6~12比較好。 顏色其實很大程度上由背景決定而不是他本身決定。 D3 Scale-Chromatic 有許多顏色刻度,可以根據自己的需要進行選擇。 參考論文:Practical Rules for Using Color in Cha…

Ubuntu修改/刪除主目錄下的中文文件夾

在Ubuntu的主目錄下一般是有一些中文的目錄,例如桌面,視頻等等,還無法修改名稱,在一群英文文件夾里面顯得有些突兀(Ubuntu終端下的中文一點也不好看),就想把這些文件夾修改一下,結果…

19 刪除鏈表的倒數第N個

題目的意思很簡單,就是刪除一個鏈表倒數第N個節點。 需要用到鏈表的標準操作:快慢指針。 我們讓一個快指針先指向第N個元素,這個時候快指針總比慢指針領先N個元素,等到快指針指向鏈表尾部的時候慢指針就指向需要刪除的元素。 之前…

844. Backspace String Compare

題目的意思大概是有兩個字符串,其中的#表示退格鍵,讓比較最后兩個字符串是否相當。 很容易想到的思路就是用一個棧進行模擬這個過程,特別需要注意如果一個串是空串也是可以退格的。 但是很容易想到的另一個特性就是,前面的字符有…

鏈表三連擊

876:鏈表的中間節點 206:反轉鏈表 143:重排練表 鏈表的中間節點 這個題一看就是最簡單的快慢指針,但是在具體實現的時候我還是猶豫思考了一下:要不要在鏈表前面放置啞節點,快指針應該什么時候判斷已經到達…

D3力導引圖

學習力導引圖的時候在網上沒有找到什么好的教程,支離破碎地進行了一段時間的學習,還閱讀了d3的關于d3的官方文檔,但是始終覺得不的要領。這里記錄一下我學習力導引圖的一些心得以及推薦一下學習資源。 學習資源 官方文檔:https:…

Ubuntu Pycharm啟動后卡住無法操作

昨天還好好的,今天打開Pycham突然卡住了,卡在了那個preparing workspace的地方,然后在網上搜索了很多方法都沒用。直到在網上看到有個大佬說是因為搜狗輸入法的問題,我才突然記起來昨天安裝了搜狗輸入法。。。 kill掉卡住的Pycha…

327 區間和的個數

題目描述 Given an integer array nums, return the number of range sums that lie in [lower, upper] inclusive. Range sum S(i, j) is defined as the sum of the elements in nums between indices i and j (i ≤ j), inclusive. Note: A naive algorithm of O(n2) is t…

瀏覽器訪問本地文件

之前一直苦惱無法在瀏覽器訪問本地文件,尤其是寫的網頁需要調用外部數據的時候,今天學習到可以用python很方便的解決問題 如果有python3環境,直接在對應的文件夾下運行(這里是Ubuntu環境,如果是Windows應該在命令行也…