我創建了一個世界氣泡圖,其中氣泡是根據國家/地區的地理位置形成的,氣泡半徑(大小)應根據單選按鈕中選擇的引數而變化。
例如,如果選擇人口,則氣泡大小應根據每個國家的人口規模形成,并通過選擇下一步按鈕,它應根據所選引數進行更改。
到目前為止,我已經設法形成了一個氣泡圖,它從 JSON 檔案中讀取資料以繪制第一個氣泡,但我一直堅持如何讓它從我的 CSV 檔案中讀取我的其他引數,因為所有必要的資料都需要可視化位于地理定位資料來自的 JSON 檔案的單獨 CSV 檔案中。
有沒有辦法,我可以鏈接我的 CSV 檔案以根據國家/地區的地理位置和 CSV 檔案中的引數創建氣泡。我所有的編碼都在這個
您當前的工具提示內容未顯示所選屬性的值(黃色),但顯示了所選選項的標簽(藍色下劃線)。讓我們再深入一點,這是當前的內容邏輯:
<div>
<h3>${hover.NAME}</h3>
<div style="margin: 10px">
<h4>CountryCode : ${hover.ISO_A2} </h4>
<h4> ContinentCode : ${hover.CONTINENT} </h>
<h4>${parameter } : ${d3.format(",")(hover[p])}</h4>
</div>
</div>
在這種情況下hover,是一個具有屬性的物件,ISO_A2而不是您
很明顯,最初的意圖是讓資料作為資料饋送的一部分在那個時候可用,也很明顯,沒有做任何事情來合并這兩個資料集,所以現在讓我們這樣做。
在這種情況下,我的偏好是使用forEach迭代和修改每個條目以包含來自csv檔案countries的整個匹配記錄。您可以使用,但在這種情況下,我們已經將大量資料加載到記憶體中,我們不需要保留國家 JSON 的未更改版本以及可能產生的新輸出。mapmap
我建議將 CSV 中的資料注入國家/地區陣列的另一個原因是,當我們需要訪問資料時,我們可以避免查找開銷。將csv資料和國家/地區資料排列到相同長度的陣列中并進行排序,以便相同的索引與每個檔案中的相同國家/地區相關聯,與注入資料產生相同的開銷,并使其更具確定性。支持一個陣列比另一個陣列具有更多值的場景也更容易。
我們只需要知道用于標識每個檔案中唯一記錄的屬性映射。我們可以看到csv檔案使用的是 2 個字母的國家/地區代碼:
| country_id | 國家的名字 | 國家代碼 | 大陸代碼 | 中心經度 | 中緯度 | 面積平方公里 | 人口 | 機場 | 國內生產總值增長率 | 通貨膨脹率 | 失業率 | popnbelowpoverty | 中年的 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 12 | 澳大利亞 | 非盟 | 超頻 | 135.0 | -25.0 | 7741220 | 26141369 | 418 | 1.84 | 1.60 | 5.16 | 0.00 | 37.50 |
| 13 | 奧地利 | 在 | 歐盟 | 13.33 | 47.33 | 83871 | 8913088 | 50 | 1.42 | 1.50 | 7.35 | 13.30 | 44.50 |
| 114 | 印度 | 在 | 作為 | 77.0 | 20.0 | 3287263 | 1389637446 | 346 | 4.86 | 3.70 | 8.50 | 21.90 | 28.70 |
| 115 | 印度尼西亞 | ID | 作為 | 120.0 | -5.0 | 1904569 | 277329163 | 673 | 5.03 | 2.80 | 5.31 | 9.40 | 31.10 |
我選擇了兩對澳大利亞、奧地利和印度、印度尼西亞進行比較,因為它們涵蓋了常見的匹配問題,大多數國家都有 2 個字母的郵政編碼,人們通常會先選擇這個,但是印度的郵政編碼是 3 個字母,印度尼西亞的是 4,Austria 有 1。我發現這個資料集特別有趣,因為名稱術語在字典上非常接近,但它們的唯一代碼有多么不同,所以我總是先檢查這些特定案例,然后再對整個資料集進行測驗或證明。
json檔案中的feature property metadata有很多資訊,重要的是它也有ISO_A2值,就是ISO標準的2字母國家代碼。
| 特征分類 | 規模等級 | 標簽排名 | 主權 | SOV_A3 | ADM0_DIF | 等級 | 型別 | 薄層色譜 | 行政 | ADM0_A3 | GEOU_DIF | GEOUNIT | GU_A3 | SU_DIF | SUBUNIT | SU_A3 | BRK_DIFF | NAME | NAME_LONG | BRK_A3 | BRK_NAME | BRK_GROUP | ABBREV | POSTAL | FORMAL_EN | FORMAL_FR | NAME_CIAWF | NOTE_ADM0 | NOTE_BRK | NAME_SORT | NAME_ALT | MAPCOLOR7 | MAPCOLOR8 | MAPCOLOR9 | MAPCOLOR13 | POP_EST | POP_RANK | POP_YEAR | GDP_MD | GDP_YEAR | ECONOMY | INCOME_GRP | FIPS_10 | ISO_A2 | ISO_A2_EH | ISO_A3 | ISO_A3_EH | ISO_N3 | ISO_N3_EH | UN_A3 | WB_A2 | WB_A3 | WOE_ID | WOE_ID_EH | WOE_NOTE | ADM0_ISO | ADM0_DIFF | ADM0_TLC | ADM0_A3_US | ADM0_A3_FR | ADM0_A3_RU | ADM0_A3_ES | ADM0_A3_CN | ADM0_A3_TW | ADM0_A3_IN | ADM0_A3_NP | ADM0_A3_PK | ADM0_A3_DE | ADM0_A3_GB | ADM0_A3_BR | ADM0_A3_IL | ADM0_A3_PS | ADM0_A3_SA | ADM0_A3_EG | ADM0_A3_MA | ADM0_A3_PT | ADM0_A3_AR | ADM0_A3_JP | ADM0_A3_KO | ADM0_A3_VN | ADM0_A3_TR | ADM0_A3_ID | ADM0_A3_PL | ADM0_A3_GR | ADM0_A3_IT | ADM0_A3_NL | ADM0_A3_SE | ADM0_A3_BD | ADM0_A3_UA | ADM0_A3_UN | ADM0_A3_WB | CONTINENT | REGION_UN | SUBREGION | REGION_WB | NAME_LEN | LONG_LEN | ABBREV_LEN | TINY | HOMEPART | MIN_ZOOM | MIN_LABEL | MAX_LABEL | LABEL_X | LABEL_Y | NE_ID | WIKIDATAID | NAME_AR | NAME_BN | NAME_DE | NAME_EN | NAME_ES | NAME_FA | NAME_FR | NAME_EL | NAME_HE | NAME_HI | NAME_HU | NAME_ID | NAME_IT | NAME_JA | NAME_KO | NAME_NL | NAME_PL | NAME_PT | NAME_RU | NAME_SV | NAME_TR | NAME_UK | NAME_UR | NAME_VI | NAME_ZH | NAME_ZHT | FCLASS_ISO | TLC_DIFF | FCLASS_TLC | FCLASS_US | FCLASS_FR | FCLASS_RU | FCLASS_ES | FCLASS_CN | FCLASS_TW | FCLASS_IN | FCLASS_NP | FCLASS_PK | FCLASS_DE | FCLASS_GB | FCLASS_BR | FCLASS_IL | FCLASS_PS | FCLASS_SA | FCLASS_EG | FCLASS_MA | FCLASS_PT | FCLASS_AR | FCLASS_JP | FCLASS_KO | FCLASS_VN | FCLASS_TR | FCLASS_ID | FCLASS_PL | FCLASS_GR | FCLASS_IT | FCLASS_NL | FCLASS_SE | FCLASS_BD | FCLASS_UA |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Admin-0 國家 | 1 | 2 | 澳大利亞 | AU1 | 1 | 2 | 國家 | 1 | 澳大利亞 | 澳大利亞 | 0 | 澳大利亞 | 澳大利亞 | 0 | 澳大利亞 | 澳大利亞 | 0 | 澳大利亞 | 澳大利亞 | 澳大利亞 | 澳大利亞 | 奧茲。 | 非盟 | 澳大利亞聯邦 | 澳大利亞 | 澳大利亞 | 1 | 2 | 2 | 7 | 25364307 | 15 | 2019 | 1396567 | 2019 | 2.發達地區:nonG7 | 1. 高收入:經合組織 | 作為 | 非盟 | 非盟 | 澳大利亞 | 澳大利亞 | 36 | 36 | 36 | 非盟 | 澳大利亞 | -90 | 23424748 | 包括阿什莫爾和卡地亞群島 (23424749) 和珊瑚海群島 (23424790)。 | 澳大利亞 | 澳大利亞 | 澳大利亞 | 澳大利亞 | 澳大利亞 | 澳大利亞 | 澳大利亞 | 澳大利亞 | 澳大利亞 | 澳大利亞 | 澳大利亞 | 澳大利亞 | 澳大利亞 | 澳大利亞 | 澳大利亞 | 澳大利亞 | 澳大利亞 | 澳大利亞 | 澳大利亞 | 澳大利亞 | 澳大利亞 | 澳大利亞 | 澳大利亞 | 澳大利亞 | 澳大利亞 | 澳大利亞 | 澳大利亞 | 澳大利亞 | 澳大利亞 | 澳大利亞 | 澳大利亞 | 澳大利亞 | 澳大利亞 | -99 | -99 | 大洋洲 | 大洋洲 | 澳大利亞和新西蘭 | 東亞和太平洋 | 9 | 9 | 4 | -99 | 1 | 0 | 1.7 | 5.7 | 134.04972 | -24.129522 | 1159320355 | Q408 | ???????? | ???????????? | 澳大利亞人 | 澳大利亞 | 澳大利亞 | 翻譯 | 澳大利亞 | Αυστραλ?α | ???????? | ??????????? | 澳大利亞 | 澳大利亞 | 澳大利亞 | オーストラリア | ??????? | 澳大利亞 | 澳大利亞 | 澳大利亞 | Австралия | 澳大利亞人 | 澳大利亞 | Австрал?я | ???????? | úc | 澳大利亞人 | 澳大利亞人 | Admin-0 國家 | Admin-0 國家 | ||||||||||||||||||||||||||||||||||||||
| Admin-0 國家 | 1 | 4 | 奧地利 | 奧特 | 0 | 2 | 主權國家 | 1 | 奧地利 | 奧特 | 0 | 奧地利 | 奧特 | 0 | 奧地利 | 奧特 | 0 | 奧地利 | 奧地利 | 奧特 | 奧地利 | 澳大利亞。 | 一個 | 奧地利共和國 | 奧地利 | 奧地利 | 3 | 1 | 3 | 4 | 8877067 | 13 | 2019 | 445075 | 2019 | 2.發達地區:nonG7 | 1. 高收入:經合組織 | 非盟 | 在 | 在 | 奧特 | 奧特 | 40 | 40 | 40 | 在 | 奧特 | 23424750 | 23424750 | 與國家完全匹配 | 奧特 | 奧特 | 奧特 | 奧特 | 奧特 | 奧特 | 奧特 | 奧特 | 奧特 | 奧特 | 奧特 | 奧特 | 奧特 | 奧特 | 奧特 | 奧特 | 奧特 | 奧特 | 奧特 | 奧特 | 奧特 | 奧特 | 奧特 | 奧特 | 奧特 | 奧特 | 奧特 | 奧特 | 奧特 | 奧特 | 奧特 | 奧特 | 奧特 | -99 | -99 | 歐洲 | 歐洲 | 西歐 | 歐洲和中亞 | 7 | 7 | 5 | -99 | 1 | 0 | 3 | 8 | 14.130515 | 47.518859 | 1159320379 | Q40 | 回復 | ?????????? | 奧斯特賴希 | 奧地利 | 奧地利 | 反義詞 | 奧特里什 | Αυστρ?α | ??????? | ????????? | 奧地利 | 奧地利 | 奧地利 | オーストリア | ????? | 奧斯滕賴克 | 奧地利 | 奧地利 | Австрия | 奧斯特里克 | 阿烏斯圖里亞 | Австр?я | ?????? | 奧 | 反問 | 反問 | Admin-0 國家 | Admin-0 國家 | ||||||||||||||||||||||||||||||||||||||
| Admin-0 國家 | 1 | 2 | 印度 | IND | 0 | 2 | 主權國家 | 1 | 印度 | IND | 0 | 印度 | IND | 0 | 印度 | IND | 0 | 印度 | 印度 | IND | 印度 | 印度 | IND | 印度共和國 | 印度 | 印度 | 1 | 3 | 2 | 2 | 1366417754 | 18 | 2019 | 2868929 | 2019 | 3. 新興地區:金磚四國 | 4. 中低收入 | 在 | 在 | 在 | IND | IND | 356 | 356 | 356 | 在 | IND | 23424848 | 23424848 | 與國家完全匹配 | IND | IND | IND | IND | IND | IND | IND | IND | IND | IND | IND | IND | IND | IND | IND | IND | IND | IND | IND | IND | IND | IND | IND | IND | IND | IND | IND | IND | IND | IND | IND | IND | IND | -99 | -99 | 亞洲 | 亞洲 | 南亞 | 南亞 | 5 | 5 | 5 | -99 | 1 | 0 | 1.7 | 6.7 | 79.358105 | 22.686852 | 1159320847 | Q668 | 回復 | ???? | 印度人 | 印度 | 印度 | ??? | 印地 | νδ?α | ???? | ???? | 印度 | 印度 | 印度 | 因多 | ?? | 印度 | 獨立 | 印度 | Индия | 印度人 | 印度斯坦 | ?нд?я | ????? | ?n ?? | 印度 | 印度 | Admin-0 國家 | Admin-0 國家 | ||||||||||||||||||||||||||||||||||||||
| Admin-0 國家 | 3 | 2 | 印度尼西亞 | 國際化域名 | 0 | 2 | 主權國家 | 1 | 印度尼西亞 | 國際化域名 | 0 | 印度尼西亞 | 國際化域名 | 0 | 印度尼西亞 | 國際化域名 | 0 | 印度尼西亞 | 印度尼西亞 | 國際化域名 | 印度尼西亞 | 印度。 | 印度 | 印度尼西亞共和國 | 印度尼西亞 | 印度尼西亞 | 6 | 6 | 6 | 11 | 270625568 | 17 | 2019 | 1119190 | 2019 | 4. 新興地區:MIKT | 4. 中低收入 | ID | ID | ID | 國際化域名 | 國際化域名 | 360 | 360 | 360 | ID | 國際化域名 | 23424846 | 23424846 | 與國家完全匹配 | 國際化域名 | 國際化域名 | 國際化域名 | 國際化域名 | 國際化域名 | 國際化域名 | 國際化域名 | 國際化域名 | 國際化域名 | 國際化域名 | 國際化域名 | 國際化域名 | 國際化域名 | 國際化域名 | 國際化域名 | 國際化域名 | 國際化域名 | 國際化域名 | 國際化域名 | 國際化域名 | 國際化域名 | 國際化域名 | 國際化域名 | 國際化域名 | 國際化域名 | 國際化域名 | 國際化域名 | 國際化域名 | 國際化域名 | 國際化域名 | 國際化域名 | 國際化域名 | 國際化域名 | -99 | -99 | 亞洲 | 亞洲 | 東南亞 | 東亞和太平洋 | 9 | 9 | 5 | -99 | 1 | 0 | 1.7 | 6.7 | 101.892949 | -0.954404 | 1159320845 | Q252 | ????????? | ???????????? | 印度尼西亞語 | 印度尼西亞 | 印度尼西亞 | 回復 | 印度尼西亞 | Ινδονησ?α | 雅加達 | ?????????? | 印度尼西亞 | 印度尼西亞 | 印度尼西亞 | 因ドネシア | ????? | 印度尼西亞語 | 因多內賈 | 印度尼西亞 | Индонезия | 印度尼西亞語 | Endonezya | ?ндонез?я | 英語 | 印度尼西亞 | 這話 | 這話 | Admin-0 國家 | Admin-0 國家 |
有很多不同的方法可以做到這一點,我只是去find匹配的記錄并將其填充到一個名為使用詳細方法的新屬性csv中,以便于理解:
// Convert the TopoJSON to GeoJSON
countries = {
const geo = topojson.feature(map_layer, map_layer.objects.countries);
geo.features.forEach(feature => {
if(feature.geometry) {
feature.centroid = centroid(feature);
}
let code = feature.properties.ISO_A2;
let cData = country_data.find(x => x.CountryCode === code);
feature.properties.csv = cData ?? {
areasqkm: "",
population: "",
airports: "",
gdpgrowthrate: "",
inflationrate: "",
unemploymentrate: "",
popnbelowpoverty: "",
medianage: ""
};
return feature;
});
return geo;
}
現在資料可用,包括一個空記錄以簡化以后的錯誤處理。讓我們首先將其添加到工具提示內容中,以驗證它是否有效,我將轉儲所有擴展資料,以便我們可以探索不同的值:
<div>
<h3>${hover.NAME}</h3>
<div style="margin: 10px">
<h4>CountryCode : ${hover.ISO_A2} </h4>
<h4> ContinentCode : ${hover.CONTINENT} </h>
<h4>${parameter } : ${d3.format(",")(hover.csv[p])}</h4>
<hr style="padding:0px"/>
<smaller>
Area Sqkm: ${d3.format(",")(hover.csv['areasqkm'])}<br/>
Population: ${d3.format(",")(hover.csv['population'])}<br/>
Airports: ${hover.csv['airports']}<br/>
GDP Growth Rate: ${d3.format(",")(hover.csv['gdpgrowthrate'])}<br/>
Inflation Rate: ${d3.format(",")(hover.csv['inflationrate'])}<br/>
Unemployment Rate: ${d3.format(",")(hover.csv['unemploymentrate'])}<br/>
Pop. Below Poverty: ${d3.format(",")(hover.csv['popnbelowpoverty'])}<br/>
Median Age: ${hover.csv['medianage']}<br/>
<smaller>
</div>
</div>

現在您只需將這些屬性映射路徑應用到您的氣泡邏輯,我實際上將把該邏輯留在這里,主要問題是如何使資料可用,使用直接值呈現比例存在實用性問題形狀。很快你就會得到一些小到無法點擊或看到它們的物品,其他形狀會有如此大的差異,以至于功能forceCollide()只會弄得一團糟……看看這張氣泡圖中津巴布韋的通貨膨脹率:

將值映射到特定大小的域通常更實用,1-5 的比例通常就足夠了,但您可以轉到 10,其中 1 是地圖上最小的,10 是最大的,然后將資料范圍修剪為標準偏差,使得低于所有的例外值得到 1,高于所有的離群值得到相同的最大值。
技術和推理遠遠超出了這個討論空間。
uj5u.com熱心網友回復:
上面來自Chris的示例運行良好,是我提出的問題的一個很好的解決方案,并且是一步一步的好方法。我要感謝您的出色回答以及您為消除我的脆弱性和困惑所投入的時間。
但是,我也嘗試快速解決問題,并最終從我的 (.CSV) 檔案中創建了我自己的 (.geojson) 資料,這也有效,但并不比上述解決方案更好。
現在,由于我需要使用世界上幾乎所有國家/地區的許多引數,例如“能源消耗、生產、電力生產和消耗、黃金儲備、白銀儲備......以及所有經濟資料”,因此創建 (.csv) 檔案對于所有這些資料都不是一個好的解決方案(是嗎?)并且很耗時。
因此,我想使用 OWID DATA來獲取創建大型可視化所需的所有資料集。我做了一些研究,發現最簡單的方法是“fetch”方法,我嘗試實作但沒有成功。
如果有人能指出我正確的方向,那將很有幫助。如果有人能告訴我如何根據 OWID 資料庫設定我的引數名稱并根據按鈕單擊獲取資料,就像當前從我的 JSON 檔案中一樣,那么氣泡半徑將在每次按鈕單擊和氣泡時改變僅在滑鼠懸停時顯示所選引數資訊。
這是我用(.geojson 資料)做的筆記本:Bubble Cluster。
Ps:只有在引數選擇后才會出現氣泡:)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/504326.html
標籤:javascript 数组 d3.js 气泡图
