㈠ D3.js 選擇
D3 可以選擇一些 HTML 或 SVG 元素並更改它們的樣式和/或屬性: d3.select 和 d3.selectAll 。
這兩個函數都將字元串作為其唯一參數。該字元串指定要選擇的元素,並採用 CSS 選擇器字元串的形式(例如 div.item , #my-chart 或 g:first-child )。
[//]: .classed 是一個 boolean.
除了將常量值傳遞給 .style , .attr , .classed , .property ,之外 .text , .html 您還可以傳入一個函數。例如:
該函數接受兩個參數,通常命名為 d 和 i 。第一個參數 d 是 連接數據 (或「數據」)。 i 是選擇中元素的 索引 。
此方法有兩個參數:第一個是指定事件類型的字元串;第二個是觸發事件時調用的函數(「回調函數」)。此回調函數有兩個參數,通常命名為 e 和 d 。 e 是 DOM 事件對象並且 d 是連接數據。
最常見的事件包括(有關詳細信息,請參閱 MDN 事件參考):
在事件回調函數中, this 變數綁定到觸發事件的 DOM 元素。這使我們能夠執行以下操作:
[//]:這 this 是一個 DOM 元素,而不是 D3 選擇,因此如果您想使用 D3 修改它,您必須首先使用 d3.select(this) .
.append 可以使用 D3和 .insert 方法將元素添加到選擇的元素中。可以使用 刪除元素 .remove 。
.append 將一個元素附加到選擇中的每個元素。如果元素已經有子元素,則新元素將成為 最後一個子元素 。第一個參數指定元素的類型。
.insert 類似於 .append 但它允許我們指定第二個參數, 該參數指定(作為 CSS 選擇器)在哪個元素之前插入新元素 。
.remove 從頁面中 刪除選擇中的所有元素 。例如,給定一些圓圈,您可以使用以下方法刪除它們:
大多數選擇方法的返回值是選擇本身。這意味著諸如 和 之類的選擇方法 .style 可以 .attr 鏈接 .on 起來。例如:
該 .each 方法允許您為 選擇的每個元素 調用一個函數。
回調函數有兩個參數,通常命名為 d 和 i 。第一個參數 d 是 連接數據 。 i 是選擇中元素的 索引 。 this 關鍵字是指選擇中的當前 HTML 或 SVG 元素。
這是一個示例, .each 用於為每個選擇的元素調用函數。該函數計算索引是奇數還是偶數,並相應地修改圓:
該 .call 方法允許調用一個函數, 選擇本身 作為第一個參數傳遞給該函數。
.call 在您想要對選擇進行操作的可重用函數時很有用。
例如, colorAll 獲取一個選區並將選區元素的填充設置為橙色:
您可以使用 D3 的 .filter 方法過濾選擇。第一個參數是一個函數,它返回 true 是否應該包含元素。過濾的選擇由該 filter 方法返回,因此您可以繼續鏈接選擇方法。
在此示例中,您過濾偶數元素並將它們著色為橙色:
通過調用 .sort 和傳入比較器函數對選擇中的元素進行排序。比較器函數有兩個參數,通常是 a 和 b ,它們代表被比較的兩個元素的數據。如果比較器函數返回負數, a 將放在前面 b ,如果是正數, a 將放在後面 b 。
㈡ d3.js力導向圖節點設置為圖片
設置方法如下:
1、首先打開節點設置,選擇固定節點。好雀亂
2、保存當前歲埋節點後,點擊左友檔上角的輸入,另存為pdf文件。
3、將pdf文件保存在桌面即可。
㈢ D3.js的V5版本-Vue框架中使用-流程圖
因最近公司項目用輪雹信到流程圖,網上找了些資料,自己寫寫,總結下
需要安裝dagre-d3庫,d3的流程圖庫。
//得到流程圖繪制對象
//繪制節點
this.graph.setNode()
//繪制連接肆慶
this.graph.setEdge()
溫馨提示:詳臘輪細使用可以去官網查詢
4.組件調用
㈣ [D3] 初識D3.js
調研了一下知識圖譜的前端顯示方案。最簡單的就是直接用Echarts等封裝好的關系圖來繪制,但難以個性化的設定。所以打算用更加接近底層的D3.js來做前端展示。
D3.js 看上去入門較難,官方文檔一眼望去,密密彎茄前麻麻全是英文,納答一點都不像做可視化工作的工具庫,非常勸退。
實際上,D3官方文檔並不是拿來入門閱讀的,而是使用的時候,用來查閱的。這種把全部函數密密麻麻分布在一頁里操作,其實在查閱的時候非常高效,只用ctrl+f,利用瀏覽器自帶的檢索功能,即可找到想要的功能解釋。
我花了半天的時間完成了D3.js的入門。方法是帶著一個實際功能需求來看Shirley Wu 的入門教學視頻,然後在Obeservable上實現這個案例。今天我想做一個滑動日期選擇器,有12個不同顏色的線段構成,每個線段代表一個月份,可以拖動選擇(今晚無法上傳圖片)。這種埋清個性化的設計,用Echarts等工具就難以滿足需求。D3做這個,就非常容易。
㈤ 怎麼用d3.js 製作3d效果
1,建立一個擴展名為js的文件,比如myjs.js
2,復制和中間的js代碼到這個文件中版,然後保存!
3,在權你的html頁面中加入js引用代碼:
注意:在引用js一定要注意路徑問題,你可以在你的網站根目錄中建一個文件夾,比如:js然後把js文件復制進行
㈥ D3.js畫圖:3D動態餅圖(齒輪圖)
通常畫可視化圖的工具很多,除了d3.js,還有echarts.js等。
通過比較,看起來ECharts.js更容易上手,但是因為我需要更靈活更符合個性定製化的工具,所以選了d3.js。
經過一段時間的磨煉,從折線圖、閉合路徑圖、蜂窩圖、直角坐標、極坐標都玩了個遍。
那這次就來個3D的吧,其實d3.js做3D的圖不是很容易的,有更好的選擇,但我認准了d3.js,一條道走到黑吧(想起高中數學老師說的話,當你解題解到一半時發現有更好的辦法,不,趕緊忘掉,接著當前的方法,只要方法沒錯,總能解出來,也許會傻一點,但是一定會有正確的結果;如果中途放棄,也許另一個方法更快更聰明,但也許更慢或者錯誤,不算到最後,誰都不知道誰最准確。我選擇相信他的話,於是。。。我成了程序員O(∩_∩)O哈哈~)。
有人鄙視拿來主義,要我說,你能拿來那是你的本事,如果還能在此基礎上做出更好的東西,何樂而不為呢?
每個人時間有限,每個項目也有deadline,不可能從每一個螺絲釘怎麼擰開始學起,不然怎麼會有那麼多五花八門的框架,會有封裝好的組件和介面,正因為有人已經做了前期工作,所以時間才能省下來做更有意義的事情,這就是站在巨人肩上的道理所在吧。
但是我們得明白拿來的東西的原理,以及出了問題該怎麼解決的能力。然後才能做出更厲害的東西。
首選當然是官網的例子咯,目測搜了一圈,終於找到一個3D Donut。就是你了,我的巨人。
把該地址的donut3d.js拷貝下來作為畫3D餅圖的基礎js,待會會在此基礎上修改,以滿足我的要求(長的像齒輪的要求)。
那我們就一睹她的芳容吧。
如果這張圖符合你的要求,那就打住,不用往下看了,直接看官網例子即可。
注意d3版本的問題,如果你用d3.v3.js,恭喜你,啥也不用改,直接拿來用;如果你用d3.v5.js,那稍微改下方法,比如d3.v5.js沒有d3.layout,所以d3.layout.pie改成d3.pie。我就是那個不幸的人,用的d3.v5.js。沒關系,改起來很快,運行下,看哪裡有錯,就改哪裡,O(∩_∩)O哈哈~so easy!
還是先上個我已經改好之後的3D餅圖(齒輪圖)吧,方便說明。
其實顯示的時候是個動態的,一節一節顯示出齒輪的。
背景是黑乎乎的,據說現在流行黑乎乎的背景,顯得有科技感,技術也要趕時髦啊,我這么fashion的人,做出來的東西也要fashion啊O(∩_∩)O~
從以上分析可以看出,難啃的骨頭在第4點。這個圖斷斷續續花了3天時間才搞定,為啥是斷斷續續呢,因為還有其他工作要做嘛,你懂得。
那就按順序一條一條實現,總有一天我們的願望都能實現!
首先新建svg及設置寬高。
我是切分成了32個小齒輪(包含透明的),如果你想分的更細,可以分成40或50個,只要你覺得好看就行。
既然要分成32個小立體快,那數據也要切分成32個。
通過以上處理,把數據整合成可以生成齒輪的完整數據dataset。
如果不增加左側面和右側面,那調用donut3d.js的draw方法後,會生成什麼樣的圖形呢?
請各位仔細看。
是不是有種被掏空的感覺?如果你覺得這樣挺好看,那也行,打住吧,後面就不用再看了;如果你想補齊其他面,請耐心往下看。
經過觀察和比較,增加左側面和右側面就能填滿空虛的心啦啦啦~
這次要在donut3d.js這個巨人身上添磚加瓦咯。
然後再用新增加的兩個方法畫出左右側面。
終於填滿需要的每一面,看上去像個立體齒輪圖了。
這個圖是很久之前做的,當時花了很長時間調試,每一個面有4條邊,定位2個點,再加上高度和內半徑,就可以計算出4個點,然後就可以畫出4條邊,最後填充顏色,一個面就完成了。
最近整理文檔時覺得有必要寫出來,方便以後查閱和探討,也告訴自己積累是一個長期過程,不急不躁,慢慢來,一步一步完成既定目標,總有一天你會走遍技術的每個角落。
現在我整理成vue組件,傳一個百分比的參數,就可以顯示3D齒輪圖了,我的3D齒輪圖也成巨人啦。
㈦ 初識 D3.js :打造專屬可視化
隨著現在自定義可視化的需求日益增長,Highcharts、echarts等高度封裝的可視化框架已經無法滿足用戶各種強定製性的可視化需求了,這個時候D3的無限定製的能力就脫穎而出。
如果想要通過D3完成可視化,除了對於D3本身API的學習, 關於web標準的HTML, SVG, CSS, Javascript 和 數據可視化的概念以及標准都是需要學習的。這無疑帶來了較高的學習門檻,但這也是值得的,因為掌握 D3 後,我們幾乎可以實現任何 2d 的可視化需求。
本文通過對D3核心模塊分析以及進行具體案例實踐的方式,來幫助初學者學習了解D3的繪圖思路。
D3的全稱是 Data-Driven Documents(數據驅動文檔),是基於數據來操作文檔的 JavaScript 庫,其核心在於使用繪圖指令對數據進行轉換,在源數據的基礎上創建新的可繪制數據, 生成SVG路徑以及通過數據和方法在DOM中創建數據可視化元素(如軸)。
相對於Echats等開箱即用的可視化框架來說,D3更接近底層,它可以直接控制原生的SVG元素,並且不直接提供任何一種現成的可視化圖表,所有的圖表都需我們在它的庫里挑選合適的方法構建而成,這也大大提高了它的可視化定製能力。而且D3 沒有引入新的圖形元素,它遵循了web標准(HTML, CSS, SVG 以及 Canvas )來展示數據 ,所以它可以不需要依賴其他框架獨立運行在現代瀏覽器中。
在V4版本後,D3的 API 現在已經被拆分成一個個模塊,我們可以根據自己的可視化需求進行按需載入。根據泛義可以將D3 API模塊分為以下的幾大類: DOM操作、數據處理,數據分析轉換、地理路徑,行為等 。
這里我們主要對 D3-selection 和 D3-scale 模塊進行解析:
D3-selection (選擇集) 是 D3js的核心模塊,主要是用來進行選擇元素,設置屬性、數據綁定,事件綁定等操作。
選擇元素: D3-selection 提供了兩種方法來獲取目標元素,d3.select():返回目標元素的第一個節點,d3.selectAll():返回目標元素的集合,乍一看有點類似原生API 的 querySelector 和 querySelectorAll,但是 d3.select 返回的是一個 selection 對象,querySelector 返回的是一個 NodeList 數組。通過控制台列印的信息,可以看到 selection 下的 groups 存放了所有選擇的元素集合,parents 存放了所有選中元素的父節點。
設置屬性或者綁定事件: 我們不需要關心 groups 的結構是怎麼樣的。當調用 selection.attr 或者 selection.style 的時候, selection 中的所有 group 的所有子元素都會被調用,group 存在的唯一影響是: 當我們傳參是一個function 的時候,例如 selection.attr('attrName', function(data, i)) 或 selection.on('click', function(data, i)) 時, 傳遞的 function(data, i) 中, 第二個參數 i 是元素在 group 中的索引而不是在整個 selection 中的索引。
數據綁定: 實際上是給選擇的DOM元素的 __data__ 屬性賦值,這里提供了3種方式進行數據綁定:
(1)給每一個單獨的 DOM 元素調用 selection.datum:d3.select('body').datum(20) 等價於 document.body.__data__ = 20
(2)從父節點中繼承來數據, 比如: append , insert , select,子節點會主動繼承父節點的數據:
(3) 調用 selection.data() 方法,支持傳入裝有基礎數據類型的數據,也支持傳入一個function(parentNode, groupIndex)根據節點索引與數據做映射,data()方法引入了 d3 中非常重要的 join 思想:
綁定 data 到 DOM 元素, 在D3中是通過比較 data 和 DOM 的 key 值來找到對應關系的。 如果我們沒有單獨設置 key 值,那麼默認根據 data 的下標索引來設定,但是當數據順序發生改變,這個默認下標 key 值 就變得不可靠了,這時我們可以使用 selection.data(data, keyFunction) 中的第二個參數 keyFunction,根據當前的數據返回一個對應的 key 值。通過下面的圖例可以看出,不管是有一個還是多個 group(每個group 都是獨立的),只要我們保證在任意一個 group 中的 key 值是唯一的,數據一旦發生變化都會反映給對應的 DOM 元素( update 的過程):
上面提到的都是data數據和DOM元素數量相同的情況下的數據綁定,那如果data數據和DOM元素數量不相同時,我們來看看 D3 又是如何進行數據綁定的:現在終於可以來介紹 D3-selecion 模塊的核心 Join 思想了,這個思想簡單來說就是 「不應該告訴D3去怎麼創建元素, 而是告訴D3,.selectAll() 得到的 selecion 集合應該和 .data(data) 綁定的數據要怎麼一一對應」。
從上圖可以看出,在進行 d3.data(data) 數據綁定的時候,會產生三種狀態的選擇集:
用 Join 的方式來理解意味著,我們要做的事情僅僅是聲明 DOM集合和數據集合之間的關系, 並且通過處理三個不同狀態的集合 enter、update 、 exit 來描述這種關系。這種方式可以大大簡化我們對DOM元素的操作,我們不需要再用 if 和 for 循環的方式來進行復雜的邏輯判斷,來得到我們需要得到的元素集合。並且在處理動態數據的時候,可以通過處理這三種狀態,輕松的展示實時數據和添加平滑的動態交互效果。
D3-scale (比列尺) 提供多種不同類型的比例尺。經常和 D3-axis 坐標軸模塊一起使用。
D3-scale 提供了多種連續性和非連續性的比例尺,總體可以將他們分為三大類:
常用的一些比例尺:
(1)d3-scaleLinear 線性比例尺(連續性輸入和連續性輸出)
可以看出,調用d3.scaleLinear()可以生成線性比例尺,domain()是輸入域,range()是輸出域,相當於將domain中的數據集映射到range的數據集中。
使用示例:
映射關系:
(2)d3-scaleTime 時間比例尺(連續性輸入和連續性輸出)
時間比例尺與線性比例尺類似,只不過輸入域變成了一個時間軸。正常我們使用比例尺都是個正序的過程,但是D3也提供了invert()以及invertExtent()方法,我們可以通過輸出域中的具體值得出對應輸入域的值。
使用示例:
(3)d3.scaleQuantize 量化比例尺(連續性輸入和離散性輸出)
量化比例尺是將連續的輸入域根據輸出域被分割為均勻的片段,所以它的輸出域是離散的。
使用示例:
映射關系:
(4)d3. scaleThreshold 閾值比例尺(連續性輸入和離散性輸出)
閾值比例尺可以為一組連續數據指定分割閾值,閾值比例尺默認的 domain:[0.5] 以及默認的 range:[0, 1] ,因此默認的 d3.scaleThreshold() 等價於 Math.round 函數。 閾值比例尺輸入域為 N 的話,輸出域必須為 N + 1,否則比例尺對某些值可能會返回 undefined,或者輸出域多餘的值會被忽略。
使用示例:
存在三種映射關系:
a. 當domain和range的數據是 N : N+1
b. 當domain和range的數據是 N : N + 大於1
c. 當domain和range的數據是 N + 大於0 : N
(5)d3.scaleOrdinal 序數比例尺(離散性輸入和離散性輸出)
與scaleLinear等連續性比例尺不同,序數比例尺的輸出域和輸入域都是離散的。
使用示例:
存在三種映射關系:
a.當domain和range的數據是一一對應
b.當domain少於range的數據
c.當domain多於range的數據
通過以上的學習,應該對d3是如何操作DOM以及坐標軸的數據映射為相應的可視化表現有了一定的了解,下面我們來實際運用這兩個模塊,來實現我們常見的可視化圖表:柱狀圖。
(1)首先添加一個SVG元素。
(2)根據我們上面說到 d3.scale 模塊以及 d3.axis 模塊繪制坐標軸,d3.scaleBand() 叫做序數分段比例尺,類似我們說的 d3.scaleOrdinal() 序數比例尺,但是它支持連續的數值類型的輸出域,離散的輸入域可以將連續的范圍劃分為均勻的分段。這里再講一個細節,在繪制網格的時候,我們並沒有額外添加 line 元素來實現,而是通過 d3.axis 坐標軸模塊的 axis.ticks() 方法對坐標軸刻度進行了設置,通過 tickSIze() 設置了刻度線長度,來模擬和圖表寬度相等的網格線,並且還可以通過 tickFormat() 對Y軸刻度值進行格式化轉換。
(3)坐標軸繪制好了後,我們通過數據綁定來繪制與之對應的矩形(rect)元素了。
(4)這個時候柱狀圖已經基本繪制好了,我們再豐富內容展示,添加標簽、標題等提示信息。
(5)最後我們通過給柱子綁定監聽事件,實現tooltips的信息浮層交互。
通過對 d3.selection 、d3.scale 以及 d3.axis等模塊的學習,我們已經可以繪制出常用的柱狀圖等圖表,我們也可以通過d3提供的其他模塊繪制出更加復雜的可視化效果,例如通過 d3-hierarchy(層級模塊) 實現層級樹圖可視化,d3-geo(地理投影) 實現地圖數據可視化等,本文講解的內容還只是D3庫的冰山一角。所以等我們掌握了D3後,限制我們實現可視化的不再是技術而是想像力。
㈧ D3.js使用簡書
d3.js 是一個可以基於數據來操作文檔的 JavaScript 庫,可以幫你使用HTML CSS JS SVG Canvas 來展示數據,它結合強大的視圖組件來驅動Dom操作.
d3引入的使用
也可以單陸山獨使用某個模攜悉慎塊,比如單獨使用d3-selection
可以模塊化引入
Selections 允許強大的數據驅動文檔對象模型(DOM):設置attributes,styles,HTML 或 text 內容,選擇集的方法通常選擇當前的選擇當前的選擇集或者新的選擇集,因此允許進行鏈式調用。
等價於:
選中符合條件的第一個元素,選擇條件為 selector 字元串。如果沒有元素被選中則返回空選擇集,如果選擇器有多個,那就返回匹配第一辯敬個選擇集
選擇所有與制定的selector匹配的元素,返回一個數組。如果沒有元素被選中,則返回的空的選擇集。
視圖移動以及縮放是一種流行的交互技術 縮放行為通過 d3-zoom 模塊來實現,縮放本身與DOM元素無關,可以用於SVG,HTML 或者 Canvas。
創建一個新的縮放行為,並返回該行為。zoom既是一個對象又是一個函數,通過selection.call()來應用到元素本身上
事件綁定 .zoom 雙擊禁用縮放 以及 禁止滾動齒輪縮放
㈨ 《精通D3.js:互動式數據可視化高級編程》epub下載在線閱讀,求百度網盤雲資源
《精通D3.js:互動式數據可視化高級編程》(呂之華)電子書網盤下載免費在線閱讀
鏈接:https://pan..com/s/1mhMFTVhz8mlnbixdVFw1fw
書名:精通D3.js:互動式數據可視化高級編程
作者:呂之華
豆瓣評分:6.7
出版社:電子工業出版社
出版年份:2015-9-1
頁數:404
內容簡介:
《精通D3.js:互動式數據可視化高級編程》以當前流行的數據可視化技術D3.js為主要內容,分為三大部分,共計13章。第一部分講述基礎知識,第二部分學習製作各種常見圖表,第三部分講解互動式圖表及地圖的進階應用。《精通D3.js:互動式數據可視化高級編程》是一個相對完整的D3.js教程,講解此技術所有重要的知識點,既有基礎入門知識,又有相對深入的內容。筆者秉持以下原則:由易到難,循序漸進,圖文並茂,清晰易懂。
《精通D3.js:互動式數據可視化高級編程》適合有一定計算機基礎的讀者,需要熟悉C、C++、Java、JavaScript等至少一門編程語言,能夠理解基礎的數據結構和演算法。
作者簡介:
呂之華,廣西桂林人,1989年生。2012年畢業於西北農林科技大學軟體工程專業,同年獲日本政府國家獎學金赴日,就讀於日本岩手大學設計與媒體專業,2015年獲得碩士學位。目前正攻讀博士學位。
2014年與好友創辦OUR D3.JS數據可視化專題站,以D3.js為題發表一系列教學文章,獲得讀者好評。本書即以專題站的文章為基礎擴充而成,經過耐心地歸納、整理、調查、修補,內容更加豐富易懂。
作者喜讀儒家經典、三國演義等中國古籍,喜看古裝劇,熱愛中華傳統文化。閑暇時練習書法,養氣修身。工作之餘喜歡旅遊、健身、游泳。不喜與人相爭,近來潛心研讀儒佛道三家學說。
㈩ d3js樹圖非同步載入節點path路徑不對
d3js是一個用於前端數則悶據可視化的JavaScript庫,其中包含一個用於創建樹狀圖的模塊。在使用d3js創建樹狀圖時,我們可以通過非同步方式一步步載入節點,以避免數據量過大而導致的性能問題。對於創建樹狀圖時遇到的節點path路徑錯誤問題,可能有以下原因和解決辦法:1.數據格式不對:如果數據格式不符合d3js對數據格式的要求,就會導致節點path路徑不對。要解決這個問題需要檢查數據格式是否正確。2.缺少節點的子節點數據:如果節點的子節點數據沒有成功載入到內存中,就會導致節點path路徑不正確。要解決這個問題需要檢查代碼中子節點數據是否正確載入。3.節點ID重復:如果樹狀圖中的節點ID有重復,就會導致節點path路徑錯誤。要解決這個問題,需要確保節點ID不重復。4.圖片資源路徑錯誤啟盯襪:如果非同步載入節點過程中,非同步請求的圖片資源路徑不正確,也會導致節點path路徑錯誤。要解決這個問題,需要確保圖片資源路徑正確。5.給節點設置的path路徑規則不正確:在d3js中,節點path路徑通常是基於節點在樹中的位置來計算的。如果節點path路徑規則不正確,也會導致節點path路徑錯誤。要解決這個問題,需要仔細檢查節點path路徑規則是否正確,並修改為正確的路徑規則。延伸擴展:除了非同步載入節點以避免性能問題外,還有一些其他方法可以優化d3js樹狀圖的性能,例如:-針對大數據集,可以使用分層繪制等技巧來減少DOM元素數量,提升繪制效率-預處理數據,將原始數據轉化為d3js樹狀圖所需要的格式,避免在繪制過程中進行復雜計悄激算-使用緩存機制,將已經繪制完成的圖形緩存起來,避免重復計算-限定動畫時間,減少動畫時間,提高視覺效果和性能。