數據可視化【十三】地區分布圖

在前面的博客中已經介紹了如何繪制地圖,這一節學習如何繪制地區分布圖。如果對繪制地圖還不熟悉的話可以了解一下之前我寫的博客:數據可視化【十】繪制地圖

Intergrating(整合) TopoJSON with tabular data(列表數據)

在前面的博客中沒有使用到tsv文件,因為我找到的TopoJSON中本來就包含國家的名字。但是如果想要知道國家更多的數據僅僅知道國家的名字是不夠的,因此還需要導入關于國家其他數據的tsv文件。當導入多個文件的時候最好使用Promis.all,這樣就可以在文件全部都加載后再開始執行。需要將多個任務都放在一個數組里面,然后再在then中用一個數組接收讀入的數據。

Promise.all([tsv('https://unpkg.com/world-atlas@1.1.4/world/50m.tsv'),json('https://cdn.jsdelivr.net/npm/world-atlas@2.0.2/countries-50m.json')
]).then(([tsvData, topsJSONdata]) => {}

為了快速處理tsv文件,我們使用reduce函數將其放到一個類中。其中iso_n3JSON文件中的id對應

const rowById = tsvData.reduce((accumulator, d)=>{accumulator[d.iso_n3] = d;return accumulator;}, {});//前面是reduce的執行,后面是accumulator的初始值

為了使得JSON文件中的每個元素都包含這個國家更多的信息,我們使用assign函數將同一個國家的信息進行合并

const countries = feature(topsJSONdata, topsJSONdata.objects.countries);// console.log(countries);countries.features.forEach(d => {Object.assign(d.properties, rowById[d.id]);});

Creating a loadAndProcessData module

上面載入數據的過程其實可以當作另一個模塊,因此我們把上面的代碼單獨放在一個用于加載數據的文件中
loadAndProcessData.js

import {json, tsv} from 'd3';
import {feature} from 'topojson';export const loadAndProcessData = () => Promise.all([tsv('https://unpkg.com/world-atlas@1.1.4/world/50m.tsv'),json('https://cdn.jsdelivr.net/npm/world-atlas@2.0.2/countries-50m.json')
]).then(([tsvData, topsJSONdata]) => {const rowById = tsvData.reduce((accumulator, d)=>{accumulator[d.iso_n3] = d;return accumulator;}, {});const countries = feature(topsJSONdata, topsJSONdata.objects.countries);// console.log(countries);countries.features.forEach(d => {Object.assign(d.properties, rowById[d.id]);});return countries;});

并在index.js中將相應的代碼都放在loadAndProcessData函數的then

Visualizing an ordered attribute with color

在得到國家的其他屬性之后,我們就可以根據國家的其他標簽給國家上色
我們可以首先觀察一下tsv文件中都有什么。太多了這里就不顯示了,比如說里面有一個標簽是經濟,我們不妨使用經濟給不同國家不同的顏色。

為了方便修改標簽,我們把獲取數據屬性的操作放到一個函數里,并且在后面所有的地方都通過這個函數獲取屬性,這樣做的好處是如果我們不想要這個標簽,我們只需要在這一個地方進行修改就可以。

我們使用scaleOrdinal來得到從標簽到顏色的映射,對于標簽我們需要進行一定的排序處理,而顏色區間d3有現成的函數可以讓我們很方便的得到漸變的顏色從而區分不同的等級。

我們可以搜索d3-scale-chromatic,里面有很多函數。在這里我們選擇schemeSpectral[k],這個k是標簽分類的個數,我們可以直接得到:

const colorValue = d => d.properties.income_grpconst colorScale = scaleOrdinal().domain(countries.features.map(colorValue));colorScale.domain(colorScale.domain().sort().reverse()).range(schemeSpectral[colorScale.domain().length]);

制作好顏色標簽以后就是在添加path的后面設置fill屬性,我之前做的是隨機選擇一個顏色,這里就改為根據上面已經設置好的顏色尺得到對應的顏色。

Showing data from 2 attributes in tooltip

在得到好看的顏色以后,我們還希望對應的標簽的內容可以改變,這一點很容易再到,只需要在設置text的時候加上對應的屬性即可。

g.selectAll('path').data(countries.features).enter().append('path').attr('class', 'country').attr('fill', d => colorScale(colorValue(d))) .attr('d', pathGenerator)
.append('title')//添加title,然后鼠標放在上面就可以出現標題.text(d => d.properties.name + ':' + colorValue(d));

初步效果圖如下:
在這里插入圖片描述

Adding a color legend

我們還希望添加一個顏色圖例,這樣就可以很方便地知道什么顏色對應的是什么內容而不必要一一去看。根據上一節(數據可視化【十二】顏色圖例和尺寸圖例)我們制作的顏色圖例,可以直接進行使用。
index.js

  colorLegendG.call(colorLegend, {colorScale,circleRadius: 8,spacing : 20,textOffset : 15,backgroundRectWidth: 250});

colorLegend.js中,圖例有一個背景,通過添加一個矩形來實現

  const backgroundRect = selection.selectAll('rect').data([null]);const n = colorScale.domain().length;backgroundRect.enter().append('rect').merge(backgroundRect).attr('x', -circleRadius * 2).attr('y', -circleRadius * 2).attr('rx', circleRadius * 2).attr('width', backgroundRectWidth).attr('height', spacing * n + circleRadius * 3).attr('fill', 'white').attr('opacity', 0.8);

最后效果圖:在這里插入圖片描述
代碼地址:https://vizhub.com/Edward-Elric233/635845fd4c8b4917b999b18cab5e9b09

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/383600.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/383600.shtml
英文地址,請注明出處:http://en.pswp.cn/news/383600.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

3.01【python正則表達式以及re模塊】

python正則表達式以及re模塊 元字符 正則表達式的語法就由表格中的元字符組成,一般用于搜索、替換、提取文本數據 元字符含義.匹配除換行符以外的任何單個字符*匹配前面的模式0次或1次匹配前面的模式1次或多次?匹配前面的模式0次或1次[]用于定義字符集&#xff…

Linux配置編程環境+云服務器上傳文件

Java環境配置 Ubuntu https://www.cnblogs.com/lfri/p/10437266.html Centos https://blog.csdn.net/qq_21077715/article/details/85536399 Tomcat配置 Centos https://blog.csdn.net/qq_21077715/article/details/85541685 https://www.cnblogs.com/newwind/p/9904561…

gbd + cgbd

gbd:傳送門 cgbd:傳送門 | 傳送門

數據可視化【十四】交互式過濾地區分布圖

在前面的博客中已經介紹了如何繪制地區分布圖,這一節學習如何繪制交互式過濾地區分布圖。如果對繪制地區分布圖還不熟悉的話可以了解一下之前我寫的博客:數據可視化【十三】地區分布圖 整體的框架仍然是在之前的基礎上進行修改,主要是添加交…

Ubuntu環境搭建

本文記錄了一些常用的Ubuntu軟件 然后首先修改軟件源:軟件和更新->Ubuntu軟件->下載自:其他站點(修改為阿里云) 在關閉的時候需要更新什么的 然后修改更新方式,將不支持的更新去掉 常用的Windows軟件 網易云…

1 兩數之和

雖然只是一道很簡單的題,但是也給我很多思考。 剛看到這道題的時候沒有仔細思考,直接寫了個排序和二分查找,想著對每個數字查找另一個數字會不會出現,復雜度是O(nlognnlogn)O(nlognnlogn)O(nlognnlogn),主要訓練了一下…

834 樹中距離之和

這道題我自己的想法只有對每個點都用一遍Dijkstra然后再求和,顯然會超時,所以我都沒有嘗試。 研究了一下題解,發現題解很巧妙,自己對樹的處理還是太稚嫩,之前樹鏈剖分學的都忘光了。 對于固定根節點的,我…

75 顏色分類

題目已經提示可以一遍掃描了但是我還是沒有想到,其實雙指針的想法我已經有了,但是一想到有問題就覺得無法實現。這也揭示了我思維上的問題:用一種方法解決問題遇到困難第一件事情不是想著如何攻克而是想著換一種方法。對自己的思維也不自信。…

141 環形鏈表

要求使用空間復雜度為O(1)的方法,可是我并沒有想到。我想到的只有用一個哈希表記錄一下所有訪問過的節點。 題解給出的空間復雜度為O(1)的方法是使用兩個指針,然后讓一個一次跑一步,一個一次跑兩步,如果跑的快的能追上跑的慢的就…

數據可視化【十五】

經驗法則:在顏色不相鄰的時候加上背景顏色顏色的個數為6~12比較好。 顏色其實很大程度上由背景決定而不是他本身決定。 D3 Scale-Chromatic 有許多顏色刻度,可以根據自己的需要進行選擇。 參考論文:Practical Rules for Using Color in Cha…

Ubuntu修改/刪除主目錄下的中文文件夾

在Ubuntu的主目錄下一般是有一些中文的目錄,例如桌面,視頻等等,還無法修改名稱,在一群英文文件夾里面顯得有些突兀(Ubuntu終端下的中文一點也不好看),就想把這些文件夾修改一下,結果…

19 刪除鏈表的倒數第N個

題目的意思很簡單,就是刪除一個鏈表倒數第N個節點。 需要用到鏈表的標準操作:快慢指針。 我們讓一個快指針先指向第N個元素,這個時候快指針總比慢指針領先N個元素,等到快指針指向鏈表尾部的時候慢指針就指向需要刪除的元素。 之前…

844. Backspace String Compare

題目的意思大概是有兩個字符串,其中的#表示退格鍵,讓比較最后兩個字符串是否相當。 很容易想到的思路就是用一個棧進行模擬這個過程,特別需要注意如果一個串是空串也是可以退格的。 但是很容易想到的另一個特性就是,前面的字符有…

鏈表三連擊

876:鏈表的中間節點 206:反轉鏈表 143:重排練表 鏈表的中間節點 這個題一看就是最簡單的快慢指針,但是在具體實現的時候我還是猶豫思考了一下:要不要在鏈表前面放置啞節點,快指針應該什么時候判斷已經到達…

D3力導引圖

學習力導引圖的時候在網上沒有找到什么好的教程,支離破碎地進行了一段時間的學習,還閱讀了d3的關于d3的官方文檔,但是始終覺得不的要領。這里記錄一下我學習力導引圖的一些心得以及推薦一下學習資源。 學習資源 官方文檔:https:…

Ubuntu Pycharm啟動后卡住無法操作

昨天還好好的,今天打開Pycham突然卡住了,卡在了那個preparing workspace的地方,然后在網上搜索了很多方法都沒用。直到在網上看到有個大佬說是因為搜狗輸入法的問題,我才突然記起來昨天安裝了搜狗輸入法。。。 kill掉卡住的Pycha…

327 區間和的個數

題目描述 Given an integer array nums, return the number of range sums that lie in [lower, upper] inclusive. Range sum S(i, j) is defined as the sum of the elements in nums between indices i and j (i ≤ j), inclusive. Note: A naive algorithm of O(n2) is t…

瀏覽器訪問本地文件

之前一直苦惱無法在瀏覽器訪問本地文件,尤其是寫的網頁需要調用外部數據的時候,今天學習到可以用python很方便的解決問題 如果有python3環境,直接在對應的文件夾下運行(這里是Ubuntu環境,如果是Windows應該在命令行也…

Ubuntu使用jupyter notebook +導出PDF

因為最近需要做數據分析的工作,所以復習了一下numpy和pandas,并安裝了jupyter notebook進行數據分析,這里記錄一下環境的設置。 ps:jupyter notebook真香 安裝 python3 -m pip install --upgrade pip //升級pip pip3 install jupyter使用 …

SSH:WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!

給服務器重裝了一下系統,結果報了上述錯誤: WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! Someone could be eavesdropping on you right now (man-in-the-middle attack)! ...在網上找…