前言
今天学习制作全球地震散点图:JSON格式
往期绘图文章:
一、查看JSON数据
如果直接点开数据文件,则如下图所示
不便于读写,所有的信息都在一行,同时信息python无法处理。
现进行转化:
示例代码:
import json
filename = 'C:\\Users\\Administrator\\Desktop\\eq_data_1_day_m1.json'
with open(filename) as f:
all_eq_data = json.load(f)
readable_file = 'C:\\Users\\Administrator\\Desktop\\readable_eq_data.json'
with open(readable_file, 'w') as f:
json.dump(all_eq_data, f, indent = 4)
结果:
注意:
(1) 现导入数据,并将其存储在all_eq_data中,json.load()将数据转换成python能处理的格式。
(2)然后创建一个readable_file文件,将数据以易于读写的方式存入其中。
(3)json.dump()接受一个python数据对象和一个文件对象,并将数据写入文件中;参数indent=4让dump()使用与数据结构匹配的缩进量来设置数据格式。
现导入需要的地震级、经纬度、名称数据:
代码:
import json
filename = 'C:\\Users\\Administrator\\Desktop\\eq_data_1_day_m1.json'
with open(filename) as f:
all_eq_data = json.load(f)
all_eq_dicts = all_eq_data['features'] #创建all_eq_dicts列表,包含地震的各种信息
#提取地震级‘mag’
mags = []
for eq_dict in all_eq_dicts:
mag = eq_dict['properties']['mag'] #读取相应字典的‘prosperties’部分的‘mag’键
mags.append(mag)
print(mags[:5])
#提取经纬度
longitudes, latitudes = [], []
for all_eq_dict in all_eq_dicts:
longitude = all_eq_dict['geometry']['coordinates'][0]
latitude = all_eq_dict['geometry']['coordinates'][1]
longitudes.append(longitude)
latitudes.append(latitude)
print(longitudes[:5])
print(latitudes[:5])
#提取名称
names = []
for data in all_eq_dicts:
name = data['properties']['title']
names.append(name)
print(names[:5])
结果:
[0.96, 1.2, 4.3, 3.6, 2.1]
[-116.7941667, -148.9865, -74.2343, -161.6801, -118.5316667]
[33.4863333, 64.6673, -12.1025, 54.2232, 35.3098333]
['M 1.0 - 8km NE of Aguanga, CA', 'M 1.2 - 11km NNE of North Nenana, Alaska', 'M 4.3 - 69km NNW of Ayna, Peru', 'M 3.6 - 126km SSE of Cold Bay, Alaska', 'M 2.1 - 21km NNW of Tehachapi, CA']
二、绘制地震级散点图
1.初始图
代码:
import json
import plotly.express as px
filename = 'C:\\Users\\Administrator\\Desktop\\eq_data_1_day_m1.json'
with open(filename) as f:
all_eq_data = json.load(f)
all_eq_dicts = all_eq_data['features'] #创建all_eq_dicts列表,包含地震的各种信息
#提取地震级‘mag’
mags = []
for eq_dict in all_eq_dicts:
mag = eq_dict['properties']['mag'] #读取相应字典的‘prosperties’部分的‘mag’键
mags.append(mag)
print(mags[:5])
#提取经纬度
longitudes, latitudes = [], []
for all_eq_dict in all_eq_dicts:
longitude = all_eq_dict['geometry']['coordinates'][0]
latitude = all_eq_dict['geometry']['coordinates'][1]
longitudes.append(longitude)
latitudes.append(latitude)
print(longitudes[:5])
print(latitudes[:5])
#提取名称
names = []
for data in all_eq_dicts:
name = data['properties']['title']
names.append(name)
print(names[:5])
#绘图
fig = px.scatter(x = longitudes, y = latitudes, labels = {'x': '经度', 'y' : '维度'}, range_x = [-200, 200], range_y = [-90, 90], width = 800, height = 800, title = '全球地震散点图')
fig.write_html('global_earthquakes.html')
fig.show()
结果:
注意:
(1)width = 800, height = 800表示宽度和高度的像素。当换为1000时:
似乎没有发现什么太大的区别。
(2)局部效果图:
2.另一种指定图表数据的方式
#绘图
fig = px.scatter(x = longitudes, y = latitudes, labels = {'x': '经度', 'y' : '维度'}, range_x = [-200, 200], range_y = [-90, 90], width = 1000, height = 1000, title = '全球地震散点图')
fig.write_html('global_earthquakes.html')
fig.show()
原来的经纬度是手动设置的。x = longitudes, y = latitudes, labels = {'x': '经度', 'y' : '维度'}。
下面使用pandas数据分析工具:
import json
import pandas as pd
import plotly.express as px
filename = 'C:\\Users\\Administrator\\Desktop\\eq_data_1_day_m1.json'
with open(filename) as f:
all_eq_data = json.load(f)
all_eq_dicts = all_eq_data['features'] #创建all_eq_dicts列表,包含地震的各种信息
#提取地震级‘mag’
mags = []
for eq_dict in all_eq_dicts:
mag = eq_dict['properties']['mag'] #读取相应字典的‘prosperties’部分的‘mag’键
mags.append(mag)
#提取经纬度
longitudes, latitudes = [], []
for all_eq_dict in all_eq_dicts:
longitude = all_eq_dict['geometry']['coordinates'][0]
latitude = all_eq_dict['geometry']['coordinates'][1]
longitudes.append(longitude)
latitudes.append(latitude)
#提取名称
names = []
for data in all_eq_dicts:
name = data['properties']['title']
names.append(name)
#绘图
data = pd.DataFrame(data = zip(longitudes, latitudes, names, mags), columns = ['经度', '位置', '位置', '震级'])
data.head()
fig = px.scatter(data, x = '经度', y = '维度', range_x = [-200, 200], range_y = [-90, 90], width = 1000, height = 1000, title = '全球地震散点图')
fig.write_html('global_earthquakes.html')
fig.show()
3.定制标记的尺寸
代码:
import json
import plotly.express as px
import pandas as pd
filename = 'C:\\Users\\Administrator\\Desktop\\eq_data_1_day_m1.json'
with open(filename) as f:
all_eq_data = json.load(f)
all_eq_dicts = all_eq_data['features'] #创建all_eq_dicts列表,包含地震的各种信息
#提取地震级‘mag’
mags = []
for eq_dict in all_eq_dicts:
mag = eq_dict['properties']['mag'] #读取相应字典的‘prosperties’部分的‘mag’键
mags.append(mag)
print(mags[:5])
#提取经纬度
longitudes, latitudes = [], []
for all_eq_dict in all_eq_dicts:
longitude = all_eq_dict['geometry']['coordinates'][0]
latitude = all_eq_dict['geometry']['coordinates'][1]
longitudes.append(longitude)
latitudes.append(latitude)
print(longitudes[:5])
print(latitudes[:5])
#提取名称
names = []
for data in all_eq_dicts:
name = data['properties']['title']
names.append(name)
print(names[:5])
#绘图
data = pd.DataFrame(
data = zip(longitudes, latitudes, names, 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.html')
fig.show()
结果:
4.定制标记的颜色
代码:
import json
import plotly.express as px
import pandas as pd
filename = 'C:\\Users\\Administrator\\Desktop\\eq_data_30_day_m1.json'
with open(filename) as f:
all_eq_data = json.load(f)
all_eq_dicts = all_eq_data['features'] #创建all_eq_dicts列表,包含地震的各种信息
#提取地震级‘mag’
mags = []
for eq_dict in all_eq_dicts:
mag = eq_dict['properties']['mag'] #读取相应字典的‘prosperties’部分的‘mag’键
mags.append(mag)
print(mags[:5])
#提取经纬度
longitudes, latitudes = [], []
for all_eq_dict in all_eq_dicts:
longitude = all_eq_dict['geometry']['coordinates'][0]
latitude = all_eq_dict['geometry']['coordinates'][1]
longitudes.append(longitude)
latitudes.append(latitude)
print(longitudes[:5])
print(latitudes[:5])
#提取名称
names = []
for data in all_eq_dicts:
name = data['properties']['title']
names.append(name)
print(names[:5])
#绘图
data = pd.DataFrame(
data = zip(longitudes, latitudes, names, 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 = '震级',
)
fig.write_html('global_earthquakes.html')
fig.show()
结果:
5.其他渐变
没有成功!
6.添加鼠标指向时显示的文本
代码:
# -*- coding: utf-8 -*-
"""
Created on Wed Aug 17 11:36:15 2022
@author: Administrator
"""
import json
import plotly.express as px
import pandas as pd
filename = 'C:\\Users\\Administrator\\Desktop\\eq_data_30_day_m1.json'
with open(filename) as f:
all_eq_data = json.load(f)
all_eq_dicts = all_eq_data['features'] #创建all_eq_dicts列表,包含地震的各种信息
#提取地震级‘mag’
mags = []
for eq_dict in all_eq_dicts:
mag = eq_dict['properties']['mag'] #读取相应字典的‘prosperties’部分的‘mag’键
mags.append(mag)
print(mags[:5])
#提取经纬度
longitudes, latitudes = [], []
for all_eq_dict in all_eq_dicts:
longitude = all_eq_dict['geometry']['coordinates'][0]
latitude = all_eq_dict['geometry']['coordinates'][1]
longitudes.append(longitude)
latitudes.append(latitude)
print(longitudes[:5])
print(latitudes[:5])
#提取名称
names = []
for data in all_eq_dicts:
name = data['properties']['title']
names.append(name)
print(names[:5])
#绘图
data = pd.DataFrame(
data = zip(longitudes, latitudes, names, 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.html')
fig.show()
结果:
总结
plotly express的操作非常简单,太好用了。