国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

目錄
> d3在通過平穩(wěn)過渡的添加交互式和動態(tài)元素方面表現(xiàn)出色,通過優(yōu)雅的編程和語法增強視覺體驗和用戶參與。
>如何使我的D3可視化互動互動?
>在廣泛的領域中,從新聞到新聞業(yè)到D3?商業(yè)科學。一些常見的用例包括創(chuàng)建交互式圖,構建動態(tài)圖表和圖形,可視化復雜的網(wǎng)絡以及創(chuàng)建自定義數(shù)據(jù)驅(qū)動的動畫。
首頁 web前端 js教程 與現(xiàn)代JavaScript和D3的交互式數(shù)據(jù)可視化

與現(xiàn)代JavaScript和D3的交互式數(shù)據(jù)可視化

Feb 15, 2025 am 09:41 AM

與現(xiàn)代JavaScript和D3的交互式數(shù)據(jù)可視化

>在本文中,我想帶您完成我最近構建的示例項目 - a完全原始的使用D3庫的可視化類型,該類型展示了這些組件中的每個組件如何累加以使D3一個很棒的圖書館。

D3代表數(shù)據(jù)驅(qū)動的文檔。這是一個JavaScript庫,可用于制作各種出色的數(shù)據(jù)可視化和圖表。

>如果您曾經(jīng)看過《紐約時報》中的任何出色的互動故事,那么您已經(jīng)看到了D3的行動。您還可以在此處查看使用D3構建的一些很棒的項目。>

>學習曲線對于進入圖書館的啟動非常陡峭,因為D3有一些特殊的怪癖,您可能從未見過。但是,如果您可以超越足夠的D3學習的第一階段,那么您很快就可以為自己構建一些非常酷的東西。

>

>有三個主要因素確實使D3在那里的任何其他庫中脫穎而出:

  1. 靈活性。 D3允許您獲取任何類型的數(shù)據(jù),并將其與瀏覽器窗口中的形狀直接關聯(lián)。這些數(shù)據(jù)可以是絕對的>,允許大量有趣的用例創(chuàng)建完全原始的可視化。 優(yōu)雅。在更新之間添加具有
  2. 平滑過渡>的交互式元素很容易。圖書館的書面形式是精美的
  3. ,一旦您掌握了語法,就可以很容易地保持代碼清潔和整潔。> 社區(qū)。已經(jīng)有一個龐大的生態(tài)系統(tǒng),它已經(jīng)使用了D3,他們很容易在線共享他們的代碼。您可以使用bl.ocks.org和blockbuilder.org等網(wǎng)站快速查找其他人的預先編寫代碼,并將這些摘要直接復制到您自己的項目中。> 鑰匙要點
  4. 代表數(shù)據(jù)驅(qū)動的文檔的
  5. d3是一個強大的JavaScript庫,用于創(chuàng)建多樣化和交互式數(shù)據(jù)可視化,如它在紐約時報等平臺中的廣泛使用所證明的。
庫提供了無與倫比的靈活性,使開發(fā)人員可以將任何類型的數(shù)據(jù)綁定到瀏覽器中的圖形表示,從而在可視化設計中促進創(chuàng)造力。

> d3在通過平穩(wěn)過渡的添加交互式和動態(tài)元素方面表現(xiàn)出色,通過優(yōu)雅的編程和語法增強視覺體驗和用戶參與。

    >一個強大的開發(fā)人員社區(qū)支持D3,在Bl.ocks.org等平臺上提供了豐富的共享代碼和示例資源,可以利用這些代碼和項目開發(fā)。 該教程詳細介紹了收入分布創(chuàng)新可視化的創(chuàng)建,利用D3的功能動態(tài)操縱和呈現(xiàn)數(shù)據(jù),根據(jù)實際數(shù)據(jù)值調(diào)整視覺元素(例如餅圖半徑)。
  • 該項目通過借貸和調(diào)整現(xiàn)有代碼進行迭代開發(fā),證明了D3的適應性和社區(qū)在編碼中的重要性,然后轉(zhuǎn)化為動態(tài)和交互式增強。
  • 最終的交互式可視化包括播放/暫停按鈕和用于年度選擇的滑塊等功能,說明了如何使用D3來使數(shù)據(jù)可視化不僅提供信息,而且可以吸引。
  • 項目
  • 作為大學的經(jīng)濟學專業(yè),我一直對收入不平等感興趣。我上了幾門關于這個主題的課程,這讓我感到震驚,因為它應該完全理解。
  • >我開始使用Google的公共數(shù)據(jù)資源管理器探索收入不平等……>
  • 調(diào)整通貨膨脹時,盡管每工業(yè)生產(chǎn)力一直在飆升,但家庭收入在40%的社會中保持了幾乎恒定的。它確實是最高的20%,它獲得了更多的好處(在該括號內(nèi),如果您看著前5%的前5%,那么差異更加令人震驚)。

    這是我想以令人信服的方式傳播的信息,這為使用一些D3.js提供了絕佳的機會,所以我開始繪制一些想法。

    >

    素描

    因為我們正在與D3合作,所以我或多或少可以開始繪制我能想到的任何東西

    。制作簡單的線圖,條形圖或氣泡圖非常容易,但是我想做一些不同的東西。 >我發(fā)現(xiàn)人們傾向于用作對不平等問題的擔憂的最常見類比是“如果餡餅變大,那么還有更多事情要解決”。直覺是,如果GDP的總份額在很大程度上增加了,那么即使有些人獲得了pie的較薄

    ,但它們?nèi)匀粫玫?p>> ??>。但是,正如我們所看到的,餡餅完全有可能變得更大讓人們總體上變得更少。 我可視化這些數(shù)據(jù)的第一個想法看起來像這樣:

    的想法是,我們將擁有此脈動餅圖,每個切片代表美國收入分配的五分之一。每個派片的面積與該人口的收入收入有關,圖表的總面積將代表其總GDP。 但是,我很快遇到了一些問題。事實證明,人的大腦在區(qū)分不同區(qū)域的大小方面非常差。當我更具體地將其映射出來時,該消息并沒有像應該如此明顯的地方:>

    與現(xiàn)代JavaScript和D3的交互式數(shù)據(jù)可視化

    >在這里,實際上,最貧窮的美國人隨著時間的流逝而變得更加富裕,這證實了似乎直覺上的真實。我再考慮這個問題,我的解決方案涉及保持每個弧的角度恒定的角度,每個弧的半徑動態(tài)變化。

    這是在實踐中最終尋找的方式:

    與現(xiàn)代JavaScript和D3的交互式數(shù)據(jù)可視化

    >我想指出,此圖像仍然傾向于低估這里的效果。如果我們使用一個簡單的條形圖,效果將會更加明顯:

    但是,我致力于做出獨特的可視化,我想將此消息錘回回家,即

    pie 可以得到更大的> ,而ashare> share>它可以得到較小的?,F(xiàn)在我有了我的主意,是時候用D3構建它了。>

    >借用代碼

    >所以,現(xiàn)在我知道要構建什么,是時候進入該項目的真正肉了,然后開始編寫一些代碼

    >您可能會認為我會從頭開始編寫我的前幾行代碼行,但是您錯了。這是D3,由于我們正在與D3合作,因此我們總是可以從社區(qū)中找到一些預先編寫的代碼,以使我們脫穎而出。>

    >我們正在創(chuàng)建全新的東西,但是它與常規(guī)餅圖有很多共同點,因此我快速查看了bl.ocks.org,我決定使用Mike Bostock的經(jīng)典實施, D3的創(chuàng)造者之一。該文件可能已經(jīng)復制了數(shù)千次,而寫它的人是帶有JavaScript的真正向?qū)?,因此我們可以確定我們已經(jīng)從一個不錯的代碼開始了。

    此文件寫在D3 V3中,該文件現(xiàn)在已經(jīng)過時了兩個版本,因為版本5最終在上個月發(fā)布。 D3 V4的一個很大的變化是,庫切換到使用平坦的名稱空間,因此比例功能諸如d3.scale.ordinal()的編寫一樣,就像d3.scaleordinal()相反。在版本5中,最大的更改是,數(shù)據(jù)加載函數(shù)現(xiàn)在是按照承諾構造的,這使得更容易一次處理多個數(shù)據(jù)集。

    > 為了避免混亂,我已經(jīng)遇到了創(chuàng)建此代碼的更新V5版本的麻煩,我已將其保存在blockbuilder.org上。我還將語法轉(zhuǎn)換為適合ES6慣例,例如將ES5匿名函數(shù)切換到箭頭函數(shù)。

    這是我們已經(jīng)開始的:

    >

    然后,我將這些文件復制到我的工作目錄中,并確保我可以在自己的計算機上復制所有內(nèi)容。如果您想自己跟隨本教程,那么您可以從我們的GitHub倉庫中克隆該項目。您可以從文件啟動器.html中的代碼開始。請注意,您將需要一臺服務器(例如該服務器)來運行此代碼,因為它依賴于Fetch API檢索數(shù)據(jù)。

    >讓我快速介紹此代碼的工作原理。

    瀏覽我們的代碼

    與現(xiàn)代JavaScript和D3的交互式數(shù)據(jù)可視化首先,我們在文件頂部聲明了一些常數(shù),我們將使用該常數(shù)來定義餅圖的大?。?/p>

    >這使我們的代碼超級重復使用,因為如果我們想使其更大或更小,那么我們只需要擔心在此處更改這些值。

    >

    接下來,我們將SVG畫布附加到屏幕上。如果您對SVG的了解不多,那么您可以將畫布視為我們可以繪制形狀的頁面上的空間。如果我們嘗試在該區(qū)域之外繪制SVG,那么它根本不會出現(xiàn)在屏幕上:>

<span>const width = 540;
</span><span>const height = 540;
</span><span>const radius = Math.min(width, height) / 2;
</span>
>我們正在用圖表區(qū)域的ID抓住一個空的DIV,并致電D3.Select()。我們還使用d3.append()方法將SVG畫布附加,并且使用d3.attr()方法為其寬度和高度設置了一些尺寸。

>我們還將SVG組元素附加到此畫布上,這是一種特殊類型的元素,我們可以將其用于將元素構造在一起。這使我們可以使用組元素的轉(zhuǎn)換屬性將整個可視化轉(zhuǎn)移到屏幕的中心。

之后,我們正在設置一個默認量表,我們將使用該量表來為我們的派的每一個分配新顏色:

>

接下來,我們有幾行設置了D3的派布局:>

在D3中,布局是我們可以在一組數(shù)據(jù)中調(diào)用的特殊功能。一個布局函數(shù)以特定格式接收一系列數(shù)據(jù),并使用一些自動生成的值吐出
<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>
轉(zhuǎn)換的數(shù)組

,然后我們可以用。 然后,我們需要定義一個可以用來繪制弧的路徑生成器。路徑生成器允許我們在Web瀏覽器中繪制路徑SVG。 D3真正要做的就是將數(shù)據(jù)與屏幕上的形狀相關聯(lián),但是在這種情況下,我們要定義更復雜的形狀,而不是簡單的圓或正方形。路徑SVG通過定義在之間繪制線路的路由來工作,我們可以使用其D屬性來定義。

這可能是:
<span>const color = d3.scaleOrdinal(["#66c2a5", "#fc8d62", "#8da0cb","#e78ac3", "#a6d854", "#ffd92f"]);
</span>
>

d屬性包含一個特殊的編碼,可以讓瀏覽器繪制我們想要的路徑。如果您真的想知道此字符串的含義,則可以在MDN的SVG文檔中找到它。對于D3中的編程,我們實際上不需要了解此特殊編碼的任何信息,因為我們的發(fā)電機會為我們吐出D屬性,我們只需要使用一些簡單的參數(shù)來初始化。 對于弧線,我們需要為我們的路徑發(fā)生器一個Innerradius和像素中的外段值,并且發(fā)電機將分類為我們計算每個角度的復雜數(shù)學:

>

對于我們的圖表,我們?yōu)镮nnerradius使用了零值,這為我們提供了標準的餅圖。但是,如果我們想繪制甜甜圈圖,那么我們要做的就是插入一個小于我們的outerradius值的值。
<span>const pie = d3.pie()
</span>  <span>.value(d => d.count)
</span>  <span>.sort(null);
</span>
>

>幾次函數(shù)聲明后,我們將使用d3.json()函數(shù)加載數(shù)據(jù):>

<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文件的內(nèi)容,并執(zhí)行該功能加載后,我們將在The The The The The The The()方法中調(diào)用。然后,我們可以訪問我們在回調(diào)的數(shù)據(jù)參數(shù)中查看的對象。>

>我們還在此處傳遞函數(shù)參考 - 類型 - 它將轉(zhuǎn)換我們加載成數(shù)的所有值,我們可以稍后使用:>

>

<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回調(diào)的口頭聲明,我們可以查看我們現(xiàn)在正在使用的數(shù)據(jù):>

我們的數(shù)據(jù)在這里分為兩個不同的數(shù)組,分別代表我們的蘋果和橘子數(shù)據(jù)。
<span>const color = d3.scaleOrdinal(["#66c2a5", "#fc8d62", "#8da0cb","#e78ac3", "#a6d854", "#ffd92f"]);
</span>
>

>使用此行,我們將在單擊我們的一個無線電按鈕時切換我們正在查看的數(shù)據(jù):

>

>我們還需要在可視化的第一次運行中調(diào)用update()函數(shù),以傳遞初始值(帶有“蘋果”數(shù)組)。
<span>const pie = d3.pie()
</span>  <span>.value(d => d.count)
</span>  <span>.sort(null);
</span>

>讓我們看一下我們的update()函數(shù)在做什么。如果您是D3的新手,這可能會引起一些困惑,因為它是D3最困難的部分之一……>
<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>

>首先,我們使用默認函數(shù)參數(shù)作為值。如果我們將參數(shù)傳遞到我們的update()函數(shù)(當我們第一次運行時),我們將使用該字符串,否則我們將從單擊事件中獲得所需的值我們的無線電輸入。

然后,我們正在使用D3中的常規(guī)更新模式
<span>const arc = d3.arc()
</span>  <span>.innerRadius(0)
</span>  <span>.outerRadius(radius);
</span>
來處理我們的弧的行為。這通常涉及執(zhí)行數(shù)據(jù)加入,退出舊元素,更新屏幕上的現(xiàn)有元素,并添加添加到我們數(shù)據(jù)中的新元素。在此示例中,我們不必擔心退出元素,因為我們在屏幕上始終具有相同數(shù)量的餅片。

首先,有我們的數(shù)據(jù)加入:

>每次我們的可視化更新時,這都會將新的數(shù)據(jù)與我們的SVG在屏幕上關聯(lián)。我們將數(shù)據(jù)(“蘋果”或“橙色”的數(shù)組)傳遞到我們的PIE()布局函數(shù)中,該功能正在計算一些開始角度和端角,可用于繪制我們的弧線?,F(xiàn)在,此路徑變量包含屏幕上所有弧的特殊

虛擬選擇

。 接下來,我們將更新數(shù)據(jù)數(shù)組中仍然存在的屏幕上的所有SVG。我們在此處添加了一個過渡 - D3庫的絕妙功能 - 傳播這些更新超過200毫秒:>

<span>const width = 540;
</span><span>const height = 540;
</span><span>const radius = Math.min(width, height) / 2;
</span>

>我們在d3.transition()呼叫上使用attrtwien()方法來定義D3應使用的自定義過渡,以更新其每個ARC的位置(使用D屬性過渡)。如果我們試圖將過渡到大多數(shù)屬性添加過渡,但是我們需要這樣做,但是我們需要這樣做以在不同的路徑之間過渡。 D3無法真正弄清楚如何在自定義路徑之間過渡,因此我們使用Arctween()函數(shù)來讓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>

我們在此處使用d3.interpaly()來創(chuàng)建所謂的插裝器。當我們調(diào)用我們存儲在I變量中的函數(shù),值在0到1之間,我們將獲得一個介于此之間的值。_current和a。在這種情況下,this._current是一個包含我們正在查看的PIE切片的開始和末端角度的對象,A表示我們正在更新為。

>一旦我們設置了插裝器,我們就會更新this._current值,以包含我們在末尾所擁有的值(i(a)),然后我們正在返回一個將計算計算的函數(shù)基于此t值,我們的弧應包含的路徑。我們的過渡將在其時鐘的每個刻度上運行此函數(shù)(通過0到1之間的參數(shù)),此代碼將意味著我們的過渡將在任何時間點都知道我們的弧線應在哪里繪制。

>

>最后,我們的update()函數(shù)需要添加在以前的數(shù)據(jù)陣列中沒有的新元素:>

這個代碼塊將設置我們每個弧的初始位置,這是第一次運行此更新功能。此處的Enter()方法為我們提供了需要添加到屏幕中的所有元素,然后我們可以使用Attr()方法循環(huán)瀏覽這些元素,以設置每個元素的填充和位置弧。我們還為每個弧線提供了一個白色邊框,這使我們的圖表看起來有些整潔。最后,我們將這些弧的每一個的current屬性設置為數(shù)據(jù)中的初始值,我們在arctween()函數(shù)中使用。
<span>const color = d3.scaleOrdinal(["#66c2a5", "#fc8d62", "#8da0cb","#e78ac3", "#a6d854", "#ffd92f"]);
</span>
>不用擔心您是否無法完全遵循它的工作原理,因為它是D3中的一個相當高級的話題。這個庫的偉大是,您不需要了解其所有內(nèi)部工作,就可以用它創(chuàng)建一些強大的東西。只要您能理解需要更改的位,就可以抽象一些并不是完全必不可少的細節(jié)。

>

將我們帶到了過程中的下一步……

適應代碼

>現(xiàn)在我們在本地環(huán)境中有一些代碼,并且我們了解它在做什么,我將切換我們正在查看的數(shù)據(jù),以便它可以與我們感興趣的數(shù)據(jù)一起使用。

>我已經(jīng)包含了我們將在項目的數(shù)據(jù)/文件夾中使用的數(shù)據(jù)。由于此新的incomes.csv文件這次是CSV格式(這是可以使用Microsoft Excel打開的文件),因此我將使用d3.csv()函數(shù),而不是D3.json( )函數(shù):

<span>const width = 540;
</span><span>const height = 540;
</span><span>const radius = Math.min(width, height) / 2;
</span>

此函數(shù)基本上與D3.json()基本相同 - 將我們的數(shù)據(jù)轉(zhuǎn)換為我們可以使用的格式。我還將type()initializer函數(shù)作為這里的第二個參數(shù)刪除,因為這是我們舊數(shù)據(jù)的特定于。

>如果將Console.Log(Data)語句添加到D3.CSV回調(diào)的頂部,則可以看到我們正在使用的數(shù)據(jù)的形狀:>

>我們有50個項目的數(shù)組,每個項目都代表我們的數(shù)據(jù)一年。然后,我們每年都有一個對象,其中五個收入組中的每個集團以及其他一些領域都有數(shù)據(jù)。我們可以在這里創(chuàng)建一個餅圖,這是這些年之一,但是首先,我們需要稍微繞過我們的數(shù)據(jù),以便以正確的格式。當我們想編寫與D3連接的數(shù)據(jù)時,我們需要傳遞一個數(shù)組,每個項目都將綁定到SVG。
<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>
回想一下,在我們的最后一個示例中,我們有一個數(shù)組,其中包含一個項目,適用于要在屏幕上顯示的每個派。將此與我們目前擁有的東西進行比較,這是一個對象,其鑰匙為1至5,代表我們要繪制的每個派。

> 為了解決此問題,我將添加一個稱為repardata()的新函數(shù)以替換我們以前擁有的type()函數(shù),該功能將在加載時迭代我們的每個數(shù)據(jù):>

>每年,此功能將返回具有值數(shù)組的對象,我們將將其傳遞到我們的數(shù)據(jù)加入中。我們將這些值中的每一個都標記為名稱字段,并且根據(jù)我們已經(jīng)擁有的收入價值,我們?yōu)樗鼈兲峁┝藬?shù)值。我們還在跟蹤比較每年的平均收入。

>在這一點上,我們的數(shù)據(jù)格式可以使用:

>
<span>const color = d3.scaleOrdinal(["#66c2a5", "#fc8d62", "#8da0cb","#e78ac3", "#a6d854", "#ffd92f"]);
</span>

>我將在數(shù)據(jù)中的第一年生成圖表,然后我會擔心在剩下的幾年中更新它。

>

>目前,我們的數(shù)據(jù)始于2015年,在1967年結束,因此我們需要扭轉(zhuǎn)此數(shù)組,然后才能做其他任何事情:

<span>const pie = d3.pie()
</span>  <span>.value(d => d.count)
</span>  <span>.sort(null);
</span>

與普通餅圖不同,對于我們的圖形,我們要固定每個弧的角度,并且隨著可視化更新的變化,半徑更改。為此,我們將更改PIE布局上的Value()方法,以便每個派slice始終具有相同的角度:

<span>const width = 540;
</span><span>const height = 540;
</span><span>const radius = Math.min(width, height) / 2;
</span>
接下來,每次可視化更新時,我們都需要更新半徑。為此,我們需要提出一個可以使用的量表。比例尺是D3中的一個函數(shù),在兩個值之間采用

input 輸入,我們作為域傳遞,然后在兩個不同的值之間吐出>輸出作為范圍。這是我們將使用的規(guī)模:

>
<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>

>一旦我們可以訪問數(shù)據(jù),我們就會添加這個量表,我們說我們的投入應在0到我們數(shù)據(jù)集中最大的價值之間,這是去年最富有的群體的收入在我們的數(shù)據(jù)中(數(shù)據(jù)[49]。值[4]。值)。對于域,我們設置了我們的輸出值應范圍的間隔。

這意味著零的輸入應給我們一個像素值為零,并且數(shù)據(jù)中最大值的輸入應為我們提供寬度或高度值的一半值,以較小。 >

請注意,我們還在此處使用

平方的根刻度

。我們這樣做的原因是,我們希望我們的餡餅切片區(qū)域與每個小組的收入成正比,而不是半徑。由于區(qū)域=πr2>,我們需要使用平方根刻度來解釋這一點。 然后,我們可以使用此量表來更新Update()函數(shù)中的ARC Generator的Outerradius值:>

>每當我們的數(shù)據(jù)更改時,這將編輯我們要用于每個弧線的半徑值。

>當我們最初設置弧發(fā)生器時,我們還應該刪除對Outerradius的呼叫,以便我們將其放在文件的頂部:
<span>const color = d3.scaleOrdinal(["#66c2a5", "#fc8d62", "#8da0cb","#e78ac3", "#a6d854", "#ffd92f"]);
</span>
>

>最后,我們需要對此update()函數(shù)進行一些編輯,以便所有內(nèi)容都與我們的新數(shù)據(jù)相匹配:>

>由于我們不再使用我們的收音機按鈕,所以我只是通過致電我們要使用的年度對象:
<span>const pie = d3.pie()
</span>  <span>.value(d => d.count)
</span>  <span>.sort(null);
</span>

>最后,我將刪除我們?yōu)楸韱屋斎朐O置的事件偵聽器。如果一切都計劃在計劃中,我們的數(shù)據(jù)中應該有一張漂亮的圖表:>
<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>
使其動態(tài)

下一步是在不同年份之間擁有我們的可視化周期,以表明收入如何隨著時間的流逝而變化。我們將通過添加呼叫JavaScript的setInterval()函數(shù)來做到這一點,我們可以用它來重復執(zhí)行某些代碼:

> 與現(xiàn)代JavaScript和D3的交互式數(shù)據(jù)可視化

>我們在此時間變量中設置了一個計時器,每200ms,此代碼將運行step()函數(shù),該函數(shù)將將我們的圖表更新為明年的數(shù)據(jù),并將計時器遞增1。如果計時器它的價值為49(我們的數(shù)據(jù)中的最后一年),它將自身重置?,F(xiàn)在,這為我們提供了一個不錯的循環(huán),它將連續(xù)運行:

與現(xiàn)代JavaScript和D3的交互式數(shù)據(jù)可視化

使事情更有用。我還將添加一些標簽,這些標簽為我們提供了原始數(shù)字。我將用以下方式替換文件正文中的所有HTML代碼

<span>const width = 540;
</span><span>const height = 540;
</span><span>const radius = Math.min(width, height) / 2;
</span>
>我們正在使用Bootstrap的網(wǎng)格系統(tǒng)在此處構建頁面,這使我們可以將頁面元素整潔地格式化為框。

然后,每當我們的數(shù)據(jù)更改時,我將使用jQuery更新所有這些:>

>我還將對我們文件頂部的CSS進行一些編輯,這將為我們提供每個弧的傳奇,并以我們的標題為中心:>

<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>

>很難看到這些弧線隨著時間的推移如何變化,所以我想添加一些網(wǎng)格線來顯示我們數(shù)據(jù)第一年的收入分布的樣子:>

與現(xiàn)代JavaScript和D3的交互式數(shù)據(jù)可視化>我正在使用array.foreach()方法來完成此操作,盡管我也可以再次使用D3的常規(guī)

常規(guī)更新模式

(join/exit/exit/extim/update/enter)。

>
<span>const pie = d3.pie()
</span>  <span>.value(d => d.count)
</span>  <span>.sort(null);
</span>
>我還想添加一行以顯示美國的平均收入,我每年都會更新。首先,我將首次添加平均線:

> >然后,我將在UPDATE()函數(shù)的末尾更新此版本。

>我應該注意,對于我們來說,在我們的第一個call to Update()之后,添加每個圓圈

很重要,因為否則它們最終會在每個圈子后面渲染
<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>
>

>我們的弧路徑(SVG層取決于將它們添加到屏幕的順序,而不是通過其z索引)。

>在這一點上,我們有一些傳達我們正在使用的數(shù)據(jù),這些數(shù)據(jù)更清楚地:
<span>const arc = d3.arc()
</span>  <span>.innerRadius(0)
</span>  <span>.outerRadius(radius);
</span>
>

使其互動

作為最后一步,我希望我們添加一些控件,以使用戶挖掘到特定年份。我想添加a

play/暫停

按鈕,以及一年的滑塊,允許用戶選擇特定的日期來查看。

與現(xiàn)代JavaScript和D3的交互式數(shù)據(jù)可視化>這是我用來將這些元素添加到屏幕上的HTML:>

>我們需要在這兩個元素中添加一些事件聽眾,以設計我們要尋找的行為。

首先,我想定義我們的按鈕的行為。我們需要替換提前為間隔編寫的代碼,以便我們使用按鈕停止并啟動計時器。我假設可視化始于“暫停”狀態(tài),我們需要按下此按鈕以拉開序幕。
<span>const width = 540;
</span><span>const height = 540;
</span><span>const radius = Math.min(width, height) / 2;
</span>

>每當我們的按鈕單擊時,我們的if/else block在這里將定義不同的行為,具體取決于我們的按鈕是“播放”按鈕還是“暫?!卑粹o。如果我們單擊的按鈕說“播放”,我們將按鈕更改為“暫停”按鈕,然后開始我們的間隔循環(huán)。另外,如果按鈕是“暫?!卑粹o,我們將其文本更改為“ play”,我們將使用clearInterval()函數(shù)來阻止循環(huán)運行。

>

對于我們的滑塊,我想使用jQuery UI庫隨附的滑塊。我將其包含在我們的HTML中,并且我將寫幾行以將其添加到屏幕上:>

<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>
>在這里,我們使用幻燈片選項將事件偵聽器連接到滑塊。每當我們的滑塊轉(zhuǎn)移到另一個值時,我們都會將計時器更新到此新值,并且在當年的數(shù)據(jù)中運行了Update()函數(shù)。

>我們可以在Update()函數(shù)末尾添加此行,以便我們的滑塊移動到我們的循環(huán)運行時正確的一年:

>我還將在我們的UpdateHtml()函數(shù)(每當我們的可視化更改時運行)添加一行,該功能可以根據(jù)數(shù)據(jù)中的當年調(diào)整標簽的值
<span>const color = d3.scaleOrdinal(["#66c2a5", "#fc8d62", "#8da0cb","#e78ac3", "#a6d854", "#ffd92f"]);
</span>

>我將向我們的CSS扔幾行,以使一切看起來有些整潔:

<span>const pie = d3.pie()
</span>  <span>.value(d => d.count)
</span>  <span>.sort(null);
</span>
>我們擁有它 - 我們的成品 - 一個功能齊全的交互式數(shù)據(jù)可視化,一切都按預期工作。

<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的真實力量,讓您絕對創(chuàng)建任何您可以想象的東西。

>從頭開始始終是一個艱難的過程,但是獎勵值得。如果您想學習如何創(chuàng)建自己的自定義可視化,這里有一些在線資源,您可能會發(fā)現(xiàn)有幫助:與現(xiàn)代JavaScript和D3的交互式數(shù)據(jù)可視化>

  • > SitePoint的D3.js內(nèi)容的概述
  • > D3主頁上的圖書館簡介。這是通過一些最基本的命令運行的,向您展示了如何在D3中進行第一個步驟。
  • >
  • >“讓我們制作條形圖” Mike Bostock(D3的創(chuàng)建者) - 向初學者展示了如何制作圖書館中最簡單的圖表之一。 Elijah Meeks($ 35)的
  • d3.js,這是一本可靠的介紹性教科書。 D3的Slack頻道非常歡迎D3的新移民。它還有一個“學習材料”部分,并收集了大量資源。
  • >
  • >此在線Udemy課程(20美元),該課程涵蓋了圖書館中的所有內(nèi)容。這針對JavaScript開發(fā)人員,包括四個很酷的項目。
  • 在bl.ocks.org和blockbuilder.org。
  • D3 API參考,它對D3提供的所有內(nèi)容提供了詳盡的技術解釋。
  • >不要忘記,如果您想查看我在文章中使用的代碼的完成版本,那么您可以在我們的GitHub repo上找到它。
  • >
  • >與JavaScript和D3
  • >的交互式數(shù)據(jù)可視化的經(jīng)常詢問問題(常見問題解答)
  • > D3在交互式數(shù)據(jù)可視化中的意義是什么?
d3(代表數(shù)據(jù)驅(qū)動的文檔)是一個JavaScript庫,該庫是廣泛用于創(chuàng)建交互式數(shù)據(jù)可視化的JavaScript庫。它允許您將任意數(shù)據(jù)綁定到文檔對象模型(DOM),然后將數(shù)據(jù)驅(qū)動的轉(zhuǎn)換應用于文檔。 D3不是一個單層框架,它試圖提供所有可以想象的功能。取而代之的是,它解決了問題的關鍵:根據(jù)數(shù)據(jù)有效操縱文檔。這避免了專有表示形式,并具有非凡的靈活性,揭示了HTML,SVG和CSS等網(wǎng)絡標準的全部功能。

> D3與其他JavaScript庫有何不同?之所以獨特,是因為它使您可以靈活地創(chuàng)建其他庫無法使用的數(shù)據(jù)可視化。它使您可以直接操縱DOM,這意味著您可以完全控制可視化的最終外觀。 D3還使用聲明的方法,這意味著您定義了想要最終結果的外觀,而D3算出了如何到達那里。

>

我可以將D3用于大數(shù)據(jù)集嗎?是的,D3能夠處理大型且復雜的數(shù)據(jù)集。它具有強大的數(shù)據(jù)操作功能,可讓您以任何格式使用數(shù)據(jù)。 D3還具有用于從不同來源加載數(shù)據(jù)的內(nèi)置功能,使其更容易與您的現(xiàn)有數(shù)據(jù)基礎結構集成。>

>如何使我的D3可視化互動互動?

> d3提供了幾種將交互性添加到可視化的方法。您可以使用事件偵聽器響應諸如點擊或鼠標運動之類的用戶操作,并且可以使用過渡來對數(shù)據(jù)進行動畫更改。 D3還支持縮放和平移,這對于探索大型數(shù)據(jù)集可能很有??用。

>

>在廣泛的領域中,從新聞到新聞業(yè)到D3?商業(yè)科學。一些常見的用例包括創(chuàng)建交互式圖,構建動態(tài)圖表和圖形,可視化復雜的網(wǎng)絡以及創(chuàng)建自定義數(shù)據(jù)驅(qū)動的動畫。

我是否需要知道JavaScript來使用D3? ,對JavaScript有效使用D3是必要的。 D3是一個JavaScript庫,因此您需要編寫JavaScript代碼來創(chuàng)建可視化。但是,D3的API旨在直觀且易于學習,因此,即使您不是JavaScript專家,您仍然可以使用D3創(chuàng)建強大的可視化。是的,可以與其他JavaScript庫或框架一起使用D3。例如,您可以使用D3來創(chuàng)建使用React或Angular。非常適合實時數(shù)據(jù)可視化。它具有靈活的數(shù)據(jù)更新機制,可讓您在新數(shù)據(jù)進來時輕松更新可視化。這使D3成為儀表板或?qū)崟r數(shù)據(jù)饋送等應用程序的絕佳選擇。

>我如何學習D3? >

>有許多可用于學習D3的資源。 D3官方網(wǎng)站有大量的文檔和示例,并且有許多在線教程和課程深度涵蓋D3。練習也是關鍵 - 您使用D3越多,您的概念和API都會變得越舒適。

> d3?

是什么限制,而d3是一個強大的工具,它確實有一些局限性。它需要對JavaScript和Web標準有很好的了解,這可能是初學者的障礙。 D3還為開發(fā)人員留下了很多決定,如果您不確定從哪里開始,這可能會令人不知所措。最后,盡管D3能夠處理大型數(shù)據(jù)集,但性能可能會成為一個非常大或復雜的可視化的問題。

以上是與現(xiàn)代JavaScript和D3的交互式數(shù)據(jù)可視化的詳細內(nèi)容。更多信息請關注PHP中文網(wǎng)其他相關文章!

本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻,版權歸原作者所有,本站不承擔相應法律責任。如您發(fā)現(xiàn)有涉嫌抄襲侵權的內(nèi)容,請聯(lián)系admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

人工智能驅(qū)動的應用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用于從照片中去除衣服的在線人工智能工具。

Clothoff.io

Clothoff.io

AI脫衣機

Video Face Swap

Video Face Swap

使用我們完全免費的人工智能換臉工具輕松在任何視頻中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

功能強大的PHP集成開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級代碼編輯軟件(SublimeText3)

Java vs. JavaScript:清除混亂 Java vs. JavaScript:清除混亂 Jun 20, 2025 am 12:27 AM

Java和JavaScript是不同的編程語言,各自適用于不同的應用場景。Java用于大型企業(yè)和移動應用開發(fā),而JavaScript主要用于網(wǎng)頁開發(fā)。

JavaScript評論:簡短說明 JavaScript評論:簡短說明 Jun 19, 2025 am 12:40 AM

JavascriptconcommentsenceenceEncorenceEnterential gransimenting,reading and guidingCodeeXecution.1)單inecommentsareusedforquickexplanations.2)多l(xiāng)inecommentsexplaincomplexlogicorprovideDocumentation.3)

如何在JS中與日期和時間合作? 如何在JS中與日期和時間合作? Jul 01, 2025 am 01:27 AM

JavaScript中的日期和時間處理需注意以下幾點:1.創(chuàng)建Date對象有多種方式,推薦使用ISO格式字符串以保證兼容性;2.獲取和設置時間信息可用get和set方法,注意月份從0開始;3.手動格式化日期需拼接字符串,也可使用第三方庫;4.處理時區(qū)問題建議使用支持時區(qū)的庫,如Luxon。掌握這些要點能有效避免常見錯誤。

為什么要將標簽放在的底部? 為什么要將標簽放在的底部? Jul 02, 2025 am 01:22 AM

PlacingtagsatthebottomofablogpostorwebpageservespracticalpurposesforSEO,userexperience,anddesign.1.IthelpswithSEObyallowingsearchenginestoaccesskeyword-relevanttagswithoutclutteringthemaincontent.2.Itimprovesuserexperiencebykeepingthefocusonthearticl

JavaScript與Java:開發(fā)人員的全面比較 JavaScript與Java:開發(fā)人員的全面比較 Jun 20, 2025 am 12:21 AM

JavaScriptIspreferredforredforwebdevelverment,而Javaisbetterforlarge-ScalebackendsystystemsandSandAndRoidApps.1)JavascriptexcelcelsincreatingInteractiveWebexperienceswebexperienceswithitswithitsdynamicnnamicnnamicnnamicnnamicnemicnemicnemicnemicnemicnemicnemicnemicnddommanipulation.2)

JavaScript:探索用于高效編碼的數(shù)據(jù)類型 JavaScript:探索用于高效編碼的數(shù)據(jù)類型 Jun 20, 2025 am 12:46 AM

javascripthassevenfundaMentalDatatypes:數(shù)字,弦,布爾值,未定義,null,object和symbol.1)numberSeadUble-eaduble-ecisionFormat,forwidevaluerangesbutbecautious.2)

什么是在DOM中冒泡和捕獲的事件? 什么是在DOM中冒泡和捕獲的事件? Jul 02, 2025 am 01:19 AM

事件捕獲和冒泡是DOM中事件傳播的兩個階段,捕獲是從頂層向下到目標元素,冒泡是從目標元素向上傳播到頂層。1.事件捕獲通過addEventListener的useCapture參數(shù)設為true實現(xiàn);2.事件冒泡是默認行為,useCapture設為false或省略;3.可使用event.stopPropagation()阻止事件傳播;4.冒泡支持事件委托,提高動態(tài)內(nèi)容處理效率;5.捕獲可用于提前攔截事件,如日志記錄或錯誤處理。了解這兩個階段有助于精確控制JavaScript響應用戶操作的時機和方式。

如何減少JavaScript應用程序的有效載荷大??? 如何減少JavaScript應用程序的有效載荷大小? Jun 26, 2025 am 12:54 AM

如果JavaScript應用加載慢、性能差,問題往往出在payload太大,解決方法包括:1.使用代碼拆分(CodeSplitting),通過React.lazy()或構建工具將大bundle拆分為多個小文件,按需加載以減少首次下載量;2.移除未使用的代碼(TreeShaking),利用ES6模塊機制清除“死代碼”,確保引入的庫支持該特性;3.壓縮和合并資源文件,啟用Gzip/Brotli和Terser壓縮JS,合理合并文件并優(yōu)化靜態(tài)資源;4.替換重型依賴,選用輕量級庫如day.js、fetch

See all articles