>在本文中,我想帶您完成我最近構建的示例項目- a完全原始的使用D3庫的可視化類型,該類型展示了這些組件中的每個組件如何累加以使D3一個很棒的圖書館。
D3代表數據驅動的文檔。這是一個JavaScript庫,可用於製作各種出色的數據可視化和圖表。>如果您曾經看過《紐約時報》中的任何出色的互動故事,那麼您已經看到了D3的行動。您還可以在此處查看使用D3構建的一些很棒的項目。
>
>有三個主要因素確實使D3在那裡的任何其他庫中脫穎而出:調整通貨膨脹時,儘管每工業生產力一直在飆升,但家庭收入在40%的社會中保持了幾乎恆定的。它確實是最高的20%,它獲得了更多的好處(在該括號內,如果您看著前5%的前5%,那麼差異更加令人震驚)。
這是我想以令人信服的方式傳播的信息,這為使用一些D3.js提供了絕佳的機會,所以我開始繪製一些想法。>
素描。製作簡單的線圖,條形圖或氣泡圖非常容易,但是我想做一些不同的東西。 >我發現人們傾向於用作對不平等問題的擔憂的最常見類比是“如果餡餅變大,那麼還有更多事情要解決”。直覺是,如果GDP的總份額在很大程度上增加了,那麼即使有些人獲得了pie的較薄
,但它們仍然會更好地> 🎜>。但是,正如我們所看到的,餡餅完全有可能變得更大和讓人們總體上變得更少。 我可視化這些數據的第一個想法看起來像這樣:
的想法是,我們將擁有此脈動餅圖,每個切片代表美國收入分配的五分之一。每個派片的面積與該人口的收入收入有關,圖表的總面積將代表其總GDP。
但是,我很快遇到了一些問題。事實證明,人的大腦在區分不同區域的大小方面非常差。當我更具體地將其映射出來時,該消息並沒有像應該如此明顯的地方:
這是在實踐中最終尋找的方式:
但是,我致力於做出獨特的可視化,我想將此消息錘回回家,即
pie 可以得到更大的> ,而ashare> share >它可以得到較小的。現在我有了我的主意,是時候用D3構建它了。 >
>借用代碼。 >您可能會認為我會從頭開始編寫我的前幾行代碼行,但是您錯了。這是D3,由於我們正在與D3合作,因此我們總是可以從社區中找到一些預先編寫的代碼,以使我們脫穎而出。 >
>我們正在創建全新的東西,但是它與常規餅圖有很多共同點,因此我快速查看了bl.ocks.org,我決定使用Mike Bostock的經典實施, D3的創造者之一。該文件可能已經復制了數千次,而寫它的人是帶有JavaScript的真正嚮導,因此我們可以確定我們已經從一個不錯的代碼開始了。此文件寫在D3 V3中,該文件現在已經過時了兩個版本,因為版本5最終在上個月發布。 D3 V4的一個很大的變化是,庫切換到使用平坦的名稱空間,因此比例功能諸如d3.scale.ordinal()的編寫一樣,就像d3.scaleordinal()相反。在版本5中,最大的更改是,數據加載函數現在是按照承諾構造的,這使得更容易一次處理多個數據集。
> 為了避免混亂,我已經遇到了創建此代碼的更新V5版本的麻煩,我已將其保存在blockbuilder.org上。我還將語法轉換為適合ES6慣例,例如將ES5匿名函數切換到箭頭函數。這是我們已經開始的:
>
然後,我將這些文件複製到我的工作目錄中,並確保我可以在自己的計算機上複製所有內容。如果您想自己跟隨本教程,那麼您可以從我們的GitHub倉庫中克隆該項目。您可以從文件啟動器.html中的代碼開始。請注意,您將需要一台服務器(例如該服務器)來運行此代碼,因為它依賴於Fetch API檢索數據。
>讓我快速介紹此代碼的工作原理。
瀏覽我們的代碼
首先,我們在文件頂部聲明了一些常數,我們將使用該常數來定義餅圖的大小:
>這使我們的代碼超級重複使用,因為如果我們想使其更大或更小,那麼我們只需要擔心在此處更改這些值。
>
接下來,我們將SVG畫布附加到屏幕上。如果您對SVG的了解不多,那麼您可以將畫布視為我們可以繪製形狀的頁面上的空間。如果我們嘗試在該區域之外繪製SVG,那麼它根本不會出現在屏幕上:
<span>const width = 540; </span><span>const height = 540; </span><span>const radius = Math.min(width, height) / 2; </span>>我們正在用圖表區域的ID抓住一個空的DIV,並致電D3.Select()。我們還使用d3.append()方法將SVG畫布附加,並且使用d3.attr()方法為其寬度和高度設置了一些尺寸。
>我們還將SVG組元素附加到此畫布上,這是一種特殊類型的元素,我們可以將其用於將元素構造在一起。這使我們可以使用組元素的轉換屬性將整個可視化轉移到屏幕的中心。
之後,我們正在設置一個默認量表,我們將使用該量表來為我們的派的每一個分配新顏色:>
接下來,我們有幾行設置了D3的派佈局:
<span>const svg = d3.select("#chart-area") </span> <span>.append("svg") </span> <span>.attr("width", width) </span> <span>.attr("height", height) </span> <span>.append("g") </span> <span>.attr("transform", <span>`translate(<span>${width / 2}</span>, <span>${height / 2}</span>)`</span>); </span>轉換的數組
,然後我們可以用。 然後,我們需要定義一個可以用來繪製弧的路徑生成器。路徑生成器允許我們在Web瀏覽器中繪製路徑SVG。 D3真正要做的就是將數據與屏幕上的形狀相關聯,但是在這種情況下,我們要定義更複雜的形狀,而不是簡單的圓或正方形。路徑SVG通過定義在之間繪製線路的路由來工作,我們可以使用其D屬性來定義。
這可能是:<span>const color = d3.scaleOrdinal(["#66c2a5", "#fc8d62", "#8da0cb","#e78ac3", "#a6d854", "#ffd92f"]); </span>>
d屬性包含一個特殊的編碼,可以讓瀏覽器繪製我們想要的路徑。如果您真的想知道此字符串的含義,則可以在MDN的SVG文檔中找到它。對於D3中的編程,我們實際上不需要了解此特殊編碼的任何信息,因為我們的發電機會為我們吐出D屬性,我們只需要使用一些簡單的參數來初始化。 對於弧線,我們需要為我們的路徑發生器一個Innerradius和像素中的外段值,並且發電機將分類為我們計算每個角度的複雜數學:
>對於我們的圖表,我們為Innerradius使用了零值,這為我們提供了標準的餅圖。但是,如果我們想繪製甜甜圈圖,那麼我們要做的就是插入一個小於我們的outerradius值的值。
<span>const pie = d3.pie() </span> <span>.value(d => d.count) </span> <span>.sort(null); </span>>
>幾次函數聲明後,我們將使用d3.json()函數加載數據:
>
>使用此行,我們將在單擊我們的一個無線電按鈕時切換我們正在查看的數據:
>首先,我們使用默認函數參數作為值。如果我們將參數傳遞到我們的update()函數(當我們第一次運行時),我們將使用該字符串,否則我們將從單擊事件中獲得所需的值我們的無線電輸入。
>每次我們的可視化更新時,這都會將新的數據與我們的SVG在屏幕上關聯。我們將數據(“蘋果”或“橙色”的數組)傳遞到我們的PIE()佈局函數中,該功能正在計算一些開始角度和端角,可用於繪製我們的弧線。現在,此路徑變量包含屏幕上所有弧的特殊 。
接下來,我們將更新數據數組中仍然存在的屏幕上的所有SVG。我們在此處添加了一個過渡 - D3庫的絕妙功能 - 傳播這些更新超過200毫秒: >我們在d3.transition()呼叫上使用attrtwien()方法來定義D3應使用的自定義過渡,以更新其每個ARC的位置(使用D屬性過渡)。如果我們試圖將過渡到大多數屬性添加過渡,但是我們需要這樣做,但是我們需要這樣做以在不同的路徑之間過渡。 D3無法真正弄清楚如何在自定義路徑之間過渡,因此我們使用Arctween()函數來讓D3知道如何在每時每刻都應繪製我們的每條路徑。 這是此功能的樣子: 我們在此處使用d3.interpaly()來創建所謂的插裝器。當我們調用我們存儲在I變量中的函數,值在0到1之間,我們將獲得一個介於此之間的值。 _current和a。在這種情況下,this._current是一個包含我們正在查看的PIE切片的開始和末端角度的對象,A表示我們正在更新為。
>
>
適應代碼 >現在我們在本地環境中有一些代碼,並且我們了解它在做什麼,我將切換我們正在查看的數據,以便它可以與我們感興趣的數據一起使用。 >我已經包含了我們將在項目的數據/文件夾中使用的數據。由於此新的incomes.csv文件這次是CSV格式(這是可以使用Microsoft Excel打開的文件),因此我將使用d3.csv()函數,而不是D3.json( )函數: 此函數基本上與D3.json()基本相同 - 將我們的數據轉換為我們可以使用的格式。我還將type()initializer函數作為這裡的第二個參數刪除,因為這是我們舊數據的特定於。
>
為了解決此問題,我將添加一個稱為repardata()的新函數以替換我們以前擁有的type()函數,該功能將在加載時迭代我們的每個數據: >每年,此功能將返回具有值數組的對象,我們將將其傳遞到我們的數據加入中。我們將這些值中的每一個都標記為名稱字段,並且根據我們已經擁有的收入價值,我們為它們提供了數值。我們還在跟踪比較每年的平均收入。 >在這一點上,我們的數據格式可以使用: >我將在數據中的第一年生成圖表,然後我會擔心在剩下的幾年中更新它。 >目前,我們的數據始於2015年,在1967年結束,因此我們需要扭轉此數組,然後才能做其他任何事情: 與普通餅圖不同,對於我們的圖形,我們要固定每個弧的角度,並且隨著可視化更新的變化,半徑更改。為此,我們將更改PIE佈局上的Value()方法,以便每個派slice始終具有相同的角度: input >一旦我們可以訪問數據,我們就會添加這個量表,我們說我們的投入應在0到我們數據集中最大的價值之間,這是去年最富有的群體的收入在我們的數據中(數據[49]。值[4]。值)。對於域,我們設置了我們的輸出值應範圍的間隔。
請注意,我們還在此處使用 。我們這樣做的原因是,我們希望我們的餡餅切片區域與每個小組的收入成正比,而不是半徑。由於區域=πr2>,我們需要使用平方根刻度來解釋這一點。
然後,我們可以使用此量表來更新Update()函數中的ARC Generator的Outerradius值:
>
使事情更有用。我還將添加一些標籤,這些標籤為我們提供了原始數字。我將用以下方式替換文件正文中的所有HTML代碼
然後,每當我們的數據更改時,我將使用jQuery更新所有這些: >我還將對我們文件頂部的CSS進行一些編輯,這將為我們提供每個弧的傳奇,並以我們的標題為中心:
(join/exit/exit/extim/update/enter)。 >
>然後,我將在UPDATE()函數的末尾更新此版本。
>我應該注意,對於我們來說,在我們的第一個call to Update()之後,添加每個圓圈 >我們的弧路徑(SVG層取決於將它們添加到屏幕的順序,而不是通過其z索引)。
使其互動
play/暫停
>每當我們的按鈕單擊時,我們的if/else block在這裡將定義不同的行為,具體取決於我們的按鈕是“播放”按鈕還是“暫停”按鈕。如果我們單擊的按鈕說“播放”,我們將按鈕更改為“暫停”按鈕,然後開始我們的間隔循環。另外,如果按鈕是“暫停”按鈕,我們將其文本更改為“ play”,我們將使用clearInterval()函數來阻止循環運行。 對於我們的滑塊,我想使用jQuery UI庫隨附的滑塊。我將其包含在我們的HTML中,並且我將寫幾行以將其添加到屏幕上: >我們可以在Update()函數末尾添加此行,以便我們的滑塊移動到我們的循環運行時正確的一年:
>我將向我們的CSS扔幾行,以使一切看起來有些整潔: 希望,本教程展示了D3的真實力量,讓您絕對創建任何您可以想像的東西。 >從頭開始始終是一個艱難的過程,但是獎勵值得。如果您想學習如何創建自己的自定義可視化,這裡有一些在線資源,您可能會發現有幫助: > D3與其他JavaScript庫有何不同?之所以獨特,是因為它使您可以靈活地創建其他庫無法使用的數據可視化。它使您可以直接操縱DOM,這意味著您可以完全控制可視化的最終外觀。 D3還使用聲明的方法,這意味著您定義了想要最終結果的外觀,而D3算出瞭如何到達那裡。 > d3提供了幾種將交互性添加到可視化的方法。您可以使用事件偵聽器響應諸如點擊或鼠標運動之類的用戶操作,並且可以使用過渡來對數據進行動畫更改。 D3還支持縮放和平移,這對於探索大型數據集可能很有用。 我是否需要知道Javascript來使用D3? ,對JavaScript有效使用D3是必要的。 D3是一個JavaScript庫,因此您需要編寫JavaScript代碼來創建可視化。但是,D3的API旨在直觀且易於學習,因此,即使您不是JavaScript專家,您仍然可以使用D3創建強大的可視化。是的,可以與其他JavaScript庫或框架一起使用D3。例如,您可以使用D3來創建使用React或Angular。非常適合實時數據可視化。它具有靈活的數據更新機制,可讓您在新數據進來時輕鬆更新可視化。這使D3成為儀表板或實時數據饋送等應用程序的絕佳選擇。 <span>const width = 540;
</span><span>const height = 540;
</span><span>const radius = Math.min(width, height) / 2;
</span>
在D3版本5.x中,呼叫d3.json()返回諾言,這意味著D3將獲取它在我們給它的相對路徑上找到的JSON文件的內容,並執行該功能加載後,我們將在The The The The The The The()方法中調用。然後,我們可以訪問我們在回調的數據參數中查看的對象。 <span>const svg = d3.select("#chart-area")
</span> <span>.append("svg")
</span> <span>.attr("width", width)
</span> <span>.attr("height", height)
</span> <span>.append("g")
</span> <span>.attr("transform", <span>`translate(<span>${width / 2}</span>, <span>${height / 2}</span>)`</span>);
</span>
如果我們添加console.log(data);向我們的d3.json回調的口頭聲明,我們可以查看我們現在正在使用的數據:<span>const color = d3.scaleOrdinal(["#66c2a5", "#fc8d62", "#8da0cb","#e78ac3", "#a6d854", "#ffd92f"]);
</span>
>
<span>const pie = d3.pie()
</span> <span>.value(d => d.count)
</span> <span>.sort(null);
</span>
<span><span><span><svg</span> width<span>="190"</span> height<span>="160"</span>></span>
</span> <span><span><span><path</span> d<span>="M10 80 C 40 10, 65 10, 95 80 S 150 150, 180 80"</span> stroke<span>="black"</span> fill<span>="transparent"</span>/></span>
</span><span><span><span></svg</span>></span>
</span>
<span>const arc = d3.arc()
</span> <span>.innerRadius(0)
</span> <span>.outerRadius(radius);
</span>
來處理我們的弧的行為。這通常涉及執行數據加入,退出舊元素,更新屏幕上的現有元素,並添加添加到我們數據中的新元素。在此示例中,我們不必擔心退出元素,因為我們在屏幕上始終具有相同數量的餅片。 <span>const width = 540;
</span><span>const height = 540;
</span><span>const radius = Math.min(width, height) / 2;
</span>
<span>const svg = d3.select("#chart-area")
</span> <span>.append("svg")
</span> <span>.attr("width", width)
</span> <span>.attr("height", height)
</span> <span>.append("g")
</span> <span>.attr("transform", <span>`translate(<span>${width / 2}</span>, <span>${height / 2}</span>)`</span>);
</span>
<span>const color = d3.scaleOrdinal(["#66c2a5", "#fc8d62", "#8da0cb","#e78ac3", "#a6d854", "#ffd92f"]);
</span>
>不用擔心您是否無法完全遵循它的工作原理,因為它是D3中的一個相當高級的話題。這個庫的偉大是,您不需要了解其所有內部工作,就可以用它創建一些強大的東西。只要您能理解需要更改的位,就可以抽像一些並不是完全必不可少的細節。 <span>const width = 540;
</span><span>const height = 540;
</span><span>const radius = Math.min(width, height) / 2;
</span>
<span>const svg = d3.select("#chart-area")
</span> <span>.append("svg")
</span> <span>.attr("width", width)
</span> <span>.attr("height", height)
</span> <span>.append("g")
</span> <span>.attr("transform", <span>`translate(<span>${width / 2}</span>, <span>${height / 2}</span>)`</span>);
</span>
回想一下,在我們的最後一個示例中,我們有一個數組,其中包含一個項目,適用於要在屏幕上顯示的每個派。將此與我們目前擁有的東西進行比較,這是一個對象,其鑰匙為1至5,代表我們要繪製的每個派。 <span>const color = d3.scaleOrdinal(["#66c2a5", "#fc8d62", "#8da0cb","#e78ac3", "#a6d854", "#ffd92f"]);
</span>
<span>const pie = d3.pie()
</span> <span>.value(d => d.count)
</span> <span>.sort(null);
</span>
<span>const width = 540;
</span><span>const height = 540;
</span><span>const radius = Math.min(width, height) / 2;
</span>
接下來,每次可視化更新時,我們都需要更新半徑。為此,我們需要提出一個可以使用的量表。比例尺是D3中的一個函數,在兩個值之間採用<span>const svg = d3.select("#chart-area")
</span> <span>.append("svg")
</span> <span>.attr("width", width)
</span> <span>.attr("height", height)
</span> <span>.append("g")
</span> <span>.attr("transform", <span>`translate(<span>${width / 2}</span>, <span>${height / 2}</span>)`</span>);
</span>
<span>const color = d3.scaleOrdinal(["#66c2a5", "#fc8d62", "#8da0cb","#e78ac3", "#a6d854", "#ffd92f"]);
</span>
>
<span>const pie = d3.pie()
</span> <span>.value(d => d.count)
</span> <span>.sort(null);
</span>
<span><span><span><svg</span> width<span>="190"</span> height<span>="160"</span>></span>
</span> <span><span><span><path</span> d<span>="M10 80 C 40 10, 65 10, 95 80 S 150 150, 180 80"</span> stroke<span>="black"</span> fill<span>="transparent"</span>/></span>
</span><span><span><span></svg</span>></span>
</span>
<span>const arc = d3.arc()
</span> <span>.innerRadius(0)
</span> <span>.outerRadius(radius);
</span>
使其動態
<span>const width = 540;
</span><span>const height = 540;
</span><span>const radius = Math.min(width, height) / 2;
</span>
>我們正在使用Bootstrap的網格系統在此處構建頁面,這使我們可以將頁面元素整潔地格式化為框。 <span>const svg = d3.select("#chart-area")
</span> <span>.append("svg")
</span> <span>.attr("width", width)
</span> <span>.attr("height", height)
</span> <span>.append("g")
</span> <span>.attr("transform", <span>`translate(<span>${width / 2}</span>, <span>${height / 2}</span>)`</span>);
</span>
我們最終得到的是相當可觀的東西:<span>const color = d3.scaleOrdinal(["#66c2a5", "#fc8d62", "#8da0cb","#e78ac3", "#a6d854", "#ffd92f"]);
</span>
>我正在使用array.foreach()方法來完成此操作,儘管我也可以再次使用D3的常規
<span>const pie = d3.pie()
</span> <span>.value(d => d.count)
</span> <span>.sort(null);
</span>
>我還想添加一行以顯示美國的平均收入,我每年都會更新。首先,我將首次添加平均線:<span><span><span><svg</span> width<span>="190"</span> height<span>="160"</span>></span>
</span> <span><span><span><path</span> d<span>="M10 80 C 40 10, 65 10, 95 80 S 150 150, 180 80"</span> stroke<span>="black"</span> fill<span>="transparent"</span>/></span>
</span><span><span><span></svg</span>></span>
</span>
><span>const arc = d3.arc()
</span> <span>.innerRadius(0)
</span> <span>.outerRadius(radius);
</span>
>
>這是我用來將這些元素添加到屏幕上的HTML:
>我們需要在這兩個元素中添加一些事件聽眾,以設計我們要尋找的行為。
首先,我想定義我們的<span>const width = 540;
</span><span>const height = 540;
</span><span>const radius = Math.min(width, height) / 2;
</span>
<span>const svg = d3.select("#chart-area")
</span> <span>.append("svg")
</span> <span>.attr("width", width)
</span> <span>.attr("height", height)
</span> <span>.append("g")
</span> <span>.attr("transform", <span>`translate(<span>${width / 2}</span>, <span>${height / 2}</span>)`</span>);
</span>
>在這裡,我們使用幻燈片選項將事件偵聽器連接到滑塊。每當我們的滑塊轉移到另一個值時,我們都會將計時器更新到此新值,並且在當年的數據中運行了Update()函數。
<span>const color = d3.scaleOrdinal(["#66c2a5", "#fc8d62", "#8da0cb","#e78ac3", "#a6d854", "#ffd92f"]);
</span>
<span>const pie = d3.pie()
</span> <span>.value(d => d.count)
</span> <span>.sort(null);
</span>
>我們擁有它 - 我們的成品 - 一個功能齊全的交互式數據可視化,一切都按預期工作。
<span><span><span><svg</span> width<span>="190"</span> height<span>="160"</span>></span>
</span> <span><span><span><path</span> d<span>="M10 80 C 40 10, 65 10, 95 80 S 150 150, 180 80"</span> stroke<span>="black"</span> fill<span>="transparent"</span>/></span>
</span><span><span><span></svg</span>></span>
</span>
>
d3(代表數據驅動的文檔)是一個JavaScript庫,該庫是廣泛用於創建交互式數據可視化的JavaScript庫。它允許您將任意數據綁定到文檔對像模型(DOM),然後將數據驅動的轉換應用於文檔。 D3不是一個單層框架,它試圖提供所有可以想像的功能。取而代之的是,它解決了問題的關鍵:根據數據有效操縱文檔。這避免了專有表示形式,並具有非凡的靈活性,揭示了HTML,SVG和CSS等網絡標準的全部功能。 我可以將D3用於大數據集嗎?是的,D3能夠處理大型且複雜的數據集。它具有強大的數據操作功能,可讓您以任何格式使用數據。 D3還具有用於從不同來源加載數據的內置功能,使其更容易與您的現有數據基礎結構集成。
>如何使我的D3可視化互動互動?
>在廣泛的領域中,從新聞到新聞業到D3?商業科學。一些常見的用例包括創建交互式圖,構建動態圖表和圖形,可視化複雜的網絡以及創建自定義數據驅動的動畫。
>有許多可用於學習D3的資源。 D3官方網站有大量的文檔和示例,並且有許多在線教程和課程深度涵蓋D3。練習也是關鍵 - 您使用D3越多,您的概念和API都會變得越舒適。
> d3?
以上是與現代JavaScript和D3的交互式數據可視化的詳細內容。更多資訊請關注PHP中文網其他相關文章!