接下来我将为您讲解“python根据json数据画疫情分布地图的详细代码”的完整攻略。
- 准备工作
首先,需要确保你安装了以下三个库:
- folium: 用于生成地图
- pandas: 用于数据处理
- requests: 用于获取网络数据
代码如下:
!pip install folium pandas requests
- 获取数据
获取数据是画疫情分布地图的第一步。可以从以下两个渠道获取数据:
- 直接从GitHub下载最新的疫情数据 JSON 文件,比如 disease-sh/covid19。
- 使用 新型冠状病毒疫情相关数据接口 从 API 获取数据。
下面是从API获取数据的示例代码:
import requests
import pandas as pd
url = 'https://route.showapi.com/213-1'
app_id = '你的app_id'
app_secret = '你的app_secret'
params = {'showapi_appid': app_id,
'showapi_sign': app_secret,
'province': '', # 省份
'city': '', # 城市
'area': '', # 区域
}
response = requests.get(url, params=params)
json_data = response.json()['showapi_res_body']['list']
df = pd.DataFrame(json_data)
- 数据预处理
获取到数据后,需要对数据进行处理,以便在地图上进行展示。下面是对数据的预处理代码示例:
# 1. 将数据类型转换为整型
df[['confirm', 'nowConfirm', 'heal', 'dead']] = df[['confirm', 'nowConfirm', 'heal', 'dead']].astype(int)
# 2. 取出城市名和经纬度
df = df[['city', 'confirm', 'nowConfirm', 'heal', 'dead', 'lat', 'lng']]
# 3. 筛选出有确诊病例的城市
df = df[df['confirm'] > 0]
# 4. 重命名列名
df = df.rename(columns={'confirm': 'Confirmed', 'nowConfirm': 'Active', 'heal': 'Recovered', 'dead': 'Deaths'})
- 画地图
在数据处理完成后,就可以开始画地图了。下面是一些示例代码:
# 1. 创建地图
import folium
map = folium.Map(location=[35, 100],
zoom_start=4,
control_scale=True,
tiles='OpenStreetMap')
# 2. 设置颜色和数据
import branca.colormap as cm
color_scale = cm.LinearColormap(colors=['green', 'yellow', 'red'], vmin=0, vmax=df['Confirmed'].max())
color_scale.caption = 'COVID-19 Confirmed Cases'
tooltip_confirmed = folium.features.GeoJsonTooltip(fields=['Confirmed'],
aliases=['Confirmed cases'],
labels=True,
sticky=False)
tooltip_deaths = folium.features.GeoJsonTooltip(fields=['Deaths'],
aliases=['Deaths'],
labels=True,
sticky=False)
# 3. 添加地理数据
def style_function(feature):
city_name = feature['properties']['name']
try:
df_city = df[df['city'] == city_name]
return {'fillColor': color_scale(df_city['Confirmed'].values[0]),
'fillOpacity': 0.7,
'color': 'black',
'weight': 1}
except IndexError:
return {'fillColor': 'lightgrey',
'fillOpacity': 0.7,
'color': 'black',
'weight': 1}
geojson_data = 'https://raw.githubusercontent.com/python-visualization/folium/master/examples/data'
country_data = f'{geojson_data}/world-countries.json'
states_data = f'{geojson_data}/us-states.json'
cities_data = f'{geojson_data}/US_Unemployment_Oct2012.csv'
# 根据经纬度和人口添加圆
for city in df.index:
folium.CircleMarker(location=[df.loc[city, 'lat'], df.loc[city, 'lng']],
radius=df.loc[city, 'Confirmed'] / 1000,
popup=f"{df.loc[city, 'city']}: {df.loc[city, 'Confirmed']} cases",
tooltip=f"{df.loc[city, 'city']}: {df.loc[city, 'Confirmed']} cases",
color=color_scale(df.loc[city, 'Confirmed']),
fill=True,
fill_color=color_scale(df.loc[city, 'Confirmed']),
fill_opacity=0.5
).add_to(map)
# 4. 显示地图
color_scale.add_to(map)
map.save(outfile='covid19_map.html')
这些代码创建了全世界的地图,并在其中添加了圆点表示城市的状况。当你将地图另存为HTML文件时,就可以在网页上浏览地图了。注意,为了使数据尽可能准确,请选择采用可靠的数据源和合理的数据处理方式。
另一种画地图的方式是使用 Folium 库中的 GeoJSON 方法,并使用 folium.Choropleth方法。可以参考下面这个示范代码:
import json
from urllib import request
import pandas as pd
import folium
url = 'https://www.echarts-js.com/examples/data/asset/data/geometryCouties.geojson'
response = request.urlopen(url)
counties = json.loads(response.read())
county_geo = f"{url}/geometryCouties.geojson"
covid19_data_url = 'https://raw.githubusercontent.com/BlankerL/DXY-COVID-19-Data/master/json/DXYArea.json'
covid19_data = pd.read_json(covid19_data_url)
df = covid19_data.groupby(['provinceEnglishName', 'cityEnglishName'], as_index=False)[['confirmedCount', 'deadCount', 'curedCount', 'suspectedCount']].max()
# convert df to dictionary for using in folium.Choropleth
county_dict = df.set_index('cityEnglishName')['confirmedCount'].to_dict()
m = folium.Map(location=[31.22, 121.41], zoom_start=5)
folium.Choropleth(
geo_data=county_geo,
name='choropleth',
data=df,
columns=['cityEnglishName', 'confirmedCount'],
key_on='feature.properties.name',
fill_color='YlGn',
fill_opacity=0.7,
line_opacity=0.2,
legend_name='Confirmed Cases'
).add_to(m)
folium.LayerControl().add_to(m)
m.save('covid19_county.html')
这个例子展示了使用 Folium 生成地理图形,需要包含以下三个步骤:
- 从 json 下载地图的几何图形文件。使用 urlopen 和 json.loads 函数
url = 'https://www.echarts-js.com/examples/data/asset/data/geometryCouties.geojson'
response = request.urlopen(url)
counties = json.loads(response.read())
- 数据体数组织,通常最好使用 Pandas 。
covid19_data_url = 'https://raw.githubusercontent.com/BlankerL/DXY-COVID-19-Data/master/json/DXYArea.json'
covid19_data = pd.read_json(covid19_data_url)
df = covid19_data.groupby(['provinceEnglishName', 'cityEnglishName'], as_index=False)[['confirmedCount', 'deadCount', 'curedCount', 'suspectedCount']].max()
- 生成 geojson 类型和数据以画图。
folium.Choropleth(
geo_data=county_geo,
name='choropleth',
data=df,
columns=['cityEnglishName', 'confirmedCount'],
key_on='feature.properties.name',
fill_color='YlGn',
fill_opacity=0.7,
line_opacity=0.2,
legend_name='Confirmed Cases'
).add_to(m)
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python根据json数据画疫情分布地图的详细代码 - Python技术站