數據可視化【十】繪制地圖

Loading and parsing TOPOJSON

導入Topojson d3文件
地址:https://unpkg.com/topojson@3.0.2/dist/topojson.min.js
想要找d3文件的話去unpkg.com好像大部分都能找到的樣子

Rendering geographic features

尋找合適的地圖數據:谷歌搜索world-atlas npm,第一個網站點進去,然后選擇合適的d3文件。
這個文件里面的地圖是Topojson格式的,想要轉化為geojson需要使用topojson中的feature函數,傳入兩個參數,例如:

json('https://cdn.jsdelivr.net/npm/world-atlas@2/countries-110m.json').then(data => { const countries = feature(data, data.objects.countries);console.log(countries);	}

然后就可以使用數據,給每個數據添加path,然后通過設置屬性d進行繪制

Using different map projections

圖形的不同關鍵就在繪制d的函數的不同。
d3官網上有許多繪制不同形狀地圖的函數,可以根據需要選擇自己喜歡的。
網址:https://github.com/d3/d3-geo-projection
這里選擇的是geoEqualEarth,這個函數需要從d3文件中導入。于此同時還需要導入geoPath函數

const projection = geoEqualEarth();
const pathGenerator = geoPath().projection(projection);json('https://cdn.jsdelivr.net/npm/world-atlas@2/countries-110m.json').then(data => { const countries = feature(data, data.objects.countries);console.log(countries);	svg.selectAll('path').data(countries.features).enter().append('path').attr('class', 'country').attr('d', pathGenerator);});

Rendering the projected sphere outline

然后就是通過設置CSS文件設置顏色,為了讓地圖的圓形凸顯出來,我們要先給邊框創建一個path

svg.append('path').attr('class', 'sphere').attr('d', pathGenerator({type:"Sphere"}));

然后在CSS文件中根據設置的類設置顏色:

.country{fill: #15ed76;stroke: black;stroke-opacity: 0.3;
}.sphere{fill: #15beed;
}

Tweaking map styles

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

Highlighting on Hover using CSS

上面的效果已經不錯了,但是如果我們想要鼠標放在上面就自動變色的話,我們可以在CSS文件里面添加hover屬性,然后就可以了。

styles.css

.country:hover {
/*   鼠標放在上面可以變色 */fill : red;
}

效果圖:
在這里插入圖片描述

Adding simple tooltips(using )

我們還希望鼠標停留在上面的畫可以提示國家的名稱,想要做到這點,我們可以給每個path添加title,然后設置文本為國家名稱即可。例如:
index.js

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

我這里的數據直接就有國家名稱,視頻中的沒有還需要使用tsv文件查找。如果有需要的話可以看原視頻。

Loading multiple data files

Looking up country name from id

Panning & Zooming

當然我們還希望能夠放大和縮小,這樣才能看到更多的細節。為了實現這個效果,我們要把所有的東西都放到g上,然后再讓svg.call(zoom().on('zoom', callback))添加鼠標滑輪事件。具體到這里我們希望圖像的大小可以跟隨滑輪的滾動而變化:

const g = svg.append('g');svg.call(zoom().on('zoom',() => {g.attr('

效果圖:
在這里插入圖片描述這里的地圖應該比上面的清晰許多,是因為這里使用的數據是以10m為單位的,所以分辨率高一點。如果需要的話只需要把最前面地圖的topojson的網址換成10m的即可:https://cdn.jsdelivr.net/npm/world-atlas@2.0.2/countries-10m.json

(比較大,加載稍微有點慢)

視頻中的內容到這里就結束了,可是我總覺得這樣的顏色有些丑,我想起來在以前做柱狀圖的時候我嫌棄他的顏色太丑自己做了一個選擇顏色的函數,在這里也可以用一下:

let colorSet = ['#eb2617', '#ffaa00', '#4dff00', '#00fbff', '#bb00ff', '#eeff00'];const createGetColor = (idx)=>{var i = idx || -1;return {get : () => {i=(i+1)%colorSet.length; return colorSet[i];}};
};const getColor = createGetColor();

createGetColor函數會返回一個對象,對象中get屬性為函數,這個函數中使用了外層的變量i,因此i不會被釋放掉,相當于靜態變量,每次調用這個函數這個變量都會加一,起到遍歷顏色數組的功能。

在有了這個獲取顏色函數以后我們只需要刪掉CSS文件中設置地圖顏色語句,然后在append后面設置屬性即可。

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

效果圖:在這里插入圖片描述
在這里插入圖片描述

顏色選擇的有點鮮艷,不過看起來還不錯,有點世界地圖的感覺。

代碼地址:https://vizhub.com/Edward-Elric233/2e91c94015e345afb0c9f3ae6cde412f

感覺這個球體部分地方有些變形,我們可以換一個地圖的形狀

例如換成geoMercator
在這里插入圖片描述

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

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

相關文章

數據可視化【十一】樹狀圖

Constructing a node-link tree visualization 首先將節點之間的連線畫出來。 使用json函數讀取文件以后,使用hierarchy等函數得到連線的數組,然后綁定這個數組,給每個元素添加一個path,繪畫使用的是一個函數linkHorizontal&…

數據可視化【十二】 顏色圖例和尺寸圖例

有了前面的知識,制作一個圖例應該不是很難,關鍵是我們想要制作一個可以在其他地方進行使用的圖例,這樣就需要能夠動態地設置圖例的大小,位置,等等。 這里直接上代碼: colorLegend.js export const color…

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

在前面的博客中已經介紹了如何繪制地圖,這一節學習如何繪制地區分布圖。如果對繪制地圖還不熟悉的話可以了解一下之前我寫的博客:數據可視化【十】繪制地圖 Intergrating(整合) TopoJSON with tabular data(列表數據) 在前面的博客中沒有使用到tsv文件…

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…