《Python编程:从入门到实践》练习16-8

练习16-8:最近发生的地震 —— 请在本书配套资源中找到关于最近1小时、1天、7天和30天内地震信息的数据文件(截至本书出版时,参见文件夹chapter_16/Excercise16-8)。请使用其中一个数据集,绘制一幅散点图来展示最近发生的地震。

import plotly.express as px
import pandas as pd
import json

filename = 'data/all_month.geojson'
with open(filename, encoding='utf-8') as f:
    all_eq_data = json.load(f)  # 将数据转换为Python能够处理的格式

all_eq_dicts = all_eq_data['features']

auto_title = all_eq_data['metadata']['title']

mags, titles, lons, lats = [], [], [], []
for eq_dict in all_eq_dicts:
    try:
        if eq_dict['properties']['mag'] <= 0:
            eq_dict['properties']['mag'] = 0.1
        mags.append(eq_dict['properties']['mag'])
        titles.append(eq_dict['properties']['title'])
        lons.append(eq_dict['geometry']['coordinates'][0])
        lats.append(eq_dict['geometry']['coordinates'][1])
    except ValueError:
        print("读取数据出现错误")

data = pd.DataFrame(data=zip(lons, lats, titles, mags), columns=['经度', '纬度', '位置', '震级'])
data.head()
# 地图形象化散点图
# fig = px.density_mapbox(data, lat='纬度', lon='经度', z='震级', hover_name='位置', title='全球地震散点图', radius=5,
#                         center=dict(lat=0, lon=180), zoom=0,
#                         mapbox_style="stamen-terrain")

fig = px.scatter(
    data,
    x='经度',
    y='纬度',
    # x=lons,
    # y=lats,
    # labels={'x': '经度', 'y': '纬度'},
    range_x=[-200, 200],
    range_y=[-90, 90],
    width=1000,
    height=800,
    title=auto_title,
    # 定制标记的尺寸
    size='震级',
    size_max=10,
    color='震级',  # 默认的视觉映射图例渐变色范围是从蓝到红再到黄,数值越小则标记越蓝,而数值越大则标记越黄
    hover_name='位置',  # 添加鼠标指向时显示的文本
    )
fig.write_html('global_earthquakes_days30.html')
fig.show()

如果自己在写的过程中出现了如下问题:

则是由数据集中‘mag’(震级)为负数震级导致的,因为size = '震级',标记尺寸大小一定是非负数。由于零级震级地震并不是没有地震,而比零级地震震级更小的震级数据则为负数震级,所以我将地震震级为负的数据改为了0.1.

最终的可视化结果:

 

想要获取此书电子版的朋友可以关注一下下面的公众号,回复:0320

获取此书附带的源代码及练习题答案回复:0321

请关注公众号:“Learn from Zero”,一起学习吧!

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

笨小古

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值