全球新冠病毒疫情分析
一、选题的背景
新型冠状病毒肺炎(Corona Virus Disease 2019,COVID-19),简称"新冠肺炎",世界卫生组织命名为"2019冠状病毒病" ,是指2019新型冠状病毒感染导致的肺炎。2019年12月以来,湖北省武汉市部分医院陆续发现了多例有华南海鲜市场暴露史的不明原因肺炎病例,证实为2019新型冠状病毒感染引起的急性呼吸道传染病。
2020年2月11日,世界卫生组织总干事谭德塞在瑞士日内瓦宣布,将新型冠状病毒感染的肺炎命名为"COVID-19" 。2月22日,国家卫生健康委发布通知,"新型冠状病毒肺炎"英文名称修订为"COVID-19" 。3月11日,世卫组织认为当前新冠肺炎疫情可被称为全球大流行 。4月4日,中国举行全国性哀悼活动 。在病毒席卷下已经对社会生活产生巨大影响,所以此下分析目前世界疫情现状。
二、主题式网络爬虫设计方案(10 分)
1.主题式网络爬虫名称
Pythone网络爬虫-世界疫情分析
2.主题式网络爬虫爬取的内容
时间、地区、新增确诊、累计确诊、累计死亡、累计治愈
3.主题式网络爬虫设计方案概述(包括实现思路与技术难点)
(1).使用requests发送请求获取网页中的接口数据得到json格式的数据,取出所需要的字段,保存的Excel中。
主要的难点在于查找抓包接口,我使用谷歌的network查看到抓包接口。
(2)、使用pandas读取Excel中的数据,先把数据放到列表中,然后使用python的第三方库和进行数据的可视化。
根据项目主题,设计项目实施方案,包括实现思路与技术难点等。
三、主题页面的结构特征分析(10 分)
先分析网页的结构,打开network
通过查找接口,发现这个接口和可疑,通过详细的对比发现他就是世界的疫情地图。
四、网络爬虫程序设计(60 分)
1.数据爬取与采集
我通过模拟请求从而进行数据的获取,代码如下:
1 headers = { 2 "authority": "c.m.163.com", 3 "pragma": "no-cache", 4 "cache-control": "no-cache", 5 "sec-ch-ua": "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"96\", \"Google Chrome\";v=\"96\"", 6 "accept": "*/*", 7 "sec-ch-ua-mobile": "?0", 8 "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36", 9 "sec-ch-ua-platform": "\"Windows\"", 10 "origin": "https://wp.m.163.com", 11 "sec-fetch-site": "same-site", 12 "sec-fetch-mode": "cors", 13 "sec-fetch-dest": "empty", 14 "referer": "https://wp.m.163.com/", 15 "accept-language": "zh-CN,zh;q=0.9" 16 } 17 url = "https://c.m.163.com/ug/api/wuhan/app/data/list-total" 18 params = { 19 "t": "328096201892" 20 } 21 response = requests.get(url, headers=headers, params=params).json() 22 for data in response['data']['areaTree']: 23 name = data['name'] # 地区 24 lastUpdateTime = data['lastUpdateTime'].split(" ")[0] # 时间 25 confirm = data['today']['confirm'] # 新增确诊 26 confirm_total = data['total']['confirm'] # 累计确诊 27 heal = data['total']['heal'] 28 dead = data['total']['dead'] # 治愈
效果如下:
接下来就是保存到Excel当中,通过使用csv模块,进行对Excel的操作,我对他进行了封装函数,传入名字和标题和内容
代码如下:
1 import requests, csv 2 3 4 def save_csv(file_name, title_name, content): 5 """ 6 :param file_name: 保存的文件名称,传入类型:字符串 7 :param title_name: 保存的标题名称,传入类型:列表 8 :param content: 保存的内容,传入类型:列表 9 :return: 10 """ 11 if type(title_name) == list: 12 title_name = tuple(title_name) 13 elif type(title_name) == dict: 14 title_name = tuple(title_name.values()) 15 if type(content) == list: 16 content = tuple(content) 17 elif type(content) == dict: 18 content = tuple(content.values()) 19 with open("{}.csv".format(file_name), "a+", newline="", errors="ignore", encoding="utf-8-sig") as a: 20 writer = csv.writer(a) 21 # 以读的方式打开csv文件 22 with open("{}.csv".format(file_name), "r", newline="", errors="ignore", encoding="utf-8-sig") as f: 23 reader = csv.reader(f) 24 # 判断是否有标题,如果没有则写入标题和内容,如果有则写入内容 25 if not [row for row in reader]: 26 writer.writerow(title_name) 27 writer.writerow(content) 28 else: 29 writer.writerow(content)
效果如下:
2.数据分析与可视化(例如:数据柱形图、直方图、散点图、盒图、分布图)
分析出世界疫情图
读取Excel中的内容放到程序的列表中,遍历得到需要的字段进行保存到新的列表中,通过pyecharts可视化。
1 element = list(map_version.items()) # 将字典值调整为能够传入地图的格式 2 name_map = { 3 'Singapore Rep.': '新加坡', 4 'Dominican Rep.': '多米尼加', 5 'Palestine': '巴勒斯坦', 6 'Bahamas': '巴哈马', 7 'Timor-Leste': '东帝汶', 8 'Afghanistan': '阿富汗', 9 'Guinea-Bissau': '几内亚比绍', 10 "Côte d'Ivoire": '科特迪瓦', 11 'Siachen Glacier': '锡亚琴冰川', 12 "Br. Indian Ocean Ter.": '英属印度洋领土', 13 'Angola': '安哥拉', 14 'Albania': '阿尔巴尼亚', 15 'United Arab Emirates': '阿联酋', 16 'Argentina': '阿根廷', 17 'Armenia': '亚美尼亚', 18 'French Southern and Antarctic Lands': '法属南半球和南极领地', 19 'Australia': '澳大利亚', 20 'Austria': '奥地利', 21 'Azerbaijan': '阿塞拜疆', 22 'Burundi': '布隆迪', 23 'Belgium': '比利时', 24 'Benin': '贝宁', 25 'Burkina Faso': '布基纳法索', 26 'Bangladesh': '孟加拉国', 27 'Bulgaria': '保加利亚', 28 'The Bahamas': '巴哈马', 29 'Bosnia and Herz.': '波斯尼亚和黑塞哥维那', 30 'Belarus': '白俄罗斯', 31 'Belize': '伯利兹', 32 'Bermuda': '百慕大', 33 'Bolivia': '玻利维亚', 34 'Brazil': '巴西', 35 'Brunei': '文莱', 36 'Bhutan': '不丹', 37 'Botswana': '博茨瓦纳', 38 'Central African Rep.': '中非', 39 'Canada': '加拿大', 40 'Switzerland': '瑞士', 41 'Chile': '智利', 42 'China': '中国', 43 'Ivory Coast': '象牙海岸', 44 'Cameroon': '喀麦隆', 45 'Dem. Rep. Congo': '刚果民主共和国', 46 'Congo': '刚果', 47 'Colombia': '哥伦比亚', 48 'Costa Rica': '哥斯达黎加', 49 'Cuba': '古巴', 50 'N. Cyprus': '北塞浦路斯', 51 'Cyprus': '塞浦路斯', 52 'Czech Rep.': '捷克', 53 'Germany': '德国', 54 'Djibouti': '吉布提', 55 'Denmark': '丹麦', 56 'Algeria': '阿尔及利亚', 57 'Ecuador': '厄瓜多尔', 58 'Egypt': '埃及', 59 'Eritrea': '厄立特里亚', 60 'Spain': '西班牙', 61 'Estonia': '爱沙尼亚', 62 'Ethiopia': '埃塞俄比亚', 63 'Finland': '芬兰', 64 'Fiji': '斐', 65 'Falkland Islands': '福克兰群岛', 66 'France': '法国', 67 'Gabon': '加蓬', 68 'United Kingdom': '英国', 69 'Georgia': '格鲁吉亚', 70 'Ghana': '加纳', 71 'Guinea': '几内亚', 72 'Gambia': '冈比亚', 73 'Guinea Bissau': '几内亚比绍', 74 'Eq. Guinea': '赤道几内亚', 75 'Greece': '希腊', 76 'Greenland': '格陵兰', 77 'Guatemala': '危地马拉', 78 'French Guiana': '法属圭亚那', 79 'Guyana': '圭亚那', 80 'Honduras': '洪都拉斯', 81 'Croatia': '克罗地亚', 82 'Haiti': '海地', 83 'Hungary': '匈牙利', 84 'Indonesia': '印度尼西亚', 85 'India': '印度', 86 'Ireland': '爱尔兰', 87 'Iran': '伊朗', 88 'Iraq': '伊拉克', 89 'Iceland': '冰岛', 90 'Israel': '以色列', 91 'Italy': '意大利', 92 'Jamaica': '牙买加', 93 'Jordan': '约旦', 94 'Japan': '日本', 95 'Kazakhstan': '哈萨克斯坦', 96 'Kenya': '肯尼亚', 97 'Kyrgyzstan': '吉尔吉斯斯坦', 98 'Cambodia': '柬埔寨', 99 'Korea': '韩国', 100 'Kosovo': '科索沃', 101 'Kuwait': '科威特', 102 'Lao PDR': '老挝', 103 'Lebanon': '黎巴嫩', 104 'Liberia': '利比里亚', 105 'Libya': '利比亚', 106 'Sri Lanka': '斯里兰卡', 107 'Lesotho': '莱索托', 108 'Lithuania': '立陶宛', 109 'Luxembourg': '卢森堡', 110 'Latvia': '拉脱维亚', 111 'Morocco': '摩洛哥', 112 'Moldova': '摩尔多瓦', 113 'Madagascar': '马达加斯加', 114 'Mexico': '墨西哥', 115 'Macedonia': '马其顿', 116 'Mali': '马里', 117 'Myanmar': '缅甸', 118 'Montenegro': '黑山', 119 'Mongolia': '蒙古', 120 'Mozambique': '莫桑比克', 121 'Mauritania': '毛里塔尼亚', 122 'Malawi': '马拉维', 123 'Malaysia': '马来西亚', 124 'Namibia': '纳米比亚', 125 'New Caledonia': '新喀里多尼亚', 126 'Niger': '尼日尔', 127 'Nigeria': '尼日利亚', 128 'Nicaragua': '尼加拉瓜', 129 'Netherlands': '荷兰', 130 'Norway': '挪威', 131 'Nepal': '尼泊尔', 132 'New Zealand': '新西兰', 133 'Oman': '阿曼', 134 'Pakistan': '巴基斯坦', 135 'Panama': '巴拿马', 136 'Peru': '秘鲁', 137 'Philippines': '菲律宾', 138 'Papua New Guinea': '巴布亚新几内亚', 139 'Poland': '波兰', 140 'Puerto Rico': '波多黎各', 141 'Dem. Rep. Korea': '朝鲜', 142 'Portugal': '葡萄牙', 143 'Paraguay': '巴拉圭', 144 'Qatar': '卡塔尔', 145 'Romania': '罗马尼亚', 146 'Russia': '俄罗斯', 147 'Rwanda': '卢旺达', 148 'W. Sahara': '西撒哈拉', 149 'Saudi Arabia': '沙特阿拉伯', 150 'Sudan': '苏丹', 151 'S. Sudan': '南苏丹', 152 'Senegal': '塞内加尔', 153 'Solomon Is.': '所罗门群岛', 154 'Sierra Leone': '塞拉利昂', 155 'El Salvador': '萨尔瓦多', 156 'Somaliland': '索马里兰', 157 'Somalia': '索马里', 158 'Serbia': '塞尔维亚', 159 'Suriname': '苏里南', 160 'Slovakia': '斯洛伐克', 161 'Slovenia': '斯洛文尼亚', 162 'Sweden': '瑞典', 163 'Swaziland': '斯威士兰', 164 'Syria': '叙利亚', 165 'Chad': '乍得', 166 'Togo': '多哥', 167 'Thailand': '泰国', 168 'Tajikistan': '塔吉克斯坦', 169 'Turkmenistan': '土库曼斯坦', 170 'East Timor': '东帝汶', 171 'Trinidad and Tobago': '特里尼达和多巴哥', 172 'Tunisia': '突尼斯', 173 'Turkey': '土耳其', 174 'Tanzania': '坦桑尼亚', 175 'Uganda': '乌干达', 176 'Ukraine': '乌克兰', 177 'Uruguay': '乌拉圭', 178 'United States': '美国', 179 'Uzbekistan': '乌兹别克斯坦', 180 'Venezuela': '委内瑞拉', 181 'Vietnam': '越南', 182 'Vanuatu': '瓦努阿图', 183 'West Bank': '西岸', 184 'Yemen': '也门', 185 'South Africa': '南非', 186 'Zambia': '赞比亚', 187 'Zimbabwe': '津巴布韦', 188 'Comoros': '科摩罗' 189 } 190 191 map = Map(options.InitOpts(bg_color="#87CEFA", page_title='世界疫情分布')). \ 192 add(series_name="世界疫情分布图", # 名称 193 data_pair=element, # 传入数据 194 is_map_symbol_show=False, # 不显示标记 195 maptype='world', # 地图类型 196 name_map=name_map, 197 ) 198 # 设置全局配置项 199 map.set_global_opts(visualmap_opts=options.VisualMapOpts(max_=1100000, is_piecewise=True, pieces=[ 200 {"min": 500000}, 201 {"min": 200000, "max": 499999}, 202 {"min": 100000, "max": 199999}, 203 {"min": 50000, "max": 99999}, 204 {"min": 10000, "max": 49999}, 205 {"max": 9999}, ])) 206 # 设置系列配置项 207 map.set_series_opts(label_opts=options.LabelOpts(is_show=False)) # 不显示国家名 208 map.render('map.html') # 命名并保存
效果如下:
饼状图可视化分析
读取Excel中的内容取出国家和新增确诊人数,保存到列表中,传入第三库进行绘制
代码如下:
1 result = sorted(city_list.items(), key=lambda kv: (kv[1], kv[0])) 2 name = [] 3 number = [] 4 result.reverse() 5 result = result[-10:] 6 for res in result: 7 name.append(res[0]) 8 number.append(int(res[1])) 9 # city_list = [x for x in number_newly for a in city_list if a.get(x,"")!= ""] 10 plt.rcParams['font.sans-serif'] = ['SimHei'] 11 plt.rcParams['axes.unicode_minus'] = False 12 13 # # 饼状图 14 plt.figure(figsize=(8,8)) 15 labels =name 16 sizes = number 17 colors = ['red', 'yellow', 'blue', 'green', 'yellow', 'blue', 'green','blue', 'green', 'yellow'] 18 19 explode = (0.05, 0, 0, 0,0.05, 0, 0, 0,0.5,0) 20 21 patches, l_text, p_text = plt.pie(sizes,labels=labels, colors=colors, 22 labeldistance=1.1, autopct='%2.0f%%', shadow=False, 23 startangle=90, pctdistance=0.6) 24 25 # labeldistance,文本的位置离远点有多远,1.1指1.1倍半径的位置 26 # autopct,圆里面的文本格式,%3.1f%%表示小数有三位,整数有一位的浮点数 27 # shadow,饼是否有阴影 28 # startangle,起始角度,0,表示从0开始逆时针转,为第一块。一般选择从90度开始比较好看 29 # pctdistance,百分比的text离圆心的距离 30 # patches, l_texts, p_texts,为了得到饼图的返回值,p_texts饼图内部文本的,l_texts饼图外label的文本 31 32 # 改变文本的大小 33 # 方法是把每一个text遍历。调用set_size方法设置它的属性 34 for t in l_text: 35 t.set_size = 30 36 for t in p_text: 37 t.set_size = 20 38 # 设置x,y轴刻度一致,这样饼图才能是圆的 39 plt.axis('equal') 40 plt.legend(loc='upper left', bbox_to_anchor=(-0.1, 1)) 41 # loc: 表示legend的位置,包括'upper right','upper left','lower right','lower left'等 42 # bbox_to_anchor: 表示legend距离图形之间的距离,当出现图形与legend重叠时,可使用bbox_to_anchor进行调整legend的位置 43 # 由两个参数决定,第一个参数为legend距离左边的距离,第二个参数为距离下面的距离 44 plt.grid() 45 # plt.show() 46 plt.savefig("1.png")
效果如下:
3.将以上各部分的代码汇总,附上完整程序代码
1 headers = { 2 "authority": "c.m.163.com", 3 "pragma": "no-cache", 4 "cache-control": "no-cache", 5 "sec-ch-ua": "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"96\", \"Google Chrome\";v=\"96\"", 6 "accept": "*/*", 7 "sec-ch-ua-mobile": "?0", 8 "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36", 9 "sec-ch-ua-platform": "\"Windows\"", 10 "origin": "https://wp.m.163.com", 11 "sec-fetch-site": "same-site", 12 "sec-fetch-mode": "cors", 13 "sec-fetch-dest": "empty", 14 "referer": "https://wp.m.163.com/", 15 "accept-language": "zh-CN,zh;q=0.9" 16 } 17 url = "https://c.m.163.com/ug/api/wuhan/app/data/list-total" 18 params = { 19 "t": "328096201892" 20 } 21 response = requests.get(url, headers=headers, params=params).json() 22 for data in response['data']['areaTree']: 23 name = data['name'] # 地区 24 lastUpdateTime = data['lastUpdateTime'].split(" ")[0] # 时间 25 confirm = data['today']['confirm'] # 新增确诊 26 confirm_total = data['total']['confirm'] # 累计确诊 27 heal = data['total']['heal'] 28 dead = data['total']['dead'] # 治愈 29 import requests, csv 30 31 32 def save_csv(file_name, title_name, content): 33 """ 34 :param file_name: 保存的文件名称,传入类型:字符串 35 :param title_name: 保存的标题名称,传入类型:列表 36 :param content: 保存的内容,传入类型:列表 37 :return: 38 """ 39 if type(title_name) == list: 40 title_name = tuple(title_name) 41 elif type(title_name) == dict: 42 title_name = tuple(title_name.values()) 43 if type(content) == list: 44 content = tuple(content) 45 elif type(content) == dict: 46 content = tuple(content.values()) 47 with open("{}.csv".format(file_name), "a+", newline="", errors="ignore", encoding="utf-8-sig") as a: 48 writer = csv.writer(a) 49 # 以读的方式打开csv文件 50 with open("{}.csv".format(file_name), "r", newline="", errors="ignore", encoding="utf-8-sig") as f: 51 reader = csv.reader(f) 52 # 判断是否有标题,如果没有则写入标题和内容,如果有则写入内容 53 if not [row for row in reader]: 54 writer.writerow(title_name) 55 writer.writerow(content) 56 else: 57 writer.writerow(content) 58 element = list(map_version.items()) # 将字典值调整为能够传入地图的格式 59 name_map = { 60 'Singapore Rep.': '新加坡', 61 'Dominican Rep.': '多米尼加', 62 'Palestine': '巴勒斯坦', 63 'Bahamas': '巴哈马', 64 'Timor-Leste': '东帝汶', 65 'Afghanistan': '阿富汗', 66 'Guinea-Bissau': '几内亚比绍', 67 "Côte d'Ivoire": '科特迪瓦', 68 'Siachen Glacier': '锡亚琴冰川', 69 "Br. Indian Ocean Ter.": '英属印度洋领土', 70 'Angola': '安哥拉', 71 'Albania': '阿尔巴尼亚', 72 'United Arab Emirates': '阿联酋', 73 'Argentina': '阿根廷', 74 'Armenia': '亚美尼亚', 75 'French Southern and Antarctic Lands': '法属南半球和南极领地', 76 'Australia': '澳大利亚', 77 'Austria': '奥地利', 78 'Azerbaijan': '阿塞拜疆', 79 'Burundi': '布隆迪', 80 'Belgium': '比利时', 81 'Benin': '贝宁', 82 'Burkina Faso': '布基纳法索', 83 'Bangladesh': '孟加拉国', 84 'Bulgaria': '保加利亚', 85 'The Bahamas': '巴哈马', 86 'Bosnia and Herz.': '波斯尼亚和黑塞哥维那', 87 'Belarus': '白俄罗斯', 88 'Belize': '伯利兹', 89 'Bermuda': '百慕大', 90 'Bolivia': '玻利维亚', 91 'Brazil': '巴西', 92 'Brunei': '文莱', 93 'Bhutan': '不丹', 94 'Botswana': '博茨瓦纳', 95 'Central African Rep.': '中非', 96 'Canada': '加拿大', 97 'Switzerland': '瑞士', 98 'Chile': '智利', 99 'China': '中国', 100 'Ivory Coast': '象牙海岸', 101 'Cameroon': '喀麦隆', 102 'Dem. Rep. Congo': '刚果民主共和国', 103 'Congo': '刚果', 104 'Colombia': '哥伦比亚', 105 'Costa Rica': '哥斯达黎加', 106 'Cuba': '古巴', 107 'N. Cyprus': '北塞浦路斯', 108 'Cyprus': '塞浦路斯', 109 'Czech Rep.': '捷克', 110 'Germany': '德国', 111 'Djibouti': '吉布提', 112 'Denmark': '丹麦', 113 'Algeria': '阿尔及利亚', 114 'Ecuador': '厄瓜多尔', 115 'Egypt': '埃及', 116 'Eritrea': '厄立特里亚', 117 'Spain': '西班牙', 118 'Estonia': '爱沙尼亚', 119 'Ethiopia': '埃塞俄比亚', 120 'Finland': '芬兰', 121 'Fiji': '斐', 122 'Falkland Islands': '福克兰群岛', 123 'France': '法国', 124 'Gabon': '加蓬', 125 'United Kingdom': '英国', 126 'Georgia': '格鲁吉亚', 127 'Ghana': '加纳', 128 'Guinea': '几内亚', 129 'Gambia': '冈比亚', 130 'Guinea Bissau': '几内亚比绍', 131 'Eq. Guinea': '赤道几内亚', 132 'Greece': '希腊', 133 'Greenland': '格陵兰', 134 'Guatemala': '危地马拉', 135 'French Guiana': '法属圭亚那', 136 'Guyana': '圭亚那', 137 'Honduras': '洪都拉斯', 138 'Croatia': '克罗地亚', 139 'Haiti': '海地', 140 'Hungary': '匈牙利', 141 'Indonesia': '印度尼西亚', 142 'India': '印度', 143 'Ireland': '爱尔兰', 144 'Iran': '伊朗', 145 'Iraq': '伊拉克', 146 'Iceland': '冰岛', 147 'Israel': '以色列', 148 'Italy': '意大利', 149 'Jamaica': '牙买加', 150 'Jordan': '约旦', 151 'Japan': '日本', 152 'Kazakhstan': '哈萨克斯坦', 153 'Kenya': '肯尼亚', 154 'Kyrgyzstan': '吉尔吉斯斯坦', 155 'Cambodia': '柬埔寨', 156 'Korea': '韩国', 157 'Kosovo': '科索沃', 158 'Kuwait': '科威特', 159 'Lao PDR': '老挝', 160 'Lebanon': '黎巴嫩', 161 'Liberia': '利比里亚', 162 'Libya': '利比亚', 163 'Sri Lanka': '斯里兰卡', 164 'Lesotho': '莱索托', 165 'Lithuania': '立陶宛', 166 'Luxembourg': '卢森堡', 167 'Latvia': '拉脱维亚', 168 'Morocco': '摩洛哥', 169 'Moldova': '摩尔多瓦', 170 'Madagascar': '马达加斯加', 171 'Mexico': '墨西哥', 172 'Macedonia': '马其顿', 173 'Mali': '马里', 174 'Myanmar': '缅甸', 175 'Montenegro': '黑山', 176 'Mongolia': '蒙古', 177 'Mozambique': '莫桑比克', 178 'Mauritania': '毛里塔尼亚', 179 'Malawi': '马拉维', 180 'Malaysia': '马来西亚', 181 'Namibia': '纳米比亚', 182 'New Caledonia': '新喀里多尼亚', 183 'Niger': '尼日尔', 184 'Nigeria': '尼日利亚', 185 'Nicaragua': '尼加拉瓜', 186 'Netherlands': '荷兰', 187 'Norway': '挪威', 188 'Nepal': '尼泊尔', 189 'New Zealand': '新西兰', 190 'Oman': '阿曼', 191 'Pakistan': '巴基斯坦', 192 'Panama': '巴拿马', 193 'Peru': '秘鲁', 194 'Philippines': '菲律宾', 195 'Papua New Guinea': '巴布亚新几内亚', 196 'Poland': '波兰', 197 'Puerto Rico': '波多黎各', 198 'Dem. Rep. Korea': '朝鲜', 199 'Portugal': '葡萄牙', 200 'Paraguay': '巴拉圭', 201 'Qatar': '卡塔尔', 202 'Romania': '罗马尼亚', 203 'Russia': '俄罗斯', 204 'Rwanda': '卢旺达', 205 'W. Sahara': '西撒哈拉', 206 'Saudi Arabia': '沙特阿拉伯', 207 'Sudan': '苏丹', 208 'S. Sudan': '南苏丹', 209 'Senegal': '塞内加尔', 210 'Solomon Is.': '所罗门群岛', 211 'Sierra Leone': '塞拉利昂', 212 'El Salvador': '萨尔瓦多', 213 'Somaliland': '索马里兰', 214 'Somalia': '索马里', 215 'Serbia': '塞尔维亚', 216 'Suriname': '苏里南', 217 'Slovakia': '斯洛伐克', 218 'Slovenia': '斯洛文尼亚', 219 'Sweden': '瑞典', 220 'Swaziland': '斯威士兰', 221 'Syria': '叙利亚', 222 'Chad': '乍得', 223 'Togo': '多哥', 224 'Thailand': '泰国', 225 'Tajikistan': '塔吉克斯坦', 226 'Turkmenistan': '土库曼斯坦', 227 'East Timor': '东帝汶', 228 'Trinidad and Tobago': '特里尼达和多巴哥', 229 'Tunisia': '突尼斯', 230 'Turkey': '土耳其', 231 'Tanzania': '坦桑尼亚', 232 'Uganda': '乌干达', 233 'Ukraine': '乌克兰', 234 'Uruguay': '乌拉圭', 235 'United States': '美国', 236 'Uzbekistan': '乌兹别克斯坦', 237 'Venezuela': '委内瑞拉', 238 'Vietnam': '越南', 239 'Vanuatu': '瓦努阿图', 240 'West Bank': '西岸', 241 'Yemen': '也门', 242 'South Africa': '南非', 243 'Zambia': '赞比亚', 244 'Zimbabwe': '津巴布韦', 245 'Comoros': '科摩罗' 246 } 247 248 map = Map(options.InitOpts(bg_color="#87CEFA", page_title='世界疫情分布')). \ 249 add(series_name="世界疫情分布图", # 名称 250 data_pair=element, # 传入数据 251 is_map_symbol_show=False, # 不显示标记 252 maptype='world', # 地图类型 253 name_map=name_map, 254 ) 255 # 设置全局配置项 256 map.set_global_opts(visualmap_opts=options.VisualMapOpts(max_=1100000, is_piecewise=True, pieces=[ 257 {"min": 500000}, 258 {"min": 200000, "max": 499999}, 259 {"min": 100000, "max": 199999}, 260 {"min": 50000, "max": 99999}, 261 {"min": 10000, "max": 49999}, 262 {"max": 9999}, ])) 263 # 设置系列配置项 264 map.set_series_opts(label_opts=options.LabelOpts(is_show=False)) # 不显示国家名 265 map.render('map.html') # 命名并保存 266 result = sorted(city_list.items(), key=lambda kv: (kv[1], kv[0])) 267 name = [] 268 number = [] 269 result.reverse() 270 result = result[-10:] 271 for res in result: 272 name.append(res[0]) 273 number.append(int(res[1])) 274 # city_list = [x for x in number_newly for a in city_list if a.get(x,"")!= ""] 275 plt.rcParams['font.sans-serif'] = ['SimHei'] 276 plt.rcParams['axes.unicode_minus'] = False 277 278 # # 饼状图 279 plt.figure(figsize=(8,8)) 280 labels =name 281 sizes = number 282 colors = ['red', 'yellow', 'blue', 'green', 'yellow', 'blue', 'green','blue', 'green', 'yellow'] 283 284 explode = (0.05, 0, 0, 0,0.05, 0, 0, 0,0.5,0) 285 286 patches, l_text, p_text = plt.pie(sizes,labels=labels, colors=colors, 287 labeldistance=1.1, autopct='%2.0f%%', shadow=False, 288 startangle=90, pctdistance=0.6) 289 290 # labeldistance,文本的位置离远点有多远,1.1指1.1倍半径的位置 291 # autopct,圆里面的文本格式,%3.1f%%表示小数有三位,整数有一位的浮点数 292 # shadow,饼是否有阴影 293 # startangle,起始角度,0,表示从0开始逆时针转,为第一块。一般选择从90度开始比较好看 294 # pctdistance,百分比的text离圆心的距离 295 # patches, l_texts, p_texts,为了得到饼图的返回值,p_texts饼图内部文本的,l_texts饼图外label的文本 296 297 # 改变文本的大小 298 # 方法是把每一个text遍历。调用set_size方法设置它的属性 299 for t in l_text: 300 t.set_size = 30 301 for t in p_text: 302 t.set_size = 20 303 # 设置x,y轴刻度一致,这样饼图才能是圆的 304 plt.axis('equal') 305 plt.legend(loc='upper left', bbox_to_anchor=(-0.1, 1)) 306 # loc: 表示legend的位置,包括'upper right','upper left','lower right','lower left'等 307 # bbox_to_anchor: 表示legend距离图形之间的距离,当出现图形与legend重叠时,可使用bbox_to_anchor进行调整legend的位置 308 # 由两个参数决定,第一个参数为legend距离左边的距离,第二个参数为距离下面的距离 309 plt.grid() 310 # plt.show() 311 plt.savefig("1.png")
五、总结(10 分)
根据现有病例资料,新型冠状病毒肺炎以发热、干咳、乏力等为主要表现,少数患者伴有鼻塞、流涕、腹泻等上呼吸道和消化道症状。重症病例多在1周后出现呼吸困难,严重者快速进展为急性呼吸窘迫综合征、脓毒症休克、难以纠正的代谢性酸中毒和出凝血功能障碍及多器官功能衰竭等。。
目前国内疫情经过国家和人民的不断努力,基本得到控制,但是还是有部分地区因为外来疫情入侵而导致反弹。在世界其他地方疫情正在慢慢发展,希望世界各国人民团结起来共抗疫情。
新型冠状病毒肺炎,正处在早期快速变化阶段。中国已公布导致新型状病毒肺炎的新型冠状病毒的全基因组序列,这将有助于全球科学家和公共卫生组织加入诊断试剂的研发,及病毒致病性研究。