数据可视化_处理JSON文件格式
日期: 2020-11-30 分类: 个人收藏 499次阅读
作者:雷蕾
Python的模块json提供了各种探索和处理JSON数据的工具,此次学习使用模块json访问JSON格式存储的地震数据,并使用Plotly绘制一幅散点图,展示这些地震的位置和震级。
1.查看JSON数据
import json
#探索数据的结构
filename="eq_data_1_day_ml.json"
with open(filename) as f:
all_eq_data=json.load(f)
readable_file="readable_eq_data.json"
with open(readable_file,'w') as f:
json.dump(all_eq_data,f,indent=4)
示例中,首先导入了json模块,以便恰当地加载文件中地数据,并将其存储到 all_eq_data中,函数json.load()将数据转换为Python能够处理地格式。
readable_file="readable_eq_data.json"
这是创建了一个文件,以便将这些数据以易于阅读地方式写入其中
json.dump(all_eq_data,f,indent=4)
函数json.dump()接受一个JSON数据对象和一个文件对象,并将数据写入这个文件中,参数indent=4让dump()使用与数据结构匹配地缩进量来设置数据地格式。
我们可查看文件readable_eq_data.json,它的一部分内容如下:
{
“type”: “FeatureCollection”,
“metadata”: {
“generated”: 1550361461000,
“url”: “https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/1.0_day.geojson”,
“title”: “USGS Magnitude 1.0+ Earthquakes, Past Day”,
“status”: 200,
“api”: “1.7.0”,
“count”: 158
},
“features”: [
–snip–
这个文件的开头是一个键为"metadata"的片段,指出了这个数据文件是什么时候生成以及能够在网上地什么地方获取,以及人类阅读的标题和文件中记录的地震发生次数。
数据存储是在一个与键 "features"相关联的列表中,这个文件包含的是地震数据,因此列表的每个元素对于一次地震:
“features”: [
{
“type”: “Feature”,
“properties”: {
“mag”: 0.96,
–snip–
“title”: “M 1.0 - 8km NE of Aguanga, CA”
},
“geometry”: {
“type”: “Point”,
“coordinates”: [
-116.7941667,
33.4863333,
3.22
]
},
“id”: “ci37532978”
},
键 "properties"关联到了与特定地震相关的大量信息,键 "mag"相关联的是地震的震级;
键 "geometry"指出了地震发生在什么地方,我们的散点图就是要根据这项信息将地震的信息展示出来。
1.2 创建地震列表
#创建地震列表
import json
filename="all_eq_data.json"
with open(filename) as f:
all_eq_data=json.load(f)
all_eq_dicts=all_eq_data['features']
print(len(all_eq_dicts))
此示例中,主要提取与键 "features"相关联的数据,并将其存储到all_eq_dicts中。
运行代码结果展示:
158
在键"metadata"中记录了地震发生的次数为158次,运行结果也正好表面了我们提取了这个文件记录的所有文件。
1.3 提取震级
提取了包含所有地震数据的列表后,可对该列表进行遍历(循环),提取所需的数据,此次示例中单独提取出地震的震级:
#创建地震列表
#提取震级
import json
filename="all_eq_data.json"
with open(filename) as f:
all_eq_data=json.load(f)
all_eq_dicts=all_eq_data['features']
mags=[]
for eq_dicts in all_eq_dicts:
mag=eq_dicts['properties']['mag']
mags.append(mag)
print(mags[:10])
示例中,创建了空列表mags,用于存储地震震级,再遍历列表all_eq_dicts
mag=eq_dicts['properties']['mag']
前面讲到每次地震的震级都存储在相应字典的’properties’部分的’mag’键下,因此依次将地震的震级赋给变量mag。
1.4 提取位置数据
在前面展示的JSON文件中,可以看到位置数据存储在"geometry"键下,在"geometry"键关联的字典中,有一个 "coordinates"键,它关联到一个列表,列表所存储的前两个值为地震位置的经度和纬度:
#创建地震列表
#提取震级
#提取位置数据
import json
filename="all_eq_data.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_dicts in all_eq_dicts:
mag=eq_dicts['properties']['mag'] #震级
title=eq_dicts['properties']['title'] #标题
lon=eq_dicts['geometry']['coordinates'][0] #经度
lat=eq_dicts['geometry']['coordinates'][1] #纬度
mags.append(mag)
titles.append(title)
lons.append(lon)
lats.append(lat)
print(mags[:10])
print(titles[:2])
print(lons[:5])
print(lats[:5])
在该示例中:
mags,titles,lons,lats=[],[],[],[]
创建了用于存储震级的列表mags,存储位置标题的列表titles来提取字典’properties’里“title”键对应的值,以及用于存储经度和纬度的列表lons和列表lats
mag=eq_dicts['properties']['mag'] #震级
title=eq_dicts['properties']['title'] #标题
lon=eq_dicts['geometry']['coordinates'][0] #经度
lat=eq_dicts['geometry']['coordinates'][1] #纬度
代码eq_dicts[‘geometry’]访问与键’geometry’相关联的字典,第二个键’coordinates’提取与’coordinates’相关联的列表,而索引0提取该列表中的第一个值,即地震位置的经度,索引0提取该列表中的第二个值,即地震发生位置的纬度。
1.5 绘制震级散点图
提取了震级、地震发生位置的经度和纬度后,就可以进行数据的可视化绘制:
#创建地震列表
#提取震级
#提取位置数据
import json
filename="all_eq_data.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_dicts in all_eq_dicts:
mag=eq_dicts['properties']['mag'] #震级
title=eq_dicts['properties']['title'] #标题
lon=eq_dicts['geometry']['coordinates'][0] #经度
lat=eq_dicts['geometry']['coordinates'][1] #纬度
mags.append(mag)
titles.append(title)
lons.append(lon)
lats.append(lat)
print(mags[:10])
print(titles[:2])
print(lons[:5])
print(lats[:5])
#绘制震级散点图
import plotly.express as px
fig=px.scatter(
x=lons,
y=lats,
labels={"x":"经度","y":"纬度"},
range_x=[-200,200],
range_y=[-90,90],
width=800,
height=800,
title="全球地震散点图",
)
fig.write_html("global_earthquakes.html")
fig.show
示例中:
import plotly.express as px
导入了plotly,express,并用px表示,Plotly Express 是Plotly的高级接口;
之后调用px.scatter函数配置参数创建了一个fig实例,分别设置了x轴为经度、y轴为纬度,并设置了散点图显示的宽度和高度的像素以及标题,这和前面所讲到的使用Matploltib类似,这里不再重复讲解
fig.write_html("global_earthquakes.html")
在这里,方法fig.write_html可以将可视化图保存为html文件,方便用浏览器打开。
运行代码结果展示:
1.6 定制标记的尺寸
#创建地震列表
#提取震级
#提取位置数据
import json
filename="all_eq_data.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_dicts in all_eq_dicts:
mag=eq_dicts['properties']['mag'] #震级
title=eq_dicts['properties']['title'] #标题
lon=eq_dicts['geometry']['coordinates'][0] #经度
lat=eq_dicts['geometry']['coordinates'][1] #纬度
mags.append(mag)
titles.append(title)
lons.append(lon)
lats.append(lat)
print(mags[:10])
print(titles[:2])
print(lons[:5])
print(lats[:5])
#绘制震级散点图
#定制标记的尺寸
import plotly.express as px
import pandas as pd
data=pd.DataFrame(
data=zip(lons,lats,titles,mags),columns=["经度","纬度","位置","震级"]
)
data.head()
fig=px.scatter(
data,
x="经度",
y="纬度",
range_x=[-200,200],
range_y=[-90,90],
width=800,
height=800,
title="全球地震散点图",
size="震级",
size_max=10,
)
fig.write_html("global_earthquakes_1.html")
fig.show
在示例中,引用了pandas,使用另一种指定图表数据的方式:
import pandas as pd
下面就是使用pandas数据分析工具给图表定义数据的等效方式,使用pandas数据分析工具,首先要创建一个DataFrame,将需要的数据封装起来:
data=pd.DataFrame(
data=zip(lons,lats,titles,mags),columns=["经度","纬度","位置","震级"]
)
data.head()
Plotly express 支持对数据系列进行定制,这些定制都以参数表示,示例中使用了size参数来指定散点图每个标记的尺寸,只需要将前面data中的”震级“字段提供给size参数即可:
size="震级"
示例中,标记尺寸默认为20像素,可以通过size_max=10将最大显示尺寸缩放到10:
size_max=10
运行代码结果展示:
1.7 定制标记的颜色
为了呈现地震的严重程度以及增加图表的可读性,可以对震级的不同标记不同的颜色:
#创建地震列表
#提取震级
#提取位置数据
import json
filename="all_eq_data.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_dicts in all_eq_dicts:
mag=eq_dicts['properties']['mag'] #震级
title=eq_dicts['properties']['title'] #标题
lon=eq_dicts['geometry']['coordinates'][0] #经度
lat=eq_dicts['geometry']['coordinates'][1] #纬度
mags.append(mag)
titles.append(title)
lons.append(lon)
lats.append(lat)
print(mags[:10])
print(titles[:2])
print(lons[:5])
print(lats[:5])
#绘制震级散点图
#定制标记的尺寸
#定制标记的颜色
#添加鼠标指向显示的文本
import plotly.express as px
import pandas as pd
data=pd.DataFrame(
data=zip(lons,lats,titles,mags),columns=["经度","纬度","位置","震级"]
)
data.head
fig=px.scatter(
data,
x="经度",
y="纬度",
range_x=[-200,200],
range_y=[-90,90],
width=800,
height=800,
title="全球地震散点图",
size="震级",
size_max=10,
color="震级",
hover_name="位置",
)
fig.write_html("global_earthquakes_2.html")
fig.show
示例中:
color="震级"
只需要配置color='震级’就可让标记的震级按照不同的颜色显示,数值越小则标记越蓝,数值越大则标记越黄(渐变色范围是从蓝到红再到黄)。
除此之外,还可以添加一些说明性文本,将鼠标指向表示地震的标记时文本会显示出来:
hover_name="位置"
运行代码结果展示:
除特别声明,本站所有文章均为原创,如需转载请以超级链接形式注明出处:SmartCat's Blog
上一篇: Nginx GUI 工具
下一篇: 矩阵相似与矩阵等价的关系
精华推荐