環(huán)境
- Win10 64位
- pyecharts v1.7.1
- python 3.7.4
準(zhǔn)備工作
1 找到一個(gè)疫情數(shù)據(jù)源拣技,本文疫情數(shù)據(jù)來(lái)自騰訊疫情地圖剃氧。
2 找到請(qǐng)求源數(shù)據(jù)的地址(通過(guò)F12查找請(qǐng)求的數(shù)據(jù)地址):
F12里面找到的請(qǐng)求數(shù)據(jù)文件
獲得世界疫情數(shù)據(jù)地址:https://api.inews.qq.com/newsqa/v1/automation/foreign/country/ranklist
打開(kāi)后是JSON數(shù)據(jù)
世界JSON數(shù)據(jù)
編寫(xiě)代碼
第一步: 請(qǐng)求JSON地址獲取數(shù)據(jù)
- 自定義header
- 使用requests發(fā)送GET請(qǐng)求
# 導(dǎo)入庫(kù)
import requests
import json
# 自定義header
header = {
'Host': 'news.qq.com/zt2020/page/feiyan.htm#/global',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3704.400 QQBrowser/10.4.3587.400',
}
# 獲取json數(shù)據(jù)
def get_data(url):
get_data = requests.get(url, header)
json_data = json.dumps(get_data.json()['data'])
json_data = json.loads(json_data)
return json_data
if __name__ == "__main__":
# 世界疫情地圖
QQ_data_url2 = 'https://api.inews.qq.com/newsqa/v1/automation/foreign/country/ranklist'
json_data2 = get_data(QQ_data_url2)
第二步:解析獲取到的JSON數(shù)據(jù)
- 打開(kāi)JSON格式化工具
-
打開(kāi)JSON地址復(fù)制數(shù)據(jù)到工具中
JSON格式化工具
- 分析得出:
“name”:國(guó)家名稱(chēng)
"confirm":確診數(shù)量
“heal”:治愈數(shù)量
“confirmAdd”:較上日數(shù)量
第三步:繪制世界疫情地圖静袖,本文使用MAP來(lái)進(jìn)行繪制
import pyecharts
from pyecharts import options as opts
from pyecharts.charts import Map, Page
from pyecharts.globals import ChartType, _CurrentConfig
from pyecharts.commons.utils import JsCode
# 世界疫情地圖
def world_map(data):
# 國(guó)家名
National_data = []
# 確診數(shù)據(jù)
num_data = []
# 治愈數(shù)據(jù)
num_data_zy = []
# 較上日
day_data = []
for i in range((len(data))):
National_data.append(data[i]['name'])
num_data.append(data[i]['confirm'])
num_data_zy.append(data[i]['heal'])
day_data.append(data[i]['confirmAdd'])
nameMap = {
'Singapore Rep.': '新加坡',
'Dominican Rep.': '多米尼加',
'Palestine': '巴勒斯坦',
'Bahamas': '巴哈馬',
'Timor-Leste': '東帝汶',
'Afghanistan': '阿富汗',
'Guinea-Bissau': '幾內(nèi)亞比紹',
"C?te d'Ivoire": '科特迪瓦',
'Siachen Glacier': '錫亞琴冰川',
"Br. Indian Ocean Ter.": '英屬印度洋領(lǐng)土',
'Angola': '安哥拉',
'Albania': '阿爾巴尼亞',
'United Arab Emirates': '阿聯(lián)酋',
'Argentina': '阿根廷',
'Armenia': '亞美尼亞',
'French Southern and Antarctic Lands': '法屬南半球和南極領(lǐng)地',
'Australia': '澳大利亞',
'Austria': '奧地利',
'Azerbaijan': '阿塞拜疆',
'Burundi': '布隆迪',
'Belgium': '比利時(shí)',
'Benin': '貝寧',
'Burkina Faso': '布基納法索',
'Bangladesh': '孟加拉國(guó)',
'Bulgaria': '保加利亞',
'The Bahamas': '巴哈馬',
'Bosnia and Herz.': '波斯尼亞和黑塞哥維那',
'Belarus': '白俄羅斯',
'Belize': '伯利茲',
'Bermuda': '百慕大',
'Bolivia': '玻利維亞',
'Brazil': '巴西',
'Brunei': '文萊',
'Bhutan': '不丹',
'Botswana': '博茨瓦納',
'Central African Rep.': '中非',
'Canada': '加拿大',
'Switzerland': '瑞士',
'Chile': '智利',
'China': '中國(guó)',
'Ivory Coast': '象牙海岸',
'Cameroon': '喀麥隆',
'Dem. Rep. Congo': '剛果民主共和國(guó)',
'Congo': '剛果',
'Colombia': '哥倫比亞',
'Costa Rica': '哥斯達(dá)黎加',
'Cuba': '古巴',
'N. Cyprus': '北塞浦路斯',
'Cyprus': '塞浦路斯',
'Czech Rep.': '捷克',
'Germany': '德國(guó)',
'Djibouti': '吉布提',
'Denmark': '丹麥',
'Algeria': '阿爾及利亞',
'Ecuador': '厄瓜多爾',
'Egypt': '埃及',
'Eritrea': '厄立特里亞',
'Spain': '西班牙',
'Estonia': '愛(ài)沙尼亞',
'Ethiopia': '埃塞俄比亞',
'Finland': '芬蘭',
'Fiji': '斐',
'Falkland Islands': '福克蘭群島',
'France': '法國(guó)',
'Gabon': '加蓬',
'United Kingdom': '英國(guó)',
'Georgia': '格魯吉亞',
'Ghana': '加納',
'Guinea': '幾內(nèi)亞',
'Gambia': '岡比亞',
'Guinea Bissau': '幾內(nèi)亞比紹',
'Eq. Guinea': '赤道幾內(nèi)亞',
'Greece': '希臘',
'Greenland': '格陵蘭',
'Guatemala': '危地馬拉',
'French Guiana': '法屬圭亞那',
'Guyana': '圭亞那',
'Honduras': '洪都拉斯',
'Croatia': '克羅地亞',
'Haiti': '海地',
'Hungary': '匈牙利',
'Indonesia': '印度尼西亞',
'India': '印度',
'Ireland': '愛(ài)爾蘭',
'Iran': '伊朗',
'Iraq': '伊拉克',
'Iceland': '冰島',
'Israel': '以色列',
'Italy': '意大利',
'Jamaica': '牙買(mǎi)加',
'Jordan': '約旦',
'Japan': '日本本土',
'Kazakhstan': '哈薩克斯坦',
'Kenya': '肯尼亞',
'Kyrgyzstan': '吉爾吉斯斯坦',
'Cambodia': '柬埔寨',
'Korea': '韓國(guó)',
'Kosovo': '科索沃',
'Kuwait': '科威特',
'Lao PDR': '老撾',
'Lebanon': '黎巴嫩',
'Liberia': '利比里亞',
'Libya': '利比亞',
'Sri Lanka': '斯里蘭卡',
'Lesotho': '萊索托',
'Lithuania': '立陶宛',
'Luxembourg': '盧森堡',
'Latvia': '拉脫維亞',
'Morocco': '摩洛哥',
'Moldova': '摩爾多瓦',
'Madagascar': '馬達(dá)加斯加',
'Mexico': '墨西哥',
'Macedonia': '馬其頓',
'Mali': '馬里',
'Myanmar': '緬甸',
'Montenegro': '黑山',
'Mongolia': '蒙古',
'Mozambique': '莫桑比克',
'Mauritania': '毛里塔尼亞',
'Malawi': '馬拉維',
'Malaysia': '馬來(lái)西亞',
'Namibia': '納米比亞',
'New Caledonia': '新喀里多尼亞',
'Niger': '尼日爾',
'Nigeria': '尼日利亞',
'Nicaragua': '尼加拉瓜',
'Netherlands': '荷蘭',
'Norway': '挪威',
'Nepal': '尼泊爾',
'New Zealand': '新西蘭',
'Oman': '阿曼',
'Pakistan': '巴基斯坦',
'Panama': '巴拿馬',
'Peru': '秘魯',
'Philippines': '菲律賓',
'Papua New Guinea': '巴布亞新幾內(nèi)亞',
'Poland': '波蘭',
'Puerto Rico': '波多黎各',
'Dem. Rep. Korea': '朝鮮',
'Portugal': '葡萄牙',
'Paraguay': '巴拉圭',
'Qatar': '卡塔爾',
'Romania': '羅馬尼亞',
'Russia': '俄羅斯',
'Rwanda': '盧旺達(dá)',
'W. Sahara': '西撒哈拉',
'Saudi Arabia': '沙特阿拉伯',
'Sudan': '蘇丹',
'S. Sudan': '南蘇丹',
'Senegal': '塞內(nèi)加爾',
'Solomon Is.': '所羅門(mén)群島',
'Sierra Leone': '塞拉利昂',
'El Salvador': '薩爾瓦多',
'Somaliland': '索馬里蘭',
'Somalia': '索馬里',
'Serbia': '塞爾維亞',
'Suriname': '蘇里南',
'Slovakia': '斯洛伐克',
'Slovenia': '斯洛文尼亞',
'Sweden': '瑞典',
'Swaziland': '斯威士蘭',
'Syria': '敘利亞',
'Chad': '乍得',
'Togo': '多哥',
'Thailand': '泰國(guó)',
'Tajikistan': '塔吉克斯坦',
'Turkmenistan': '土庫(kù)曼斯坦',
'East Timor': '東帝汶',
'Trinidad and Tobago': '特里尼達(dá)和多巴哥',
'Tunisia': '突尼斯',
'Turkey': '土耳其',
'Tanzania': '坦桑尼亞',
'Uganda': '烏干達(dá)',
'Ukraine': '烏克蘭',
'Uruguay': '烏拉圭',
'United States': '美國(guó)',
'Uzbekistan': '烏茲別克斯坦',
'Venezuela': '委內(nèi)瑞拉',
'Vietnam': '越南',
'Vanuatu': '瓦努阿圖',
'West Bank': '西岸',
'Yemen': '也門(mén)',
'South Africa': '南非',
'Zambia': '贊比亞',
'Zimbabwe': '津巴布韋',
'Dem.Rep.Congo': '剛果(金)',
'Congo': '剛果(布)',
'Central African Rep.': '中非共和國(guó)',
'Sudan': '蘇丹',
'Greenland': '格陵蘭島',
'Bangladesh': '孟加拉'
}
# 國(guó)家中文名轉(zhuǎn)為英文
for a in range(len(National_data)):
for b in nameMap.keys():
if National_data[a] == nameMap[b]:
National_data[a] = b
else:
continue
# 使用zip壓縮為元組形式
qz_data = [tuple(z) for z in zip(National_data, num_data)]
zy_data = [tuple(z) for z in zip(National_data, num_data_zy)]
sr_data = [tuple(z) for z in zip(National_data, day_data)]
data_sum = 0
data_zy = 0
for i in range(len(num_data)):
data_sum += num_data[i]
data_zy += num_data_zy[i]
# 副標(biāo)題
subtitle = "確診數(shù)量:" + str(data_sum) + "例\n\n治愈數(shù)量:"+str(data_zy)+"例"
world_map_data = (
Map(
# 設(shè)置寬度抗楔,高度
init_opts={"width": "1280px", "height": "800px"}
)
.add(
"確診數(shù)量",
qz_data,
maptype="world",
is_selected=True,
is_map_symbol_show=False
)
.add(
"治愈數(shù)量",
zy_data,
maptype="world",
is_selected=False,
is_map_symbol_show=False
)
.add(
"較上日數(shù)量",
sr_data,
maptype="world",
is_selected=False,
is_map_symbol_show=False
)
# 系列配置
.set_series_opts(
# 不顯示經(jīng)緯度棋凳,設(shè)置顏色,字體大小
label_opts={'is_show': 'False',
'color': '#fff', 'font_size': '18', 'position': 'left'},
)
# 全局配置
.set_global_opts(
# 視覺(jué)映射配置項(xiàng)
visualmap_opts=opts.VisualMapOpts(min_=0, max_=int(
data_sum / 50)),
# 設(shè)置左上角標(biāo)題和副標(biāo)題
title_opts=opts.TitleOpts(
title="世界疫情地圖", subtitle=subtitle, pos_left="50", pos_top="5%", title_textstyle_opts=opts.TextStyleOpts(font_size=30), subtitle_textstyle_opts=opts.TextStyleOpts(font_size=18, color='#222')
),
# 圖例設(shè)置
legend_opts=opts.LegendOpts(
selected_mode='single', pos_top="50", pos_bottom="5%", textstyle_opts=opts.TextStyleOpts(font_size=18)),
)
.render("疫情地圖.html")
)
關(guān)于‘nameMap ’這個(gè)字典:Map的國(guó)家名必須是英文名连躏,用中文名不能繪制上去剩岳。有部分國(guó)家英文名對(duì)不上沒(méi)顯示。
注:獲取的JSON數(shù)據(jù)沒(méi)有中國(guó)的數(shù)據(jù)入热,中國(guó)的數(shù)據(jù)可通過(guò)我上一篇文章獲取拍棕。
MAP設(shè)置參考pyecharts官網(wǎng)
完整代碼
# 導(dǎo)入庫(kù)
import requests
import json
import pyecharts
from pyecharts.commons.utils import JsCode
from pyecharts.globals import ChartType, _CurrentConfig
from pyecharts.charts import Map, Page
from pyecharts import options as opts
# 自定義header
header = {
'Host': 'news.qq.com/zt2020/page/feiyan.htm#/global',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3704.400 QQBrowser/10.4.3587.400',
}
# 獲取json數(shù)據(jù)
def get_data(url):
get_data = requests.get(url, header)
json_data = json.dumps(get_data.json()['data'])
json_data = json.loads(json_data)
return json_data
# 世界疫情地圖
def world_map(data):
# 國(guó)家名
National_data = []
# 確診數(shù)據(jù)
num_data = []
# 治愈數(shù)據(jù)
num_data_zy = []
# 較上日
day_data = []
for i in range((len(data))):
National_data.append(data[i]['name'])
num_data.append(data[i]['confirm'])
num_data_zy.append(data[i]['heal'])
day_data.append(data[i]['confirmAdd'])
nameMap = {
'Singapore Rep.': '新加坡',
'Dominican Rep.': '多米尼加',
'Palestine': '巴勒斯坦',
'Bahamas': '巴哈馬',
'Timor-Leste': '東帝汶',
'Afghanistan': '阿富汗',
'Guinea-Bissau': '幾內(nèi)亞比紹',
"C?te d'Ivoire": '科特迪瓦',
'Siachen Glacier': '錫亞琴冰川',
"Br. Indian Ocean Ter.": '英屬印度洋領(lǐng)土',
'Angola': '安哥拉',
'Albania': '阿爾巴尼亞',
'United Arab Emirates': '阿聯(lián)酋',
'Argentina': '阿根廷',
'Armenia': '亞美尼亞',
'French Southern and Antarctic Lands': '法屬南半球和南極領(lǐng)地',
'Australia': '澳大利亞',
'Austria': '奧地利',
'Azerbaijan': '阿塞拜疆',
'Burundi': '布隆迪',
'Belgium': '比利時(shí)',
'Benin': '貝寧',
'Burkina Faso': '布基納法索',
'Bangladesh': '孟加拉國(guó)',
'Bulgaria': '保加利亞',
'The Bahamas': '巴哈馬',
'Bosnia and Herz.': '波斯尼亞和黑塞哥維那',
'Belarus': '白俄羅斯',
'Belize': '伯利茲',
'Bermuda': '百慕大',
'Bolivia': '玻利維亞',
'Brazil': '巴西',
'Brunei': '文萊',
'Bhutan': '不丹',
'Botswana': '博茨瓦納',
'Central African Rep.': '中非',
'Canada': '加拿大',
'Switzerland': '瑞士',
'Chile': '智利',
'China': '中國(guó)',
'Ivory Coast': '象牙海岸',
'Cameroon': '喀麥隆',
'Dem. Rep. Congo': '剛果民主共和國(guó)',
'Congo': '剛果',
'Colombia': '哥倫比亞',
'Costa Rica': '哥斯達(dá)黎加',
'Cuba': '古巴',
'N. Cyprus': '北塞浦路斯',
'Cyprus': '塞浦路斯',
'Czech Rep.': '捷克',
'Germany': '德國(guó)',
'Djibouti': '吉布提',
'Denmark': '丹麥',
'Algeria': '阿爾及利亞',
'Ecuador': '厄瓜多爾',
'Egypt': '埃及',
'Eritrea': '厄立特里亞',
'Spain': '西班牙',
'Estonia': '愛(ài)沙尼亞',
'Ethiopia': '埃塞俄比亞',
'Finland': '芬蘭',
'Fiji': '斐',
'Falkland Islands': '赶克蘭群島',
'France': '法國(guó)',
'Gabon': '加蓬',
'United Kingdom': '英國(guó)',
'Georgia': '格魯吉亞',
'Ghana': '加納',
'Guinea': '幾內(nèi)亞',
'Gambia': '岡比亞',
'Guinea Bissau': '幾內(nèi)亞比紹',
'Eq. Guinea': '赤道幾內(nèi)亞',
'Greece': '希臘',
'Greenland': '格陵蘭',
'Guatemala': '危地馬拉',
'French Guiana': '法屬圭亞那',
'Guyana': '圭亞那',
'Honduras': '洪都拉斯',
'Croatia': '克羅地亞',
'Haiti': '海地',
'Hungary': '匈牙利',
'Indonesia': '印度尼西亞',
'India': '印度',
'Ireland': '愛(ài)爾蘭',
'Iran': '伊朗',
'Iraq': '伊拉克',
'Iceland': '冰島',
'Israel': '以色列',
'Italy': '意大利',
'Jamaica': '牙買(mǎi)加',
'Jordan': '約旦',
'Japan': '日本本土',
'Kazakhstan': '哈薩克斯坦',
'Kenya': '肯尼亞',
'Kyrgyzstan': '吉爾吉斯斯坦',
'Cambodia': '柬埔寨',
'Korea': '韓國(guó)',
'Kosovo': '科索沃',
'Kuwait': '科威特',
'Lao PDR': '老撾',
'Lebanon': '黎巴嫩',
'Liberia': '利比里亞',
'Libya': '利比亞',
'Sri Lanka': '斯里蘭卡',
'Lesotho': '萊索托',
'Lithuania': '立陶宛',
'Luxembourg': '盧森堡',
'Latvia': '拉脫維亞',
'Morocco': '摩洛哥',
'Moldova': '摩爾多瓦',
'Madagascar': '馬達(dá)加斯加',
'Mexico': '墨西哥',
'Macedonia': '馬其頓',
'Mali': '馬里',
'Myanmar': '緬甸',
'Montenegro': '黑山',
'Mongolia': '蒙古',
'Mozambique': '莫桑比克',
'Mauritania': '毛里塔尼亞',
'Malawi': '馬拉維',
'Malaysia': '馬來(lái)西亞',
'Namibia': '納米比亞',
'New Caledonia': '新喀里多尼亞',
'Niger': '尼日爾',
'Nigeria': '尼日利亞',
'Nicaragua': '尼加拉瓜',
'Netherlands': '荷蘭',
'Norway': '挪威',
'Nepal': '尼泊爾',
'New Zealand': '新西蘭',
'Oman': '阿曼',
'Pakistan': '巴基斯坦',
'Panama': '巴拿馬',
'Peru': '秘魯',
'Philippines': '菲律賓',
'Papua New Guinea': '巴布亞新幾內(nèi)亞',
'Poland': '波蘭',
'Puerto Rico': '波多黎各',
'Dem. Rep. Korea': '朝鮮',
'Portugal': '葡萄牙',
'Paraguay': '巴拉圭',
'Qatar': '卡塔爾',
'Romania': '羅馬尼亞',
'Russia': '俄羅斯',
'Rwanda': '盧旺達(dá)',
'W. Sahara': '西撒哈拉',
'Saudi Arabia': '沙特阿拉伯',
'Sudan': '蘇丹',
'S. Sudan': '南蘇丹',
'Senegal': '塞內(nèi)加爾',
'Solomon Is.': '所羅門(mén)群島',
'Sierra Leone': '塞拉利昂',
'El Salvador': '薩爾瓦多',
'Somaliland': '索馬里蘭',
'Somalia': '索馬里',
'Serbia': '塞爾維亞',
'Suriname': '蘇里南',
'Slovakia': '斯洛伐克',
'Slovenia': '斯洛文尼亞',
'Sweden': '瑞典',
'Swaziland': '斯威士蘭',
'Syria': '敘利亞',
'Chad': '乍得',
'Togo': '多哥',
'Thailand': '泰國(guó)',
'Tajikistan': '塔吉克斯坦',
'Turkmenistan': '土庫(kù)曼斯坦',
'East Timor': '東帝汶',
'Trinidad and Tobago': '特里尼達(dá)和多巴哥',
'Tunisia': '突尼斯',
'Turkey': '土耳其',
'Tanzania': '坦桑尼亞',
'Uganda': '烏干達(dá)',
'Ukraine': '烏克蘭',
'Uruguay': '烏拉圭',
'United States': '美國(guó)',
'Uzbekistan': '烏茲別克斯坦',
'Venezuela': '委內(nèi)瑞拉',
'Vietnam': '越南',
'Vanuatu': '瓦努阿圖',
'West Bank': '西岸',
'Yemen': '也門(mén)',
'South Africa': '南非',
'Zambia': '贊比亞',
'Zimbabwe': '津巴布韋',
'Dem.Rep.Congo': '剛果(金)',
'Congo': '剛果(布)',
'Central African Rep.': '中非共和國(guó)',
'Sudan': '蘇丹',
'Greenland': '格陵蘭島',
'Bangladesh': '孟加拉'
}
# 國(guó)家中文名轉(zhuǎn)為英文
for a in range(len(National_data)):
for b in nameMap.keys():
if National_data[a] == nameMap[b]:
National_data[a] = b
else:
continue
# 使用zip壓縮為元組形式
qz_data = [tuple(z) for z in zip(National_data, num_data)]
zy_data = [tuple(z) for z in zip(National_data, num_data_zy)]
sr_data = [tuple(z) for z in zip(National_data, day_data)]
data_sum = 0
data_zy = 0
for i in range(len(num_data)):
data_sum += num_data[i]
data_zy += num_data_zy[i]
# 副標(biāo)題
subtitle = "確診數(shù)量:" + str(data_sum) + "例\n\n治愈數(shù)量:"+str(data_zy)+"例"
world_map_data = (
Map(
# 設(shè)置寬度,高度
init_opts={"width": "1280px", "height": "800px"}
)
.add(
"確診數(shù)量",
qz_data,
maptype="world",
is_selected=True,
is_map_symbol_show=False
)
.add(
"治愈數(shù)量",
zy_data,
maptype="world",
is_selected=False,
is_map_symbol_show=False
)
.add(
"較上日數(shù)量",
sr_data,
maptype="world",
is_selected=False,
is_map_symbol_show=False
)
# 系列配置
.set_series_opts(
# 不顯示經(jīng)緯度绰播,設(shè)置顏色骄噪,字體大小
label_opts={'is_show': 'False',
'color': '#fff', 'font_size': '18', 'position': 'left'},
)
# 全局配置
.set_global_opts(
# 視覺(jué)映射配置項(xiàng)
visualmap_opts=opts.VisualMapOpts(min_=0, max_=int(
data_sum / 50)),
# 設(shè)置左上角標(biāo)題和副標(biāo)題
title_opts=opts.TitleOpts(
title="世界疫情地圖", subtitle=subtitle, pos_left="50", pos_top="5%", title_textstyle_opts=opts.TextStyleOpts(font_size=30), subtitle_textstyle_opts=opts.TextStyleOpts(font_size=18, color='#222')
),
# 圖例設(shè)置
legend_opts=opts.LegendOpts(
selected_mode='single', pos_top="50", pos_bottom="5%", textstyle_opts=opts.TextStyleOpts(font_size=18)),
)
.render("疫情地圖.html")
)
if __name__ == "__main__":
# 世界疫情地圖
QQ_data_url2 = 'https://api.inews.qq.com/newsqa/v1/automation/foreign/country/ranklist'
json_data2 = get_data(QQ_data_url2)
world_map(json_data2)
效果圖