【自学】python初学 LESSON 9<数据可视化——下载数据2>


前言

今天学习制作全球地震散点图:JSON格式

往期绘图文章:

https://blog.csdn.net/mzy20010420/article/details/12​​​​​​6193137?spm=1001.2014.3001.5501icon-default.png?t=M666https://blog.csdn.net/mzy20010420/article/details/126193137?spm=1001.2014.3001.5501


一、查看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的操作非常简单,太好用了。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Rachel MuZy

你的鼓励是我的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值