99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
首頁精彩閱讀用Python可視化分析全球火山分布,發(fā)現(xiàn)了這些有趣的現(xiàn)象(CDA干貨分享)
用Python可視化分析全球火山分布,發(fā)現(xiàn)了這些有趣的現(xiàn)象(CDA干貨分享)
2022-01-19
收藏

作者:俊欣

來源:關(guān)于數(shù)據(jù)分析與可視化

也就在前天,南太平洋島國湯加發(fā)生火山噴發(fā),有專門的專家學(xué)者分析,這可能是30年來全球規(guī)模最大的一次海底火山噴發(fā),它引發(fā)的海嘯以及火山灰將對周邊的大氣、洋流、淡水、農(nóng)業(yè)以及民眾健康等都造成不同程度的影響。

今天小編就用Python當(dāng)中的folium模塊以及其他的可視化庫來對全球的火山情況做一個分析。

準(zhǔn)備工作

和以往一樣,我們先導(dǎo)入需要數(shù)據(jù)分析過程當(dāng)中需要用到的模塊并且讀取數(shù)據(jù)集,本次的數(shù)據(jù)集來自由kaggle網(wǎng)站,主要由美國著名的史密森學(xué)會整理所得

import pandas as pd import folium.plugins as plugins import folium

df_volcano = pd.read_csv("volcano.csv")
df_volcano.head()

output

數(shù)據(jù)集包含了這些個數(shù)據(jù)

df_volcano.columns 

output

Index(['volcano_number', 'volcano_name', 'primary_volcano_type', 'last_eruption_year', 'country', 'region', 'subregion', 'latitude', 'longitude', 'elevation', 'tectonic_settings', 'evidence_category', 'major_rock_1', 'major_rock_2', 'major_rock_3', 'major_rock_4', 'major_rock_5', 'minor_rock_1', 'minor_rock_2', 'minor_rock_3', 'minor_rock_4', 'minor_rock_5', 'population_within_5_km', 'population_within_10_km', 'population_within_30_km', 'population_within_100_km'],
      dtype='object')

全球火山帶的分布可視化

我們通過調(diào)用folium模塊來繪制一下全球各個火山的分布,代碼如下

volcano_map = folium.Map() # 將每一行火山的數(shù)據(jù)添加進(jìn)來 for i in range(0, df_volcano.shape[0]):
    volcano = df_volcano.iloc[i]
    folium.Marker([volcano['latitude'], volcano['longitude']], popup=volcano['volcano_name']).add_to(volcano_map)

volcano_map

output

上述代碼的邏輯大致來看就是先實例化一個Map()對象,然后遍歷每一行的數(shù)據(jù),主要針對的是數(shù)據(jù)集當(dāng)中的經(jīng)緯度數(shù)據(jù),并且在地圖上打上標(biāo)簽,我們點擊每一個標(biāo)簽都會自動彈出對應(yīng)的火山的名稱

當(dāng)然出來的可視化結(jié)果不怎么美觀,我們先通過簡單的直方圖來看一下全球火山的分布情況,代碼如下

fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(16, 4))

volcano_country = pd.DataFrame(df_volcano.groupby(['country']).size()).sort_values(0, ascending=True)
volcano_country.columns = ['Count']
volcano_country.tail(10).plot(kind='barh', legend=False, ax=ax1)
ax1.set_title('Number of Volcanoes per Country')
ax1.set_ylabel('Country')
ax1.set_xlabel('Count')

volcano_region = pd.DataFrame(df_volcano.groupby(['region']).size()).sort_values(0, ascending=True)
volcano_region.columns = ['Count']
volcano_region.tail(10).plot(kind='barh', legend=False, ax=ax2)
ax2.set_title('Number of Volcanoes per Region')
ax2.set_ylabel('Region')
ax2.set_xlabel('Count')

plt.tight_layout()
plt.show()

output

可以看到火山主要集中在美國、印度尼西亞以及日本較多,而單從地域來看,南美以及日本、中國臺灣和印度尼西亞等地存在著較多的火山

全球火山帶的分布可視化優(yōu)化

接下來我們來優(yōu)化一下之前繪制的全球火山分布的地圖,調(diào)用folium模塊當(dāng)中CircleMarker方法,并且設(shè)定好標(biāo)記的顏色與大小

volcano_map = folium.Map(zoom_start=10)
groups = folium.FeatureGroup('') # 將每一行火山的數(shù)據(jù)添加進(jìn)來 for i in range(0, df_volcano.shape[0]):
    volcano = df_volcano.iloc[i]
    groups.add_child(folium.CircleMarker([volcano['latitude'], volcano['longitude']],
                                         popup=volcano['volcano_name'], radius=3, color='blue',
                                         fill=True, fill_color='blue',fill_opacity=0.8))
    
volcano_map.add_child(groups)
volcano_map.add_child(folium.LatLngPopup())

output

地圖可視化實戰(zhàn)

然后我們來看一下這次火山的爆發(fā)地點,湯加共和國位于西南太平洋,屬于大洋洲,具體位置是在西經(jīng)175°和南緯20°左右,

import folium.plugins as plugins import folium m = folium.Map([-21.178986, -175.198242], zoom_start=10, control_scale=True, width='80%') m 

output

第一個參數(shù)非常明顯代表的是經(jīng)緯度,而zoom_start參數(shù)代表的是縮放的程度,要是我們需要進(jìn)一步放大繪制的圖表,可以通過調(diào)整這個參數(shù)來實現(xiàn),而width參數(shù)代表的則是最后圖表繪制出來的寬度。

地圖上打上標(biāo)記

我們也可以在繪制出來的地圖上面打上標(biāo)記,例如畫個圓圈,代碼如下

m = folium.Map([-21.178986, -175.198242], zoom_start=12, control_scale=True, width='80%') folium.Circle(location = [-21.177986, -175.199242], radius = 1500, color = "purple").add_to(m) m 

output

或者給圈出來的區(qū)域標(biāo)上顏色,代碼如下

m = folium.Map([-21.178986, -175.198242],
               zoom_start=12,
               control_scale=True, width='80%')
folium.Circle(location = [-21.177986, -175.199242], radius = 1500,
              color = "purple", fill = True, fill_color = "red").add_to(m)
m

output

深遠(yuǎn)影響

本次湯加火山爆發(fā)的VEI強(qiáng)度為5-6級,屬于本世紀(jì)以來最強(qiáng)等級,后面連帶引發(fā)的海嘯影響了太平洋沿岸地區(qū)。太平洋沿岸的智利、日本等國的潮位站監(jiān)測到30厘米至150厘米的海嘯波,我國潮位站最大海嘯波幅在20厘米以下,短期內(nèi)太平洋沿岸國際航運(yùn)或受到影響,需要重點關(guān)注美豆到港情況。

而從長期來看,熱帶火山爆發(fā)或提高全球極端天氣發(fā)生概率,從而影響農(nóng)作物的生長,對整個農(nóng)產(chǎn)品的供應(yīng)造成深遠(yuǎn)的影響,而如果火山灰大面積擴(kuò)散,或進(jìn)一步影響全球航空業(yè),降低運(yùn)輸效率,拖累全球供應(yīng)鏈。

數(shù)據(jù)分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數(shù)據(jù)分析師資訊
更多

OK
客服在線
立即咨詢
客服在線
立即咨詢
') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機(jī)數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進(jìn)行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個參數(shù)驗證碼對象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺檢測極驗服務(wù)器是否宕機(jī) new_captcha: data.new_captcha, // 用于宕機(jī)時表示是新驗證碼的宕機(jī) product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說明請參見:http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計時完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }