Python數(shù)據(jù)可視化制作全球地震散點(diǎn)圖
前言:
為了制作全球地震散點(diǎn)圖,我在網(wǎng)上下載了一個(gè)數(shù)據(jù)集,其中記錄了一個(gè)月內(nèi)全球發(fā)生的所有地震,但這些數(shù)據(jù)是以JSON格式存儲(chǔ)的,因此需要用json模塊來(lái)進(jìn)行處理。
查看JSON數(shù)據(jù)
首先我們先打開下載好的數(shù)據(jù)集瀏覽一下:
你會(huì)發(fā)現(xiàn)其中的數(shù)據(jù)密密麻麻,根本不是人讀的,因此,接下來(lái)我們將對(duì)數(shù)據(jù)進(jìn)行處理,讓它變得簡(jiǎn)單易讀。
import json#導(dǎo)入json模塊,以便于加載文件中的數(shù)據(jù) filename='eq_data_1_day_m1.json' with open(filename) as f: all_eq_data=json.load(f)#json.load(),將數(shù)據(jù)轉(zhuǎn)化為Python能夠處理的格式 readable_file='eq_data_1_day_m1.json'#創(chuàng)建一個(gè)文件,以便將這些數(shù)據(jù)以易于閱讀的方式寫入其中 with open(readable_file,'w') as f: json.dump(all_eq_data,f,indent=4)#json.dump()將數(shù)據(jù)讀入其中 #參數(shù)indent讓dump()使用與數(shù)據(jù)結(jié)構(gòu)匹配的縮進(jìn)量來(lái)設(shè)置數(shù)據(jù)的格式
經(jīng)過(guò)處理之后,我們?cè)俅蜷_這個(gè)文件會(huì)發(fā)現(xiàn)里面的數(shù)據(jù)變得清晰了許多。
從中我們能夠快速獲取數(shù)據(jù)的很多信息,比如地震的次數(shù),類型等等,不僅如此,我們還能夠知道有關(guān)這些數(shù)據(jù)的一些信息,比如,它的生成時(shí)間,他在網(wǎng)頁(yè)上怎么獲取等等。
參數(shù)indent
如果indent是非負(fù)整數(shù)或字符串,則JSON數(shù)組元素和對(duì)象成員將使用該縮進(jìn)級(jí)別進(jìn)行打印。如果indent為0,負(fù)數(shù)或“”只會(huì)插入換行符。
None(默認(rèn))則選擇最緊湊的表示形式。,使用正整數(shù)縮進(jìn)會(huì)使每個(gè)級(jí)別縮進(jìn)多個(gè)空格。,如果縮進(jìn)是字符串(例如“
t”),則該字符串用于縮進(jìn)每個(gè)級(jí)別。
當(dāng)我們將縮進(jìn)量修改為0時(shí),文件的排版也會(huì)發(fā)生變化:
json.dump(all_eq_data,f,indent=0)
創(chuàng)建地震列表
import json filename='eq_data_1_day_m1.json' with open(filename) as f: all_eq_data=json.load(f)#對(duì)文件進(jìn)行處理 all_eq_dicts=all_eq_data['features'] print(len(all_eq_dicts))#提取出這個(gè)文件記錄的所有地震
輸出結(jié)果如下:
158
是的,從文件的開頭,我們就可以確定地震的次數(shù)為158次,因此輸出結(jié)果正確:
提取震級(jí)
方法即是新建立一個(gè)列表用來(lái)存放震源的有關(guān)數(shù)據(jù),再提取字典features的properties部分的mag.
代碼如下:
import json filename='eq_data_1_day_m1.json' with open(filename) as f: all_eq_data=json.load(f) all_eq_dicts=all_eq_data['features'] mags=[] for eq_dict in all_eq_dicts: mag=eq_dict['properties']['mag'] mags.append(mag) print(mags[:10])#打印前十次的震級(jí)數(shù)據(jù)
[0.96, 1.2, 4.3, 3.6, 2.1, 4, 1.06, 2.3, 4.9, 1.8]
提取位置數(shù)據(jù)
首先,我們需要在文件中找到關(guān)于經(jīng)度和維度的部分,如下所示,我們?cè)谖募胁檎业?,它是存在于geometry字典下,coordinates鍵中的。
---snip--- all_eq_dicts=all_eq_data['features'] mags,titles,lons,lats=[],[],[],[] for eq_dict in all_eq_dicts: mag=eq_dict['properties']['mag'] title=eq_dict['properties']['title'] lon=eq_dict['geometry']['coordinates'][0]#提取coordinates鍵中索引值為0的數(shù)據(jù) lat=eq_dict['geometry']['coordinates'][1] mags.append(mag) titles.append(title) lons.append(lon) lats.append(lat) print(mags[:10]) print(titles[:2]) print(lons[:5])#輸出前五個(gè)經(jīng)度 print(lats[:5])#輸出前五個(gè)維度
輸出結(jié)果如下:
[0.96, 1.2, 4.3, 3.6, 2.1, 4, 1.06, 2.3, 4.9, 1.8]
['M 1.0 - 8km NE of Aguanga, CA', 'M 1.2 - 11km NNE of North Nenana, Alaska']
[-116.7941667, -148.9865, -74.2343, -161.6801, -118.5316667]
[33.4863333, 64.6673, -12.1025, 54.2232, 35.3098333]
繪制震級(jí)散點(diǎn)圖
通過(guò)我們前面提取的有關(guān)震源的數(shù)據(jù),下面我們可對(duì)提取的數(shù)據(jù)進(jìn)行可視化作圖:
import plotly.express as px#Plotly Express是Plotly的高級(jí)接口,相當(dāng)于Matplotlib是一個(gè)工具 fig=px.scatter( x=lons, y=lats, labels={'x':'經(jīng)度','y':'維度'}, range_x=[-200,200], range_y=[-90,90], #width和height代表圖表的高度和寬度均為800像素 width=800, height=800, title="全球地震散點(diǎn)圖", ) fig.write_html('global_earthquakes.html')#將可視化圖保存為html文件 fig.show()
散點(diǎn)圖配置完成后,下面我們?cè)诔绦蚰夸浵聦ふ椅覀儽4娴目梢暬瘓D(global_earthquakes.html),再使用瀏覽器打開該html文件
如下所示,即為散點(diǎn)圖:
指定圖表數(shù)據(jù)的方式
上面我們繪制地震散點(diǎn)圖是通過(guò)手動(dòng)配置經(jīng)緯度,通過(guò)將x,y和經(jīng)度,緯度建立聯(lián)系:
x=lons, y=lats, labels={'x':'經(jīng)度','y':'維度'},
但這在數(shù)據(jù)處理過(guò)程中并不是最簡(jiǎn)單的方式,下面我們介紹另一種圖表指定數(shù)據(jù)的方式,需要結(jié)合我們上面所提到的pandas數(shù)據(jù)分析工具。
import pandas as pd#導(dǎo)入pandas模塊x data=pd.DataFrame(data=zip(lons,lats,titles,mags),colums=['經(jīng)度','緯度','位置','震級(jí)'])#使用DataFrame將需要處理的數(shù)據(jù)封裝,注意:DataFrame后面的兩個(gè)參數(shù)是可選的,如果這兩個(gè)參數(shù)存在的話,這兩個(gè)參數(shù)的長(zhǎng)度要和DataFrame的長(zhǎng)度匹配 #zip()函數(shù)的作用:將可迭代的對(duì)象中的對(duì)應(yīng)元素打包為多個(gè)元祖,再返回由這些元祖組成的列表 data.head()
DataFrame()函數(shù)
它是Python中pandas庫(kù)中的一種數(shù)據(jù)結(jié)構(gòu),和excel比較相似,它不僅可以設(shè)置列名columns和行名index,而且它的單元格可以存放數(shù)值,字符串等。
data.head():返回?cái)?shù)據(jù)的前幾行數(shù)據(jù),默認(rèn)是前五行,如果需要指定則寫data.head(‘指定的行數(shù)’)
data.tail():返回data的后幾行數(shù)據(jù),默認(rèn)為后五行,如果需要指定則寫data.tail(‘指定的行數(shù)’)
數(shù)據(jù)封裝好之后,參數(shù)的配置方式可修改為:
data, x='經(jīng)度', y='緯度',
現(xiàn)在我們通過(guò)這種參數(shù)配置方式進(jìn)行地震散點(diǎn)圖的繪制:
#創(chuàng)建地震列表,提取數(shù)據(jù) import json filename='eq_data_1_day_m1.json' with open(filename) as f: all_eq_data=json.load(f) all_eq_dicts=all_eq_data['features'] mags,titles,lons,lats=[],[],[],[] for eq_dict in all_eq_dicts: mag=eq_dict['properties']['mag'] title=eq_dict['properties']['title'] lon=eq_dict['geometry']['coordinates'][0]#提取coordinates鍵中索引值為0的數(shù)據(jù) lat=eq_dict['geometry']['coordinates'][1] mags.append(mag) titles.append(title) lons.append(lon) lats.append(lat) #參數(shù)配置設(shè)置 import pandas as pd data=pd.DataFrame( data=zip(lons,lats,titles,mags),columns=['經(jīng)度','緯度','位置','震級(jí)'] ) data.head() #繪制散點(diǎn)圖 import plotly.express as px fig = px.scatter( data, x='經(jīng)度', y='緯度', range_x=[-200, 200], range_y=[-90, 90], width=800, height=800, title="全球地震散點(diǎn)圖", ) fig.write_html('global_earthquake.html') fig.show()
配置完成后,下面我們?cè)诔绦蚰夸浵聦ふ椅覀儽4娴目梢暬瘓D(global_earthquakes.html),再使用瀏覽器打開該html文件如下圖所示:
通過(guò)輸出結(jié)果,我們可得出,無(wú)論使用那種參數(shù)配置方式,其輸出結(jié)果都是相同的,但第二種這種以鍵值對(duì)的方式,更加清晰。
設(shè)計(jì)標(biāo)記點(diǎn)的尺寸
和我們上篇文章提到的與溫度有關(guān)的散點(diǎn)圖相類似,我們希望知道最高溫度和最低溫度等這些特殊且重要的信息,那么震源散點(diǎn)圖也是如此,上圖我們所設(shè)計(jì)的震源散點(diǎn)圖只是將緯度和經(jīng)度在圖上呈現(xiàn)出來(lái)了,但震源并沒有體現(xiàn)。
下面,我們將震級(jí)也呈現(xiàn)在散點(diǎn)圖上:
方法:使用size參數(shù)設(shè)計(jì)散點(diǎn)圖中每個(gè)尺寸的大小:
size='震級(jí)', size_max=10,
對(duì)比上面的兩幅圖,我們會(huì)發(fā)現(xiàn)散點(diǎn)圖中關(guān)于地震的信息還增加了震級(jí),不僅如此,散點(diǎn)的尺寸大小也與震級(jí)的大小有關(guān),震級(jí)越大,散點(diǎn)的尺寸越大,這樣一來(lái),我們很容易觀察到不同地方的地震強(qiáng)度,但這還不夠直觀,為了能夠更加直白的呈現(xiàn)地震的情況,我們還設(shè)計(jì)散點(diǎn)的顏色以便更加清晰的顯示。
設(shè)計(jì)標(biāo)記的顏色
方法:
color='震級(jí)', #默認(rèn)漸變色的范圍是從藍(lán)到紅再到黃,數(shù)值越小標(biāo)記越藍(lán),而數(shù)值越大則標(biāo)記越黃。
把在網(wǎng)上下載好的近30天的數(shù)據(jù)文件復(fù)制到該程序目錄下,將參數(shù)color添加其中,再繪制散點(diǎn)圖。,注意修改文件名。
如下圖所示:
美化后的散點(diǎn)圖,不僅在顏色上漂亮了許多,漸變的顏色也更加清晰的反映了地震的嚴(yán)重程度。
獲取Plotly Express中所有的漸變色:
不僅如此,Plotly Express還為我們提供了許多的漸變色,而這些漸變色是在px.colors.named_colorscales()中定義的,下面來(lái)獲取這些漸變色:
import plotly.express as px for key in px.colors.named_colorscales(): print(key,end='/')
輸出結(jié)果如下:
aggrnyl/agsunset/blackbody/bluered/blues/blugrn/bluyl/brwnyl/bugn/bupu/burg/burgyl/cividis
/darkmint/electric/emrld/gnbu/greens/greys/hot/inferno/jet/magenta/magma/mint/orrd/oranges
/oryel/peach/pinkyl/plasma/plotly3/pubu/pubugn/purd/purp/purples/purpor/rainbow/rdbu/rdpu
/redor/reds/sunset/sunsetdark/teal/tealgrn/turbo/viridis/ylgn/ylgnbu/ylorbr/ylorrd/algae
/amp/deep/dense/gray/haline/ice/matter/solar/speed/tempo/thermal/turbid/armyrose/brbg/earth
/fall/geyser/prgn/piyg/picnic/portland/puor/rdgy/rdylbu/rdylgn/spectral/tealrose/temps/tropic
/balance/curl/delta/oxy/edge/hsv/icefire/phase/twilight/mrybm/mygbm/
此外,我們還可將對(duì)應(yīng)配色列表進(jìn)行反轉(zhuǎn):
方法:
px.colors.diverging.RdYlGn[::-1]
此外,Plotly除了有px.colors.diverging表示連續(xù)的配色方案,還有px.colors.sequential和px.colors.qualitative表示離散變量。每個(gè)漸變色都有起始色和終止色,有些漸變色還定義了一個(gè)或多個(gè)中間色。
添加鼠標(biāo)指向時(shí)顯示的文本:
方法,使用參數(shù)hover_name,參數(shù)配置為data的‘位置’
hover_name='位置',
修改后,散點(diǎn)圖的輸出如下所示:
我們發(fā)現(xiàn),對(duì)比于前面的圖表,此時(shí)又增加了位置信息,此時(shí),我們就完整的繪制了一副關(guān)于地震信息的散點(diǎn)圖。
到此這篇關(guān)于Python數(shù)據(jù)可視化制作全球地震散點(diǎn)圖的文章就介紹到這了,更多相關(guān)Python地震散點(diǎn)圖內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python連接MySQL并使用fetchall()方法過(guò)濾特殊字符
這篇文章主要介紹了Python連接MySQL的方法并講解了如何使用fetchall()方法過(guò)濾特殊字符,示例環(huán)境為Ubuntu操作系統(tǒng),需要的朋友可以參考下2016-03-03通過(guò)Python來(lái)使用七牛云存儲(chǔ)的方法詳解
這篇文章主要介紹了通過(guò)Python來(lái)使用七牛云存儲(chǔ)的方法詳解,七牛云存儲(chǔ)是國(guó)內(nèi)領(lǐng)先的服務(wù)器數(shù)據(jù)備份解決方案商,需要的朋友可以參考下2015-08-08在matlab中創(chuàng)建類似字典的數(shù)據(jù)結(jié)構(gòu)方式
這篇文章主要介紹了在matlab中創(chuàng)建類似字典的數(shù)據(jù)結(jié)構(gòu)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03Python pexpect模塊及shell腳本except原理解析
這篇文章主要介紹了Python pexpect模塊及shell腳本except原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08Pytorch 解決自定義子Module .cuda() tensor失敗的問(wèn)題
這篇文章主要介紹了Pytorch 解決自定義子Module .cuda() tensor失敗的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-06-06python回調(diào)函數(shù)中使用多線程的方法
這篇文章主要介紹了python回調(diào)函數(shù)中使用多線程的方法,需要的朋友可以參考下2017-12-12舉例詳解Python中循環(huán)語(yǔ)句的嵌套使用
這篇文章主要介紹了舉例詳解Python中循環(huán)語(yǔ)句的嵌套使用,是Python入門中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-05-05