第十六章 下载数据

本文详细介绍了如何使用Python处理CSV文件,包括读取文件头、提取数据、绘制温度图表,以及利用datetime模块设置日期格式。同时,文章还展示了处理JSON格式的地震数据,创建全球地震散点图,并通过PlotlyExpress定制标记颜色和大小,以及添加鼠标悬停文本。此外,文中还涵盖了错误检查和异常处理,确保数据处理的稳健性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

16.1 CSV文件格式

csv文件:将数据以列逗号分隔存储

准备工作:
从官方网站下载所需数据包,在“源代码文件\chapter_16\the_csv_file_format\data”中找到“death_valley_2018_simple.csv”,并将整个data文件夹放到代码文件目录内

csv文件windows默认打开方式为excel,我们分别用excel和文本方式打开看看里面的数据到底长什么样子:
excel方式打开:
Alt

文本方式打开:
Alt

16.1.1 分析CSV文件头

csv模块包含在python标准库中
新建skita.py文件,要求data文件夹和skita,py在同一目录下

# skita.py

import csv

filename = r"data/sitka_weather_07-2018_simple.csv"
with open(filename) as f:
    reader = csv.reader(f)  #生成一个阅读对象并赋值给reader
    header_row = next(reader) #next()是读取下一行,第一次读取第一行,读取的内容存在列表中
    print(header_row)

输出:
[‘STATION’, ‘NAME’, ‘DATE’, ‘PRCP’, ‘TAVG’, ‘TMAX’, ‘TMIN’]

16.1.2 打印文件头及其位置

为了让头文件更让人容易理解,打印头文件的索引和值
这样我们就知道哪一列代表什么数据了

# skita.py

import csv

filename = r"data/sitka_weather_07-2018_simple.csv"
with open(filename) as f:
    reader = csv.reader(f)
    header_row = next(reader)
    # header_row 存储的是第一行的数据的列表
    for index, column_header in enumerate(header_row):
        # enumerate()获取参数的索引即其值
        print(index, column_header)

16.1.3 提取并读取数据

本小节我们的任务是提取每天的最高温度

# skita.py

import csv

filename = r"data/sitka_weather_07-2018_simple.csv"
with open(filename) as f:
    reader = csv.reader(f)
    header_row = next(reader)

    # 从文件中读取最高温度
    highs = []
    # 由于已读取第一行,这里从第二行开始读取,每次读取该行的第6个元素
    for row in reader:
        high = int(row[5]) # 需要字符串转化为整数
        highs.append(high)
        
print(highs)

输出:
[62, 58, 70, 70, 67, 59, 58, 62, 66, 59, 56, 63, 65, 58, 56, 59, 64, 60, 60, 61, 65, 65, 63, 59, 64, 65, 68, 66, 64, 67, 65]

16.1.4 绘制温度图表

本小节的任务是创建一个显示每日最高温度的简单图形

# skita.py

import csv
import matplotlib.pyplot as plt

filename = r"data/sitka_weather_07-2018_simple.csv"
with open(filename) as f:
    reader = csv.reader(f)
    header_row = next(reader)

    # 从文件中读取最高温度
    highs = []
    # 由于已读取第一行,这里从第二行开始读取,每次读取该行的第6个元素
    for row in reader:
        high = int(row[5])
        highs.append(high)

# 根据最高温度绘制图形
plt.style.use("Solarize_Light2") #seaborn 样式无法正确显示中文
fig, ax = plt.subplots()
ax.plot(highs, c='red') # 红色显示高温

# 设置图形的格式
ax.set_title("2018年7月每日最高温度", fontsize=24)
ax.set_xlabel('', fontsize=14)
ax.set_ylabel('温度(F)', fontsize=16)
ax.tick_params(axis='both', which='major', labelsize=16)

plt.show()

执行程序,结果如下图:
Alt

16.1.5 模块datetime

本小节的任务是了解datetime模块中的datetime类中的方法strptime()

from datetime import datetime

#strptime()第一个参数是需要输出的实参,第二个参数是输出的格式
first_date = datetime.strptime('2018-07-01', '%Y-%m-%d')
print(first_date)

输出:
2018-07-01 00:00:00

datetime中设置日期和实践的格式

实参含义
%A星期几,如Monday
%B月份名,如January
%m用数表示的月份(01-12)
%d用数表示的月份中的一天(01-31)
%Y四位的年份,如2019
%y两位的年份,如19
%H24小时的小时数(11-23)
%I12小时的小时数(00-12)
%pam或pm
%M分钟数(00-59)
%S秒数(00-61)

16.1.6 在图表中添加日期

本小节的主要任务是将日期添加至横坐标轴
时间在csv数据的第三列

# skita.py

import csv
import matplotlib.pyplot as plt
from datetime import datetime

filename = r"data/sitka_weather_07-2018_simple.csv"
with open(filename) as f:
    reader = csv.reader(f)
    header_row = next(reader)

    # 从文件中读取日期和最高温度
    dates, highs = [], []
    # 由于已读取第一行,这里从第二行开始读取,每次读取该行的第3和第6个元素
    for row in reader:
        current_date = datetime.strptime(row[2], "%Y-%m-%d")
        high = int(row[5])
        dates.append(current_date)
        highs.append(high)

# 根据最高温度绘制图形
plt.style.use("Solarize_Light2") #seaborn 样式无法正确显示中文
fig, ax = plt.subplots()
ax.plot(dates, highs, c='red') # 红色显示高温

# 设置图形的格式
ax.set_title("2018年7月每日最高温度", fontsize=24)
ax.set_xlabel('', fontsize=14)
fig.autofmt_xdate() # fig.autofmt_xdate()用来绘制倾斜的日期,防止重叠
ax.set_ylabel('温度(F)', fontsize=16)
ax.tick_params(axis='both', which='major', labelsize=16)

plt.show()

执行程序,见下图:
Alt

16.1.7 涵盖更长的时间

本小节将生成一副更复杂的天气图,读取的是“sitka_weather_2018_simple.csv”数据
skita.py代码如下:

# skita.py

import csv
import matplotlib.pyplot as plt
from datetime import datetime

filename = r"data/sitka_weather_2018_simple.csv"
with open(filename) as f:
    reader = csv.reader(f)
    header_row = next(reader)

    # 从文件中读取日期和最高温度
    dates, highs = [], []
    # 由于已读取第一行,这里从第二行开始读取,每次读取该行的第3和第6个元素
    for row in reader:
        current_date = datetime.strptime(row[2], "%Y-%m-%d")
        high = int(row[5])
        dates.append(current_date)
        highs.append(high)

# 根据最高温度绘制图形
plt.style.use("Solarize_Light2") #seaborn 样式无法正确显示中文
fig, ax = plt.subplots()
ax.plot(dates, highs, c='red') # 红色显示高温

# 设置图形的格式
ax.set_title("2018年每日最高温度", fontsize=24)
ax.set_xlabel('', fontsize=14)
fig.autofmt_xdate() # fig.autofmt_xdate()用来绘制倾斜的日期,防止重叠
ax.set_ylabel('温度(F)', fontsize=16)
ax.tick_params(axis='both', which='major', labelsize=16)

plt.show()

执行程序,显示如下图:
Alt

16.1.8 再绘制一个数据系列

本小节的主要任务是添加最低气温数据,并显示到图表中

# skita.py

import csv
import matplotlib.pyplot as plt
from datetime import datetime

filename = r"data/sitka_weather_2018_simple.csv"
with open(filename) as f:
    reader = csv.reader(f)
    header_row = next(reader)

    # 从文件中读取日期、最高温度和最低气温
    dates, highs, lows = [], [], []
    # 由于已读取第一行,这里从第二行开始读取,每次读取该行的第3、6、7个元素
    for row in reader:
        current_date = datetime.strptime(row[2], "%Y-%m-%d")
        high = int(row[5])
        low =int(row[6])
        dates.append(current_date)
        highs.append(high)
        lows.append(low)

# 根据最高、最低温度绘制图形
plt.style.use("Solarize_Light2") #seaborn 样式无法正确显示中文
fig, ax = plt.subplots()
ax.plot(dates, highs, c='red') # 红色显示高温
ax.plot(dates, lows, c='blue') #蓝色显示低温

# 设置图形的格式
ax.set_title("2018年每日最高、最低温度", fontsize=24)
ax.set_xlabel('', fontsize=14)
fig.autofmt_xdate() # fig.autofmt_xdate()用来绘制倾斜的日期,防止重叠
ax.set_ylabel('温度(F)', fontsize=16)
ax.tick_params(axis='both', which='major', labelsize=16)

plt.show()

执行程序,见下图:
Alt

16.1.9 给图标区域着色

本小节的任务是对每天的温度范围进行着色,使用的方法是fill_between(),前三个参数是x轴坐标和两个y值坐标,表示填充y值之间的区域,facecolor是填充区域颜色,alpha是透明度,0-1,0表示完全透明,1(默认)表示完全不透明

# skita.py

import csv
import matplotlib.pyplot as plt
from datetime import datetime

filename = r"data/sitka_weather_2018_simple.csv"
with open(filename) as f:
    reader = csv.reader(f)
    header_row = next(reader)

    # 从文件中读取日期、最高温度和最低气温
    dates, highs, lows = [], [], []
    # 由于已读取第一行,这里从第二行开始读取,每次读取该行的第3、6、7个元素
    for row in reader:
        current_date = datetime.strptime(row[2], "%Y-%m-%d")
        high = int(row[5])
        low =int(row[6])
        dates.append(current_date)
        highs.append(high)
        lows.append(low)

# 根据最高、最低温度绘制图形
plt.style.use("Solarize_Light2") #seaborn 样式无法正确显示中文
fig, ax = plt.subplots()
ax.plot(dates, highs, c='red', alpha=0.5) # 红色显示高温
ax.plot(dates, lows, c='blue', alpha=0.5) #蓝色显示低温
ax.fill_between(dates, highs, lows, facecolor='blue', alpha=0.3)

# 设置图形的格式
ax.set_title("2018年每日最高、最低温度", fontsize=24)
ax.set_xlabel('', fontsize=14)
fig.autofmt_xdate() # fig.autofmt_xdate()用来绘制倾斜的日期,防止重叠
ax.set_ylabel('温度(F)', fontsize=16)
ax.tick_params(axis='both', which='major', labelsize=16)

plt.show()

执行程序,见下图:
Alt

16.1.10 错误检查

csv文件中的数据很多,有偶发的错误完全是有可能的,这时我们该怎么办?
death_valley_2018_simple.csv 文件中有一处错误,我们现在当成不知道,新建一个death_valley.py的文件,将skita.py中的代码复制过来进行修改

1 检查 death_valley_2018_simple.csv的文件头

#death_valley.py

import csv

filename = r"data/death_valley_2018_simple.csv"
with open(filename) as f:
    reader = csv.reader(f)
    header_row = next(reader)

    for index, column_header in enumerate(header_row):
        print(index, column_header)

输出:
0 STATION
1 NAME
2 DATE
3 PRCP
4 TMAX
5 TMIN
6 TOBS

发现日期为第2列,最高气温位第5列,最低气温为第6列

2 在death_valley.py中修改代码

主要修改索引下标,将最高温度和最低温度存入列表中

#death_valley.py

import csv
import matplotlib.pyplot as plt
from datetime import datetime

filename = r"data/death_valley_2018_simple.csv"
with open(filename) as f:
    reader = csv.reader(f)
    header_row = next(reader)

    # 从文件中读取日期、最高温度和最低气温
    dates, highs, lows = [], [], []
    # 由于已读取第一行,这里从第二行开始读取,每次读取该行的第3、5、6个元素
    for row in reader:
        current_date = datetime.strptime(row[2], "%Y-%m-%d")
        high = int(row[4])
        low =int(row[5])
        dates.append(current_date)
        highs.append(high)
        lows.append(low)

# 根据最高、最低温度绘制图形
plt.style.use("Solarize_Light2") #seaborn 样式无法正确显示中文
fig, ax = plt.subplots()
ax.plot(dates, highs, c='red', alpha=0.5) # 红色显示高温
ax.plot(dates, lows, c='blue', alpha=0.5) #蓝色显示低温
ax.fill_between(dates, highs, lows, facecolor='blue', alpha=0.3)

# 设置图形的格式
ax.set_title(""2018年每日最高、最低温度\n死亡谷", fontsize=20)
ax.set_xlabel('', fontsize=14)
fig.autofmt_xdate() # fig.autofmt_xdate()用来绘制倾斜的日期,防止重叠
ax.set_ylabel('温度(F)', fontsize=16)
ax.tick_params(axis='both', which='major', labelsize=16)

plt.show()

运行程序,发现报错了,究其原因,是因为文件 death_valley_2018_simple.csv 中的2018-02-18的数据有缺失,程序无法将空字符‘’转换为整数
此时,我们使用异常处理语句,对异常情况进行处理(只输出提示性语句,不做任何处理,直接执行后续程序)
下图代码错误提示信息:
Alt

下图是文件中缺失数据的地方:
Alt

3 修改death_valley.py,使用异常处理

#death_valley.py

import csv
import matplotlib.pyplot as plt
from datetime import datetime

filename = r"data/death_valley_2018_simple.csv"
with open(filename) as f:
    reader = csv.reader(f)
    header_row = next(reader)

    # 从文件中读取日期、最高温度和最低气温
    dates, highs, lows = [], [], []
    # 由于已读取第一行,这里从第二行开始读取,每次读取该行的第3、5、6个元素
    for row in reader:
        current_date = datetime.strptime(row[2], "%Y-%m-%d")

        # 异常处理:
        try:
            high = int(row[4])
            low = int(row[5])
        except ValueError:
            print(f"Missing date for {current_date}")
        else:
            dates.append(current_date)
            highs.append(high)
            lows.append(low)

# 根据最高、最低温度绘制图形
plt.style.use("Solarize_Light2") #seaborn 样式无法正确显示中文
fig, ax = plt.subplots()
ax.plot(dates, highs, c='red', alpha=0.5) # 红色显示高温
ax.plot(dates, lows, c='blue', alpha=0.5) #蓝色显示低温
ax.fill_between(dates, highs, lows, facecolor='blue', alpha=0.3)

# 设置图形的格式
ax.set_title("2018年每日最高、最低温度\n死亡谷", fontsize=20)
ax.set_xlabel('', fontsize=14)
fig.autofmt_xdate() # fig.autofmt_xdate()用来绘制倾斜的日期,防止重叠
ax.set_ylabel('温度(F)', fontsize=16)
ax.tick_params(axis='both', which='major', labelsize=16)

plt.show()

执行程序发现,程序对缺失数据知识输出了提示性信息,但继续执行了程序,生成的图片跳过了那一天,也没有产生过多问题,见下图:
Alt

16.1.11 自己动手下载数据

按教材程序应该可以实现,亲测网站有点慢,但是可以正常登录

16.2 制作全球地震散点图:JSON格式

读取以jison格式村粗的地震数据,使用模块json处理,并用Ploty模块绘制散点图

准备工作:
将从官方网站下载所需数据包,在“源代码文件源代码文件\chapter_16\mapping_global_data_sets\data”中的所有数据放放到代码文件目录内

16.2.1 地震数据

检查date文件夹内是否有 eq_data_1_day_m1.json 文件,该文件记录了24小时全球不低于1级地震的信息

16.2.2 查看JSON数据

1查看数据

使用文本方式打开 eq_data_1_day_m1.json 文件,发现有158行,最长的一列近800列,数据看着很凌乱,仔细观察发现,这是一个字典文件,一行是一个字典,每个字典元素又嵌套字典
如下图所示:
Alt

2将数据以易读方式显示

新建一个explore_data.py 文件:

  1. 将 eq_data_1_day_m1.json 读取进来
  2. 新建一个易读文件readable_data.json
  3. 将eq_data_1_day_m1.json 数据处理后放到readable_data.json文件中
# explore_data.py
import json

# 读取数据
filename = r'data/eq_data_1_day_m1.json '
with open(filename) as f:
    all_data = json.load(f)

# 新建一个易读文件readable_data.json
readable_file = 'data/readable_data.json'
with open(readable_file, 'w') as f:
    # 处理数据后移入易读文件中
    json.dump(all_data, f, indent=4) # 与结构匹配的缩进来设置数据格式

执行程序,在data目录下生成一个readable_data.json文件,打开后发现很有层次性
见下图:
Alt

关于文件的一些说明:

  1. 键 ‘metadata’ ,指出数据文件在什么时候生成,在哪个网站上可以找到,还有标题和地震次数
  2. 键 ‘features’中存储地震信息,列表中的每个元素对应一次地震
  3. 特定的某次地震中,键"properties"关联地震相关的大量信息,“mag”: 0.96表示震级;键"geometry"指出了地震发生的地点,"coordinates"表示地震发生的经度和纬度

16.2.3 创建地震列表

因为键 ‘features’中存储地震信息,它是一个列表,列表中的每个元素代表一次地震
完善 explore_data.py

# explore_data.py
import json

# 读取数据
filename = r'data/eq_data_1_day_m1.json '
with open(filename) as f:
    all_data = json.load(f)

# 将所有地震信息读取到一个列表中
all_dicts = all_data['features']
print(len(all_dicts))

输出:
158

表明我们提取了158次地震信息

16.2.4 提取震级

从地震数据中提取震级数据
如果我们向获取列表中第一个元素(即第一次地震)的震级,我们要这样读取:
all_dicts[0][“properties”][“mag”],这样就可以读取到震级为0.96

完善explore_data.py

# explore_data.py
import json

# 读取数据
filename = r'data/eq_data_1_day_m1.json '
with open(filename) as f:
    all_data = json.load(f)

# 将所有地震信息读取到一个列表中
all_dicts = all_data['features']

# 提取震级
mags =[]
for eq_dict in all_dicts:
    mag = eq_dict['properties']['mag']
    mags.append(mag)

print(mags[:10]) # 只打印前10次地震的震级

输出:
[0.96, 1.2, 4.3, 3.6, 2.1, 4, 1.06, 2.3, 4.9, 1.8]

16.2.5提取位置信息

标题存储在"properties"键下的"title"键中
位置信息存储在"geometry"键下的"coordinates"键下,前两个值为经度和纬度
完善explore_data.py

# 读取数据
filename = r'data/eq_data_1_day_m1.json '
with open(filename) as f:
    all_data = json.load(f)

# 将所有地震信息读取到一个列表中
all_dicts = all_data['features']

# 提取震级、标题和位置信息
mags, titles, lons, lats = [], [], [], []
for eq_dict in all_dicts:
    mag = eq_dict['properties']['mag']
    title = eq_dict['properties']['title']
    lon = eq_dict['geometry']['coordinates'][0]
    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])
print(lats[:5])

输出:
[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]

16.2.6 绘制震级散点图

新建一个world_map.py文件,用来绘制震级散点图

注意:完全按照书上会出错,要解决两个问题:

  1. 安装pandas模块,安装方法为: win + r 输入cmd 进入命令行界面,输入 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple --trusted-host pypi.tuna.tsinghua.edu.cn pandas 自动安装
  2. 由于lons,lats等数据在另一个py文件,可以用导入的方法,也可以用把代码挪过来的方法,我这里使用的是导入方法
  3. 导入后发现,代码输出了测试代码,所以要在explore_data.py中增加一行if代码
# world_map.py
import plotly.express as px
import explore_data as ep
import pandas

fig = px.scatter(
    x=ep.lons,
    y=ep.lats,
    labels={'x':'经度', 'y': '纬度'},
    range_x=[-200, 200],
    range_y=[-90, 90],
    width=800,
    height=800,
    title='全球地震散点图'
)
fig.write_html('globla_earthquakes.html')
fig.show()

修改后的# explore_data.py

# explore_data.py
import json

# 读取数据
filename = r'data/eq_data_1_day_m1.json '
with open(filename) as f:
    all_data = json.load(f)

# 将所有地震信息读取到一个列表中
all_dicts = all_data['features']

# 提取震级、标题和位置信息
mags, titles, lons, lats = [], [], [], []
for eq_dict in all_dicts:
    mag = eq_dict['properties']['mag']
    title = eq_dict['properties']['title']
    lon = eq_dict['geometry']['coordinates'][0]
    lat = eq_dict['geometry']['coordinates'][1]
    mags.append(mag)
    titles.append(title)
    lons.append(lon)
    lats.append(lat)

if __name__ == '__main__':
    print(mags[:10])
    print(titles[:2])
    print(lons[:5])
    print(lats[:5])

执行world_map.py,效果如下图:
Alt

16.2.7 另一种指定图表数据的方式

新建一个test.py,将 world_map.py 中代码复制过来,按照书中的配置方式进行修改
执行程序,发现与上一节的结果一摸一样
课本中说推荐这种方式

# test.py
import plotly.express as px
import explore_data as ep
import pandas as pd

data = pd.DataFrame(
    zip(ep.lons, ep.lats, ep.titles, ep.mags),columns=['经度', '纬度', '位置', '震级']
)
data.head()
fig = px.scatter(
    data,
    x='经度',
    y='纬度',
    range_x=[-200, 200],
    range_y=[-90, 90],
    width=800,
    height=800,
    title='全球地震散点图'
)
fig.write_html('globla_earthquakes.html')
fig.show()

执行程序效果图:
Alt

16.2.8 定制标记的尺寸

上节的散点图显示了每次地震的位置,但没有指出震级,我们添加此标记

从此处开始,我们使用16.2.7小节中的test.py的代码,并在该代码中进行修改

# test.py
import plotly.express as px
import explore_data as ep
import pandas as pd

data = pd.DataFrame(
    zip(ep.lons, ep.lats, ep.titles, ep.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, #标记尺寸默认20,此处设置为10
)
fig.write_html('globla_earthquakes.html')
fig.show()

执行程序,效果如图:
Alt

16.2.9 定制标记的颜色

本小节我们定制标记的颜色,以呈现地震的严重程度

首先我们将装在文件修改为: eq_data_30_day_m1.json ,该文件包含30天数据,呈现出来的散点更多,所以要先修改 explore_data.py 中的 filename 变量

# explore_data.py
import json

# 读取数据
filename = r'data/eq_data_30_day_m1.json '
with open(filename) as f:
    all_data = json.load(f)

# 将所有地震信息读取到一个列表中
all_dicts = all_data['features']

# 提取震级、标题和位置信息
mags, titles, lons, lats = [], [], [], []
for eq_dict in all_dicts:
    mag = eq_dict['properties']['mag']
    title = eq_dict['properties']['title']
    lon = eq_dict['geometry']['coordinates'][0]
    lat = eq_dict['geometry']['coordinates'][1]
    mags.append(mag)
    titles.append(title)
    lons.append(lon)
    lats.append(lat)

if __name__ == '__main__':
    print(mags[:10])
    print(titles[:2])
    print(lons[:5])
    print(lats[:5])

# test.py
import plotly.express as px
import explore_data as ep
import pandas as pd

data = pd.DataFrame(
    zip(ep.lons, ep.lats, ep.titles, ep.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,#标记尺寸默认20,此处设置为10
    color='震级',# 默认颜色是蓝->红->黄
)
fig.write_html('globla_earthquakes.html')
fig.show()

执行程序,效果如下图:
Alt

16.2.10 其它渐变

Plotly Express 有大量的渐变可供选择,程序color.py告诉你可使用哪些渐变

# color.py

import plotly.express as px

for key in px.colors.named_colorscales():
    print(key)
    
'''
输出:
···
blues
blugrn
bluyl
brwnyl
bugn
bupu
burg
burgyl
cividis
darkmint
electric
emrld
gnbu
greens
greys
hot
inferno
jet
···

'''

输出很多,这里只选了一部分

修改16.2.11小节的test.py代码,看看’jet’样式如何?

# test.py
import plotly.express as px
import explore_data as ep
import pandas as pd

data = pd.DataFrame(
    zip(ep.lons, ep.lats, ep.titles, ep.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,#标记尺寸默认20,此处设置为10
    color='震级', # 默认颜色是蓝->红->黄
    hover_name='位置',
    color_continuous_scale='jet', # 渐变色参数选择
)
fig.write_html('globla_earthquakes.html')
fig.show()

执行程序,效果如下:
Alt

16.2.11 添加鼠标指向时显示的文本

在16.2.9de test.py代码上修改,新增添加显示地震的大概位置

# test.py
import plotly.express as px
import explore_data as ep
import pandas as pd

data = pd.DataFrame(
    zip(ep.lons, ep.lats, ep.titles, ep.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,#标记尺寸默认20,此处设置为10
    color='震级', # 默认颜色是蓝->红->黄
    hover_name='位置',
)
fig.write_html('globla_earthquakes.html')
fig.show()

执行代码,显示如下图:
Alt

16.3 小结

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

张小勇zhangxy

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

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

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

打赏作者

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

抵扣说明:

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

余额充值