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

目錄
> d3在通過平穩(wěn)過渡的添加交互式和動(dòng)態(tài)元素方面表現(xiàn)出色,通過優(yōu)雅的編程和語法增強(qiáng)視覺體驗(yàn)和用戶參與。
>如何使我的D3可視化互動(dòng)互動(dòng)?
>在廣泛的領(lǐng)域中,從新聞到新聞業(yè)到D3?商業(yè)科學(xué)。一些常見的用例包括創(chuàng)建交互式圖,構(gòu)建動(dòng)態(tài)圖表和圖形,可視化複雜的網(wǎng)絡(luò)以及創(chuàng)建自定義數(shù)據(jù)驅(qū)動(dòng)的動(dòng)畫。
首頁 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)建的示例項(xiàng)目- a完全原始的使用D3庫的可視化類型,該類型展示了這些組件中的每個(gè)組件如何累加以使D3一個(gè)很棒的圖書館。

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

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

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

>

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

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

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

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

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

    >

    素描

    因?yàn)槲覀冋谂cD3合作,所以我或多或少可以開始繪製我能想到的任何東西

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

    ,但它們?nèi)匀粫?huì)更好地

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

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

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

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

    這是在實(shí)踐中最終尋找的方式:

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

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

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

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

    >借用代碼

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

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

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

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

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

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

    >

    然後,我將這些文件複製到我的工作目錄中,並確保我可以在自己的計(jì)算機(jī)上複製所有內(nèi)容。如果您想自己跟隨本教程,那麼您可以從我們的GitHub倉庫中克隆該項(xiàng)目。您可以從文件啟動(dòng)器.html中的代碼開始。請(qǐng)注意,您將需要一臺(tái)服務(wù)器(例如該服務(wù)器)來運(yùn)行此代碼,因?yàn)樗蕾囲禙etch API檢索數(shù)據(jù)。

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

    瀏覽我們的代碼

    與現(xiàn)代JavaScript和D3的交互式數(shù)據(jù)可視化首先,我們?cè)谖募敳柯暶髁艘恍┏?shù),我們將使用該常數(shù)來定義餅圖的大?。?/p>

    >這使我們的代碼超級(jí)重複使用,因?yàn)槿绻覀兿胧蛊涓蠡蚋。屈N我們只需要擔(dān)心在此處更改這些值。

    >

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

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

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

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

>

接下來,我們有幾行設(shè)置了D3的派佈局:>

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

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

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

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

>

對(duì)於我們的圖表,我們?yōu)镮nnerradius使用了零值,這為我們提供了標(biāo)準(zhǔn)的餅圖。但是,如果我們想繪製甜甜圈圖,那麼我們要做的就是插入一個(gè)小於我們的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將獲取它在我們給它的相對(duì)路徑上找到的JSON文件的內(nèi)容,並執(zhí)行該功能加載後,我們將在The The The The The The The()方法中調(diào)用。然後,我們可以訪問我們?cè)诨卣{(diào)的數(shù)據(jù)參數(shù)中查看的對(duì)象。 >

>我們還在此處傳遞函數(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ù)在這里分為兩個(gè)不同的數(shù)組,分別代表我們的蘋果和橘子數(shù)據(jù)。
<span>const color = d3.scaleOrdinal(["#66c2a5", "#fc8d62", "#8da0cb","#e78ac3", "#a6d854", "#ffd92f"]);
</span>
>

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

>

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

>讓我們看一下我們的update()函數(shù)在做什麼。如果您是D3的新手,這可能會(huì)引起一些困惑,因?yàn)樗荄3最困難的部分之一……>
<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>

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

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

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

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

虛擬選擇

。 接下來,我們將更新數(shù)據(jù)數(shù)組中仍然存在的屏幕上的所有SVG。我們?cè)诖颂幪砑恿艘粋€(gè)過渡 - D3庫的絕妙功能 - 傳播這些更新超過200毫秒:>

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

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

我們?cè)诖颂幨褂胐3.interpaly()來創(chuàng)建所謂的插裝器。當(dāng)我們調(diào)用我們存儲(chǔ)在I變量中的函數(shù),值在0到1之間,我們將獲得一個(gè)介於此之間的值。 _current和a。在這種情況下,this._current是一個(gè)包含我們正在查看的PIE切片的開始和末端角度的對(duì)象,A表示我們正在更新為。

>一旦我們?cè)O(shè)置了插裝器,我們就會(huì)更新this._current值,以包含我們?cè)谀┪菜鶕碛械闹担╥(a)),然後我們正在返回一個(gè)將計(jì)算計(jì)算的函數(shù)基於此t值,我們的弧應(yīng)包含的路徑。我們的過渡將在其時(shí)鐘的每個(gè)刻度上運(yùn)行此函數(shù)(通過0到1之間的參數(shù)),此代碼將意味著我們的過渡將在任何時(shí)間點(diǎn)都知道我們的弧線應(yīng)在哪裡繪製。

>

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

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

>

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

適應(yīng)代碼

>現(xiàn)在我們?cè)诒镜丨h(huán)境中有一些代碼,並且我們了解它在做什麼,我將切換我們正在查看的數(shù)據(jù),以便它可以與我們感興趣的數(shù)據(jù)一起使用。

>我已經(jīng)包含了我們將在項(xià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ù)作為這裡的第二個(gè)參數(shù)刪除,因?yàn)檫@是我們舊數(shù)據(jù)的特定於。

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

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

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

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

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

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

>我將在數(shù)據(jù)中的第一年生成圖表,然後我會(huì)擔(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>

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

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

input 輸入,我們作為域傳遞,然後在兩個(gè)不同的值之間吐出>輸出作為範(fàn)圍。這是我們將使用的規(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ù),我們就會(huì)添加這個(gè)量表,我們說我們的投入應(yīng)在0到我們數(shù)據(jù)集中最大的價(jià)值之間,這是去年最富有的群體的收入在我們的數(shù)據(jù)中(數(shù)據(jù)[49]。值[4]。值)。對(duì)於域,我們?cè)O(shè)置了我們的輸出值應(yīng)範(fàn)圍的間隔。

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

請(qǐng)注意,我們還在此處使用

平方的根刻度

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

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

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

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

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

>最後,我將刪除我們?yōu)楸韱屋斎朐O(shè)置的事件偵聽器。如果一切都計(jì)劃在計(jì)劃中,我們的數(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>
使其動(dòng)態(tài)

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

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

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

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

使事情更有用。我還將添加一些標(biāo)籤,這些標(biāo)籤為我們提供了原始數(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ù)更改時(shí),我將使用jQuery更新所有這些:>

>我還將對(duì)我們文件頂部的CSS進(jìn)行一些編輯,這將為我們提供每個(gè)弧的傳奇,並以我們的標(biāo)題為中心:>

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

>很難看到這些弧線隨著時(shí)間的推移如何變化,所以我想添加一些網(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>
>我還想添加一行以顯示美國的平均收入,我每年都會(huì)更新。首先,我將首次添加平均線:

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

>我應(yīng)該注意,對(duì)於我們來說,在我們的第一個(gè)call to Update()之後,添加每個(gè)圓圈

很重要,因?yàn)榉駝t它們最終會(huì)在每個(gè)圈子後面渲染
<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索引)。

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

使其互動(dòng)

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

play/暫停

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

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

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

首先,我想定義我們的按鈕的行為。我們需要替換提前為間隔編寫的代碼,以便我們使用按鈕停止並啟動(dòng)計(jì)時(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)我們的按鈕單擊時(shí),我們的if/else block在這裡將定義不同的行為,具體取決於我們的按鈕是“播放”按鈕還是“暫?!卑粹o。如果我們單擊的按鈕說“播放”,我們將按鈕更改為“暫?!卑粹o,然後開始我們的間隔循環(huán)。另外,如果按鈕是“暫?!卑粹o,我們將其文本更改為“ play”,我們將使用clearInterval()函數(shù)來阻止循環(huán)運(yùn)行。

>

對(duì)於我們的滑塊,我想使用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>
>在這裡,我們使用幻燈片選項(xiàng)將事件偵聽器連接到滑塊。每當(dāng)我們的滑塊轉(zhuǎn)移到另一個(gè)值時(shí),我們都會(huì)將計(jì)時(shí)器更新到此新值,並且在當(dāng)年的數(shù)據(jù)中運(yùn)行了Update()函數(shù)。

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

>我還將在我們的UpdateHtml()函數(shù)(每當(dāng)我們的可視化更改時(shí)運(yùn)行)添加一行,該功能可以根據(jù)數(shù)據(jù)中的當(dāng)年調(diào)整標(biā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>
>我們擁有它 - 我們的成品 - 一個(gè)功能齊全的交互式數(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的真實(shí)力量,讓您絕對(duì)創(chuàng)建任何您可以想像的東西。

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

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

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

>

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

>如何使我的D3可視化互動(dòng)互動(dòng)?

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

>

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

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

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

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

> d3?

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

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

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

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強(qiáng)大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

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

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)程式碼編輯軟體(SublimeText3)

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

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

JavaScript評(píng)論:簡短說明 JavaScript評(píng)論:簡短說明 Jun 19, 2025 am 12:40 AM

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

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

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

為什麼要將標(biāo)籤放在的底部? 為什麼要將標(biāo)籤放在的底部? 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)

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

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

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

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

See all articles