数人之道原创文章,转载请联系我们
南太平洋岛国汤加的一座海底火山,于当地时间 1 月 14 日、15 日,连续两次剧烈喷发,爆发出大量岩浆并引发海啸,海浪环绕地球足足两圈,导致环太平洋多国发布海啸预警。这次火山喷发初步评估VEI 等级为 5~6 级,或对全球航运和农业造成较大影响。
上次听说汤加这个国家,还是在去年的东京奥运会上,体态健美的奥运男子旗手让汤加这个国家登上了热搜。
图0-1:东京奥运会上的汤加旗手
我们通过几组卫星云图照片,来感受一下这次汤加火山喷发的威力程度。
图0-2:汤加火山喷发卫星动态云图
图0-3:汤加火山喷发卫星动态云图
图0-4:汤加火山喷发卫星云图捕捉画面
这次在全球范围内影响甚广的火山喷发,再次引起人们对全球火山的关注。那全球火山的分布情况到底如何?汤加这次喷发的火山具体在地图上哪个位置?距离汤加首都多远?下面我们用 Python 的 folium 及 pyecharts 模块结合火山数据集进行可视化分析。
1
数据准备
从机器学习及数据科学社区平台 Kaggle 下载由美国华盛顿史密森尼学会整理的全球火山数据集,使用 pandas 模块读取并存储数据集用于分析(若无法注册或找不到数据集,可关注公众号『数人之道』,回复 火山 获取数据集文件)。
这次我们使用 Jupyter Notebook 进行代码编写及调试,以方便观察分析结果。
图1-1:读入并存储火山数据集
此数据集的火山信息十分详尽丰富,非常适合做多维度的分析研究。
2
全球火山带分布分析
我们准备用两种可视化的方式,分析全球火山带的分布及统计火山分布最多的地区、国家。
使用 folium 模块的地图,标记全球火山的位置,可视化展示全球火山带分布情况;使用 pyecharts 模块的柱状图,可视化统计火山在各个国家、地区的分布数量。
2.1
地图可视化分析
2.1.1. 标签式地图标记
读取火山数据集,循环遍历每一行数据,提取其火山的经纬度及名称信息,作为参数传入 folium 模块的 Marker() 方法中进行标签式地图标记,并将标记结果加入实例化的 Map() 对象中,以在地图中进行可视化展示。
【参数介绍】
folium.Marker() 的常用参数:
- location:同 folium.Map() 中的同名参数,tuple 或 list 类型输入,格式为(纬度,经度)或[纬度,经度],默认为 None,用于确定标记部件的经纬位置
- popup:str 型或 folium.Popup() 对象输入,用于控制标记部件的具体样式(folium 内部自建了许多样式),默认为 None,即不显示部件;这里设置为对应的火山名称
- icon:folium.Icon() 对象,用于设置 popup 定义的部件的具体颜色、图标内容等
- tooltip:str 型,用于标记点击前的提示,悬停在标记上不用点击即会显示,可介绍点击标记会显示的内容
【代码】
代码语言:javascript复制# 将火山在地图中进行标签式标记显示
volcano_map = folium.Map()
for i in range(0, len(tb_volcano)):
volcano_info = tb_volcano.iloc[i]
latitude = volcano_info["latitude"]
longitude = volcano_info["longitude"]
volcano_name = volcano_info["volcano_name"]
folium.Marker([latitude, longitude], popup=volcano_name, tooltip="Click to see the Volcano Name", icon=folium.Icon(color='red', icon='info-sign')).add_to(volcano_map)
volcano_map
【结果】
图2-1-1:标签式标记火山在地图上的位置
2.1.2. 圆圈式地图标记
上面的 Maker() 方法输出的标记图形太大了,可视范围内标记十几个还好,但是火山数据有接近一千条,不太利于观察。我们利用 CircleMarker() 方法,将标记改为有颜色的圈,进行标记显示优化。并通过 add_child() 方法,添加点击触发事件 LatLngPopup(),实现点击地图任意一处均可显示对应的经纬度信息的子功能。
【参数介绍】
folium.CircleMarker() 的常用参数:
- location:同 folium.Map() 中的 location,用于控制圆圈的圆心坐标
- radius:int 型,用于控制圆圈的半径,单位为像素;注意,在 folium.CircleMarker() 中,因为 radius 的单位是像素,即其为屏幕上大小固定的一个圆圈,随着地图的缩放,其大小也不会发生变化;但在 folium.Circle() 方法中,radius 参数单位为米,所以其大小会随着地图的缩放程度而进行相应的变化
- color:str 型,用于控制圆圈的颜色,默认为十六进制颜色"#3388ff",即一种蓝色,可直接输入颜色名称
- fill:bool 型,当为 True 时,圆圈内部将被填充上色彩,默认不填充
- fill_color:str 型,控制圆圈内部填充的色彩,默认与 color 参数一致
- fill_opacity:float 型,用于控制圆圈内部填充颜色的透明度,从 0.到 1.之间,默认为 0.2
- popup:str 型或 folium.Popup() 对象,用于控制圆圈的样式,默认为 None,即无样式
【代码】
代码语言:javascript复制# 将火山在地图中进行圆圈式标记显示
volcano_circle_map = folium.Map()
for i in range(0, len(tb_volcano)):
volcano_info = tb_volcano.iloc[i]
latitude = volcano_info["latitude"]
longitude = volcano_info["longitude"]
volcano_name = volcano_info["volcano_name"]
folium.CircleMarker((latitude, longitude), popup=volcano_name, tooltip="Click to see the Volcano Name",
radius=3, color="red", fill=True, fill_color="red", fill_opacity=0.8).add_to(volcano_circle_map)
# 点击地图显示经纬度信息
volcano_circle_map.add_child(folium.LatLngPopup())
volcano_circle_map
【结果】
图2-1-2:圆圈式标记火山在地图上的位置
比标签式更加方便观察了,且点击地图任一处可以显示其经纬度信息。
【分析】
通过全球火山地图标记可以看到,火山分布最多的地区是在环太平洋火山带上。这块呈马蹄状的地区包含了地球上约 80% 的火山,以印尼、日本、俄罗斯、菲律宾以及中南美洲等地区最为密集。还有一些散布在夏威夷、冰岛、刚果、意大利等地。
2.2
柱状图可视化分析
我们再从另一个可视化角度,分析全球火山分布情况:统计火山分布在全球各个国家、地区的数量,并统计不同火山类型的数量。
2.2.1. 全球火山分布数量前 20 的国家
按国家汇总火山的数量,通过柱状图的形式,可视化输出前 20 名的国家。
【代码】
代码语言:javascript复制# 按国家统计火山分布数量前30名
volcano_country = tb_volcano["country"].value_counts().to_frame()
volcano_country.columns = ["count_num"]
name_country = volcano_country.head(20).index.to_list()
value_country = volcano_country["count_num"].head(20).to_list()
# 数据可视化输出
bars_non_slider(name_country, value_country, "全球火山分布数量(国家)前20", "全球火山分布数量(国家)前20")
【结果】
图2-2-1:全球火山分布数量前 20 个国家
【分析】
全球火山分布数量最多的国家基本都是在太平洋上的,这与我们在地图上看到的环太平洋火山带占据大部分火山的信息吻合。
全球火山分布数目前五位国家分别是美国、印度尼西亚、日本、俄罗斯、智利。而前十名中可以看到一个非太平洋上的国家:冰岛(位于大西洋与北冰洋交汇处),且有 28 个火山之多。
2.2.2. 全球火山在各地区的分布数量
按地区汇总火山的数量,通过柱状图的形式,可视化输出各地区的分布情况。
【代码】
代码语言:javascript复制# 按地区统计火山分布数量前30名
volcano_region = tb_volcano["region"].value_counts().to_frame()
volcano_region.columns = ["count_num"]
name_region = volcano_region.index.to_list()
value_region = volcano_region["count_num"].to_list()
# 数据可视化输出
bars_non_slider(name_region, value_region, "全球火山分布数量(地区)", "全球火山分布数量(地区)")
【结果】
图2-2-2:全球火山地区分布数量
【分析】
全球火山分布数量排在前列的地区基本都集中在环太平洋上,这也与我们在地图上看到的环太平洋火山带占据大部分火山的信息吻合。
全球火山分布数目前五位地区中只有第五位不是在太平洋板块上的,分别是南美洲,日本、中国台湾及马里亚纳群岛地区,印度尼西亚群岛、墨西哥及中美洲大陆、非洲大陆及红海(印度洋板块)。
2.2.3. 全球各类型火山的分布数量
按地区汇总火山的数量,通过柱状图的形式,可视化输出全球前 20 种火山类型。
【代码】
代码语言:javascript复制# 按火山类型统计火山数量
volcano_type = tb_volcano["primary_volcano_type"].value_counts().to_frame()
volcano_type.columns = ["count_num"]
name_type = volcano_type.head(20).index.to_list()
value_type = volcano_type["count_num"].head(20).to_list()
# 数据可视化输出
bars_non_slider2(name_type, value_type, "全球火山种类前20", "全球火山种类前20")
【结果】
图2-2-3:全球火山数量前 20 种类型
【分析】
全球分布最多的火山种类是Stratovolcanoes(层状火山),又名 Composite(复合型火山),为多次喷发所造成,其复发周期可以是几十万年,也可以是几百年;其次是Shield(盾状火山),是具有宽阔顶面和缓坡度侧翼(盾状)的大型火山,夏威夷岛(大岛)就是典型的盾状火山。
3
汤加喷发火山位置
使用 folium 模块,展示地图上的汤加,并查看这次喷发的火山位置及其与汤加首都的距离。
3.1
地图上的汤加
通过查询,获得汤加首都努库阿洛法的经纬度位置信息:21°10'41.6" S, 175°11'55.2" W,转换为度分秒格式:-21.178235, -175.198673.
将转换格式后的经纬度传入 folium 的 Map() 方法中,并放大地图尺寸,查看地图上的汤加首都。
【参数介绍】
folium.Map() 的常用参数:
- location:tuple 或 list 类型输入,用于控制初始地图中心点的坐标,格式为(纬度,经度)或[纬度,经度],默认为 None
- width:int 型或 str 型,int 型时,传入的是地图宽度的像素值;str 型时,传入的是地图宽度的百分比,形式为"xx%";默认为"100%"
- height:控制地图的高度,格式同 width
- tiles:str 型,用于控制绘图调用的地图样式,默认为"OpenStreetMap",也有一些其他的内建地图样式,如"Stamen Terrain"、"Stamen Toner"、"Mapbox Bright"、"Mapbox Control Room"等;也可以传入"None"来绘制一个没有风格的朴素地图,或传入一个 URL 来使用其它的自选 osm
- zoom_start:int 型,设定地图初始展示时的缩放大小尺寸
- max_zoom:int 型,控制地图可以放大程度的上限,默认为 18
- attr:str 型,当在 tiles 中使用自选 URL 内的 osm 时使用,用于给自选 osm 命名
- control_scale:bool 型,控制是否在地图上添加比例尺,默认为 False,即不添加
- no_touch:bool 型,控制地图是否禁止接受来自设备的触控事件譬如拖拽等,默认为 False,即不禁止
【代码】
代码语言:javascript复制# 汤加首都位置
volcano_tj_map = folium.Map([-21.178235, -175.198673], width="90%", zoom_start=11, control_scale=True)
volcano_tj_map
【结果】
图3-1:在地图上显示汤加首都
汤加首都在地图上看,就是太平洋上一块小小的岛屿。
3.2
本次喷发火山的位置
通过查询,获得本次喷发的火山所在的洪阿哈阿帕伊岛(Hunga Haapai)的经纬度位置信息:20° 32′ 34.8″ S, 174° 24′ 21.6″ W,转换为度分秒格式:-20.543792, -174.406127.
将转换格式后的经纬度传入 folium 的 Circle() 方法(跟前面用到的 CircleMarker() 方法类似)中,用圆圈在地图上标记此位置,并加入展示汤加首都的地图中,以查看喷发的火山与汤加首都的距离。
【代码】
代码语言:javascript复制# 汤加火山喷发位置及其与汤加首都的距离展示
volcano_tj_eruption_map = folium.Map([-21.178235, -175.198673], width="90%", zoom_start=9, control_scale=True)
folium.Circle(location=(-20.543792, -174.406127), radius=2000, color="blue", fill=True, fill_color="blue").add_to(volcano_tj_eruption_map)
volcano_tj_eruption_map
【结果】
图3-2:火山喷发位置与汤加首都的距离
【分析】
在地图上可以看到,这次喷发的火山所在的洪阿哈阿帕伊岛,位于汤加首都努库阿洛法以北约 70 公里,汤加哈派群岛以南约 30 公里。这座岛屿本身也是一个海底火山,该火山非常活跃,最高海拔 149 米(489 英尺),火山口曾在 2009 年爆发过,且在去年的 12 月也有小规模爆发。
4
汤加火山喷发前后对比
通过新西兰的飞机航拍及联合国的卫星照,对比火山喷发前后的汤加,看看这次火山喷发对汤加造成的触目惊心的影响。
图4-1:火山喷发前(BEFORE)
图4-2:火山喷发后(AFTER)
图4-3:火山喷发前后对比
图4-4:火山喷发前后对比
图4-5:火山喷发前(BEFORE)
图4-6:火山喷发后(AFTER)
图4-7:火山喷发前(BEFORE)
图4-8:火山喷发后(AFTER)
图4-9:火山喷发前(BEFORE)
图4-10:火山喷发后(AFTER)
图4-11:火山喷发前(BEFORE)
图4-12:火山喷发后(AFTER)
火山喷发所在的洪阿哈阿帕伊岛已经整个沉入海面以下;汤加大部分岛屿海岸边缘的房屋及建筑物、植被等都覆盖上了厚厚的火山灰,部分建筑物垮塌甚至直接消失不见;塔布岛的机场跑道也被火山灰侵袭,导致所有飞机航班无法降落。
5
结语
截至目前为止,汤加火山喷发产生的火山灰和气体已进入 20 公里以上的平流层,可能形成阳伞效应,但较之 1991 年菲律宾皮纳图博火山大爆发,这次二氧化硫释放的量小了很多,暂时还不足以对气候产生巨大的影响。
与此同时,沉睡了 300 年的日本富士山,其岩浆正在积蓄力量,一旦喷发,只需要两个小时,火山灰就可以抵达东京上空。
无论万里之遥的汤加火山灰是否会飘落到你我身边,不再沉默的火山,似乎正在提醒我们:
地球,是人类唯一的家园,面对火山这样强大的自然力量,没有人可以真的独善其身!
封面图片来源:unsplash
封面图片作者:Alain Bonnardeaux