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

目錄
> d3在通過平穩(wěn)過渡的添加交互式和動態(tài)元素方面表現(xiàn)出色,通過優(yōu)雅的編程和語法增強視覺體驗和用戶參與。
>如何使我的D3可視化互動互動?
>在廣泛的領(lǐng)域中,從新聞到新聞業(yè)到D3?商業(yè)科學(xué)。一些常見的用例包括創(chuàng)建交互式圖,構(gòu)建動態(tài)圖表和圖形,可視化複雜的網(wǎng)絡(luò)以及創(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ù)可視化

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

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

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

>學(xué)習(xí)曲線對於進入圖書館的啟動非常陡峭,因為D3有一些特殊的怪癖,您可能從未見過。但是,如果您可以超越足夠的D3學(xué)習(xí)的第一階段,那麼您很快就可以為自己構(gòu)建一些非??岬臇|西。

>

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

  1. 靈活性。 D3允許您獲取任何類型的數(shù)據(jù),並將其與瀏覽器窗口中的形狀直接關(guān)聯(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)站快速查找其他人的預(yù)先編寫代碼,並將這些摘要直接複製到您自己的項目中。 > 鑰匙要點
  4. 代表數(shù)據(jù)驅(qū)動的文檔的
  5. d3是一個強大的JavaScript庫,用於創(chuàng)建多樣化和交互式數(shù)據(jù)可視化,如它在紐約時報等平臺中的廣泛使用所證明的。
庫提供了無與倫比的靈活性,使開發(fā)人員可以將任何類型的數(shù)據(jù)綁定到瀏覽器中的圖形表示,從而在可視化設(shè)計中促進創(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的適應(yīng)性和社區(qū)在編碼中的重要性,然後轉(zhuǎn)化為動態(tài)和交互式增強。
  • 最終的交互式可視化包括播放/暫停按鈕和用於年度選擇的滑塊等功能,說明瞭如何使用D3來使數(shù)據(jù)可視化不僅提供信息,而且可以吸引。
  • 項目
  • 作為大學(xué)的經(jīng)濟學(xué)專業(yè),我一直對收入不平等感興趣。我上了幾門關(guān)於這個主題的課程,這讓我感到震驚,因為它應(yīng)該完全理解。
  • >我開始使用Google的公共數(shù)據(jù)資源管理器探索收入不平等……>
  • 調(diào)整通貨膨脹時,儘管每工業(yè)生產(chǎn)力一直在飆升,但家庭收入在40%的社會中保持了幾乎恆定的。它確實是最高的20%,它獲得了更多的好處(在該括號內(nèi),如果您看著前5%的前5%,那麼差異更加令人震驚)。

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

    >

    素描

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

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

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

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

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

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

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

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

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

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

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

    >借用代碼

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

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

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

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

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

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

    >

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

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

    瀏覽我們的代碼

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

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

    >

    接下來,我們將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()方法為其寬度和高度設(shè)置了一些尺寸。

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

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

>

接下來,我們有幾行設(shè)置了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ù)與屏幕上的形狀相關(guān)聯(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ù)學(xué):

>

對於我們的圖表,我們?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ù)(當(dāng)我們第一次運行時),我們將使用該字符串,否則我們將從單擊事件中獲得所需的值我們的無線電輸入。

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

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

>每次我們的可視化更新時,這都會將新的數(shù)據(jù)與我們的SVG在屏幕上關(guān)聯(lián)。我們將數(shù)據(jù)(“蘋果”或“橙色”的數(shù)組)傳遞到我們的PIE()佈局函數(shù)中,該功能正在計算一些開始角度和端角,可用於繪製我們的弧線。現(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應(yīng)使用的自定義過渡,以更新其每個ARC的位置(使用D屬性過渡)。如果我們試圖將過渡到大多數(shù)屬性添加過渡,但是我們需要這樣做,但是我們需要這樣做以在不同的路徑之間過渡。 D3無法真正弄清楚如何在自定義路徑之間過渡,因此我們使用Arctween()函數(shù)來讓D3知道如何在每時每刻都應(yīng)繪製我們的每條路徑。

>

這是此功能的樣子:

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

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

>

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

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

>

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

適應(yīng)代碼

>現(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ù)一年。然後,我們每年都有一個對象,其中五個收入組中的每個集團以及其他一些領(lǐng)域都有數(shù)據(jù)。我們可以在這裡創(chuàng)建一個餅圖,這是這些年之一,但是首先,我們需要稍微繞過我們的數(shù)據(jù),以便以正確的格式。當(dāng)我們想編寫與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ù)中的第一年生成圖表,然後我會擔(dān)心在剩下的幾年中更新它。

>

>目前,我們的數(shù)據(jù)始於2015年,在1967年結(jié)束,因此我們需要扭轉(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ù),我們就會添加這個量表,我們說我們的投入應(yīng)在0到我們數(shù)據(jù)集中最大的價值之間,這是去年最富有的群體的收入在我們的數(shù)據(jù)中(數(shù)據(jù)[49]。值[4]。值)。對於域,我們設(shè)置了我們的輸出值應(yīng)範圍的間隔。

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

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

平方的根刻度

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

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

>當(dāng)我們最初設(shè)置弧發(fā)生器時,我們還應(yīng)該刪除對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è)置的事件偵聽器。如果一切都計劃在計劃中,我們的數(shù)據(jù)中應(yīng)該有一張漂亮的圖表:>
<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ù)可視化

>我們在此時間變量中設(shè)置了一個計時器,每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)在此處構(gòu)建頁面,這使我們可以將頁面元素整潔地格式化為框。

然後,每當(dā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>
我們最終得到的是相當(dāng)可觀的東西:

<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ù)的末尾更新此版本。

>我應(yīng)該注意,對於我們來說,在我們的第一個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:>

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

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

>每當(dāng)我們的按鈕單擊時,我們的if/else block在這裡將定義不同的行為,具體取決於我們的按鈕是“播放”按鈕還是“暫?!卑粹o。如果我們單擊的按鈕說“播放”,我們將按鈕更改為“暫?!卑粹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>
>在這裡,我們使用幻燈片選項將事件偵聽器連接到滑塊。每當(dāng)我們的滑塊轉(zhuǎn)移到另一個值時,我們都會將計時器更新到此新值,並且在當(dāng)年的數(shù)據(jù)中運行了Update()函數(shù)。

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

>我還將在我們的UpdateHtml()函數(shù)(每當(dāng)我們的可視化更改時運行)添加一行,該功能可以根據(jù)數(shù)據(jù)中的當(dāng)年調(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ù)可視化,一切都按預(yù)期工作。

<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)建任何您可以想像的東西。

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

  • > SitePoint的D3.js內(nèi)容的概述
  • > D3主頁上的圖書館簡介。這是通過一些最基本的命令運行的,向您展示瞭如何在D3中進行第一個步驟。
  • >
  • >“讓我們製作條形圖” Mike Bostock(D3的創(chuàng)建者) - 向初學(xué)者展示瞭如何製作圖書館中最簡單的圖表之一。 Elijah Meeks($ 35)的
  • d3.js,這是一本可靠的介紹性教科書。 D3的Slack頻道非常歡迎D3的新移民。它還有一個“學(xué)習(xí)材料”部分,並收集了大量資源。
  • >
  • >此在線Udemy課程(20美元),該課程涵蓋了圖書館中的所有內(nèi)容。這針對JavaScript開發(fā)人員,包括四個很酷的項目。
  • 在bl.ocks.org和blockbuilder.org。
  • D3 API參考,它對D3提供的所有內(nèi)容提供了詳盡的技術(shù)解釋。
  • >不要忘記,如果您想查看我在文章中使用的代碼的完成版本,那麼您可以在我們的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)換應(yīng)用於文檔。 D3不是一個單層框架,它試圖提供所有可以想像的功能。取而代之的是,它解決了問題的關(guān)鍵:根據(jù)數(shù)據(jù)有效操縱文檔。這避免了專有表示形式,並具有非凡的靈活性,揭示了HTML,SVG和CSS等網(wǎng)絡(luò)標準的全部功能。

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

>

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

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

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

>

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

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

>我如何學(xué)習(xí)D3? >

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

> d3?

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

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

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動的應(yīng)用程序,用於創(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是不同的編程語言,各自適用於不同的應(yīng)用場景。 Java用於大型企業(yè)和移動應(yīng)用開發(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.獲取和設(shè)置時間信息可用get和set方法,注意月份從0開始;3.手動格式化日期需拼接字符串,也可使用第三方庫;4.處理時區(qū)問題建議使用支持時區(qū)的庫,如Luxon。掌握這些要點能有效避免常見錯誤。

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

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

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

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

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ù)設(shè)為true實現(xiàn);2.事件冒泡是默認行為,useCapture設(shè)為false或省略;3.可使用event.stopPropagation()阻止事件傳播;4.冒泡支持事件委託,提高動態(tài)內(nèi)容處理效率;5.捕獲可用於提前攔截事件,如日誌記錄或錯誤處理。了解這兩個階段有助於精確控制JavaScript響應(yīng)用戶操作的時機和方式。

Java和JavaScript有什麼區(qū)別? Java和JavaScript有什麼區(qū)別? Jun 17, 2025 am 09:17 AM

Java和JavaScript是不同的編程語言。 1.Java是靜態(tài)類型、編譯型語言,適用於企業(yè)應(yīng)用和大型系統(tǒng)。 2.JavaScript是動態(tài)類型、解釋型語言,主要用於網(wǎng)頁交互和前端開發(fā)。

See all articles