新冠肺炎国内疫情基本控制住,很多地方都开始摘下口罩了。但是国外的疫情依然处于爆发期,特别是美国,截止目前其累计确诊数量已突破110w。五一节北京柳絮杨絮满天飞,不适合外出。在家心血来潮,献丑画一下各地区新冠肺炎累计确诊数量热图。

废话不多说,代码如下:

  1. import requests as rq
  2. import re
  3. import numpy as np
  4. import pandas as pd
  5. # 数据来源:新华网
  6. # http://my-h5news.app.xinhuanet.com/h5activity/yiqingchaxun/index.html
  7. url = 'http://fms.news.cn/swf/2020_sjxw/2_1_xgyq/js/data.js'
  8. headers = {
  9. 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36'
  10. }
  11. # 网页数据
  12. home_rt = rq.get(url, headers=headers).text
  13. # 提取日期
  14. dates = re.search('_g_map_data_days = \[(.*?)\]', home_rt).group(1)
  15. dates = re.findall('\'(.*?)\'', dates)
  16. # # 日更日期
  17. # dates = re.search('_g_dt_date = \[(.*?)\]', home_rt).group(1)
  18. # dates = re.findall('\'(.*?)\'', dates)
  19.  
  20. # 提取省份
  21. provinces = re.search('_g_map_data_province = \[(.*?)\];', home_rt).group(1)
  22. provinces = re.findall('\'(.*?)\'', provinces)
  23. # 提取数据
  24. data = re.search('_g_map_data_data =\[(.*?)\];', home_rt, re.S).group(1)
  25. data = re.findall('\[(.*?)\]', data, re.S)
  26. data = [i.split(',') for i in data]
  27. data = np.array(data).T
  28. # 生成表格
  29. data = pd.DataFrame(data, columns=dates, index=provinces)
  30. data = data.astype('int') # 转换str类型为int型
  31. last_colum = data.columns[-1]
  32. data = data.sort_values(last_colum, ascending=False)

得到如下dataframe格式数据:

本次画图采用的是pyecharts:

pyecharts是基于echarts,是百度的开源可视化工具,包含多种酷炫工具,并且是交互式的,图像可以用鼠标进行拖动放大缩小等,强烈推荐。

1、github源码(包含安装方式,最好选择源码安装)。2、介绍文档。3、官方示例代码

  1. from pyecharts import options as opts
  2. from pyecharts.charts import Map
  3. from pyecharts.faker import Faker
  4. province_data = [] # 生成pyecharts数据格式
  5. for p_i, pro_name in enumerate(data.index):
  6. province_data.append([pro_name, int(data.iloc[p_i, -1])])
  7. c = (
  8. Map(opts.InitOpts(width='600px', height='400px', bg_color='white')) # 创建地图对象
  9. .add('累计确诊', province_data, "china", is_map_symbol_show=False) # 添加数据,选择中国地图
  10. # .set_series_opts(label_opts=opts.LabelOpts(is_show=False)) # 用于显示各省份名字
  11. .set_global_opts(title_opts=opts.TitleOpts(title="中国各省新冠肺炎累计确诊数量", pos_left='center'), # 设置标题图例等信息
  12. legend_opts=opts.LegendOpts(is_show=False),
  13. visualmap_opts=opts.VisualMapOpts(is_piecewise = True,
  14. pieces = [{"max": 100, 'color': '#ffeead', 'label': '小于100人'},
  15. {"min": 100, "max": 500, 'color': '#f29c2b', 'label': '100-500人'},
  16. {"min": 500, "max": 1000, 'color': '#d9534f', 'label': '500-1000人'},
  17. {"min": 1000, "max": 2000, "color": '#de4307', 'label': '1000-2000人'},
  18. {"min": 2000, 'color': '#dd0a35', 'label': '2000人以上'}])
  19. )
  20. )
  21. c.render_notebook()

 

  1. nameMap = {
  2. 'Singapore':'新加坡',
  3. 'Dominican Rep.':'多米尼加',
  4. 'Palestine':'巴勒斯坦',
  5. 'Bahamas':'巴哈马',
  6. 'Timor-Leste':'东帝汶',
  7. 'Afghanistan':'阿富汗',
  8. 'Guinea-Bissau':'几内亚比绍',
  9. "Côte d'Ivoire":'科特迪瓦',
  10. 'Siachen Glacier':'锡亚琴冰川',
  11. "Br. Indian Ocean Ter.":'英属印度洋领土',
  12. 'Angola':'安哥拉',
  13. 'Albania':'阿尔巴尼亚',
  14. 'United Arab Emirates':'阿联酋',
  15. 'Argentina':'阿根廷',
  16. 'Armenia':'亚美尼亚',
  17. 'French Southern and Antarctic Lands':'法属南半球和南极领地',
  18. 'Australia':'澳大利亚',
  19. 'Austria':'奥地利',
  20. 'Azerbaijan':'阿塞拜疆',
  21. 'Burundi':'布隆迪',
  22. 'Belgium':'比利时',
  23. 'Benin':'贝宁',
  24. 'Burkina Faso':'布基纳法索',
  25. 'Bangladesh':'孟加拉国',
  26. 'Bulgaria':'保加利亚',
  27. 'The Bahamas':'巴哈马',
  28. 'Bosnia and Herz.':'波斯尼亚和黑塞哥维那',
  29. 'Belarus':'白俄罗斯',
  30. 'Belize':'伯利兹',
  31. 'Bermuda':'百慕大',
  32. 'Bolivia':'玻利维亚',
  33. 'Brazil':'巴西',
  34. 'Brunei':'文莱',
  35. 'Bhutan':'不丹',
  36. 'Botswana':'博茨瓦纳',
  37. 'Central African Rep.':'中非',
  38. 'Canada':'加拿大',
  39. 'Switzerland':'瑞士',
  40. 'Chile':'智利',
  41. 'China':'中国',
  42. 'Ivory Coast':'象牙海岸',
  43. 'Cameroon':'喀麦隆',
  44. 'Dem. Rep. Congo':'刚果民主共和国',
  45. 'Congo':'刚果',
  46. 'Colombia':'哥伦比亚',
  47. 'Costa Rica':'哥斯达黎加',
  48. 'Cuba':'古巴',
  49. 'N. Cyprus':'北塞浦路斯',
  50. 'Cyprus':'塞浦路斯',
  51. 'Czech Rep.':'捷克',
  52. 'Germany':'德国',
  53. 'Djibouti':'吉布提',
  54. 'Denmark':'丹麦',
  55. 'Algeria':'阿尔及利亚',
  56. 'Ecuador':'厄瓜多尔',
  57. 'Egypt':'埃及',
  58. 'Eritrea':'厄立特里亚',
  59. 'Spain':'西班牙',
  60. 'Estonia':'爱沙尼亚',
  61. 'Ethiopia':'埃塞俄比亚',
  62. 'Finland':'芬兰',
  63. 'Fiji':'',
  64. 'Falkland Islands':'福克兰群岛',
  65. 'France':'法国',
  66. 'Gabon':'加蓬',
  67. 'United Kingdom':'英国',
  68. 'Georgia':'格鲁吉亚',
  69. 'Ghana':'加纳',
  70. 'Guinea':'几内亚',
  71. 'Gambia':'冈比亚',
  72. 'Guinea Bissau':'几内亚比绍',
  73. 'Eq. Guinea':'赤道几内亚',
  74. 'Greece':'希腊',
  75. 'Greenland':'格陵兰',
  76. 'Guatemala':'危地马拉',
  77. 'French Guiana':'法属圭亚那',
  78. 'Guyana':'圭亚那',
  79. 'Honduras':'洪都拉斯',
  80. 'Croatia':'克罗地亚',
  81. 'Haiti':'海地',
  82. 'Hungary':'匈牙利',
  83. 'Indonesia':'印度尼西亚',
  84. 'India':'印度',
  85. 'Ireland':'爱尔兰',
  86. 'Iran':'伊朗',
  87. 'Iraq':'伊拉克',
  88. 'Iceland':'冰岛',
  89. 'Israel':'以色列',
  90. 'Italy':'意大利',
  91. 'Jamaica':'牙买加',
  92. 'Jordan':'约旦',
  93. 'Japan':'日本',
  94. 'Kazakhstan':'哈萨克斯坦',
  95. 'Kenya':'肯尼亚',
  96. 'Kyrgyzstan':'吉尔吉斯斯坦',
  97. 'Cambodia':'柬埔寨',
  98. 'Korea':'韩国',
  99. 'Kosovo':'科索沃',
  100. 'Kuwait':'科威特',
  101. 'Lao PDR':'老挝',
  102. 'Lebanon':'黎巴嫩',
  103. 'Liberia':'利比里亚',
  104. 'Libya':'利比亚',
  105. 'Sri Lanka':'斯里兰卡',
  106. 'Lesotho':'莱索托',
  107. 'Lithuania':'立陶宛',
  108. 'Luxembourg':'卢森堡',
  109. 'Latvia':'拉脱维亚',
  110. 'Morocco':'摩洛哥',
  111. 'Moldova':'摩尔多瓦',
  112. 'Madagascar':'马达加斯加',
  113. 'Mexico':'墨西哥',
  114. 'Macedonia':'马其顿',
  115. 'Mali':'马里',
  116. 'Myanmar':'缅甸',
  117. 'Montenegro':'黑山',
  118. 'Mongolia':'蒙古',
  119. 'Mozambique':'莫桑比克',
  120. 'Mauritania':'毛里塔尼亚',
  121. 'Malawi':'马拉维',
  122. 'Malaysia':'马来西亚',
  123. 'Namibia':'纳米比亚',
  124. 'New Caledonia':'新喀里多尼亚',
  125. 'Niger':'尼日尔',
  126. 'Nigeria':'尼日利亚',
  127. 'Nicaragua':'尼加拉瓜',
  128. 'Netherlands':'荷兰',
  129. 'Norway':'挪威',
  130. 'Nepal':'尼泊尔',
  131. 'New Zealand':'新西兰',
  132. 'Oman':'阿曼',
  133. 'Pakistan':'巴基斯坦',
  134. 'Panama':'巴拿马',
  135. 'Peru':'秘鲁',
  136. 'Philippines':'菲律宾',
  137. 'Papua New Guinea':'巴布亚新几内亚',
  138. 'Poland':'波兰',
  139. 'Puerto Rico':'波多黎各',
  140. 'Dem. Rep. Korea':'朝鲜',
  141. 'Portugal':'葡萄牙',
  142. 'Paraguay':'巴拉圭',
  143. 'Qatar':'卡塔尔',
  144. 'Romania':'罗马尼亚',
  145. 'Russia':'俄罗斯',
  146. 'Rwanda':'卢旺达',
  147. 'W. Sahara':'西撒哈拉',
  148. 'Saudi Arabia':'沙特阿拉伯',
  149. 'Sudan':'苏丹',
  150. 'S. Sudan':'南苏丹',
  151. 'Senegal':'塞内加尔',
  152. 'Solomon Is.':'所罗门群岛',
  153. 'Sierra Leone':'塞拉利昂',
  154. 'El Salvador':'萨尔瓦多',
  155. 'Somaliland':'索马里兰',
  156. 'Somalia':'索马里',
  157. 'Serbia':'塞尔维亚',
  158. 'Suriname':'苏里南',
  159. 'Slovakia':'斯洛伐克',
  160. 'Slovenia':'斯洛文尼亚',
  161. 'Sweden':'瑞典',
  162. 'Swaziland':'斯威士兰',
  163. 'Syria':'叙利亚',
  164. 'Chad':'乍得',
  165. 'Togo':'多哥',
  166. 'Thailand':'泰国',
  167. 'Tajikistan':'塔吉克斯坦',
  168. 'Turkmenistan':'土库曼斯坦',
  169. 'East Timor':'东帝汶',
  170. 'Trinidad and Tobago':'特里尼达和多巴哥',
  171. 'Tunisia':'突尼斯',
  172. 'Turkey':'土耳其',
  173. 'Tanzania':'坦桑尼亚',
  174. 'Uganda':'乌干达',
  175. 'Ukraine':'乌克兰',
  176. 'Uruguay':'乌拉圭',
  177. 'United States':'美国',
  178. 'Uzbekistan':'乌兹别克斯坦',
  179. 'Venezuela':'委内瑞拉',
  180. 'Vietnam':'越南',
  181. 'Vanuatu':'瓦努阿图',
  182. 'West Bank':'西岸',
  183. 'Yemen':'也门',
  184. 'South Africa':'南非',
  185. 'Zambia':'赞比亚',
  186. 'Zimbabwe':'津巴布韦'
  187. }

View Code

 

  1. foreigh_rt = re.search('国外表格(.*)', home_rt, re.S).group(1)
  2. foreigh_data = re.findall('cityName"\>(.*?)\</p\>.*?cityQZ"\>(.*?)\</p\>.*?cityXZQZ"\>(.*?)\</p\>.*?citySWSJ"\>(.*?)\</p\>', foreigh_rt, re.S)
  3. foreigh_data = pd.DataFrame(foreigh_data)
  4. foreigh_data.columns = ['国家', '累计确诊', '新增', '累计死亡']
  5. foreigh_data[foreigh_data=='-'] = 0
  6. country_name = pd.DataFrame([nameMap.values(), nameMap.keys()]).T
  7. country_name.columns = ['国家', 'name']
  8. foreigh_data = pd.merge(foreigh_data, country_name, on='国家', how='outer') # 替换中文名字为英文
  9. foreigh_data = foreigh_data.fillna(0)
  10. indexes = list(foreigh_data.iloc[:, -1])
  11. foreigh_data = foreigh_data.drop(['国家', 'name'], axis=1)
  12. foreigh_data.index = indexes
  13. country_data = []
  14. for cou_i, coun_index in enumerate(foreigh_data.index):
  15. country_data.append([coun_index, int(foreigh_data.iloc[cou_i, 0])])
  16. country_data.append(['China', int(data.iloc[:, -1].sum())]) # 添加中国数据

 

  1. c = (
  2. Map(opts.InitOpts(width='800px', height='400px', bg_color='white'))
  3. .add("累计确诊", country_data, "world", is_map_symbol_show=False)
  4. .set_series_opts(label_opts=opts.LabelOpts(is_show=False)) # 不显示国家名字
  5. .set_global_opts(
  6. title_opts=opts.TitleOpts(title="世界新冠肺炎累计确诊热图", pos_left='center'),
  7. legend_opts=opts.LegendOpts(is_show=False),
  8. visualmap_opts=opts.VisualMapOpts(is_piecewise = True,
  9. pieces = [{"max": 1000, 'color': '#ffeead', 'label': '<1k'},
  10. {"min": 1000, "max": 50000, 'color': '#f29c2b', 'label': '1k~5w'},
  11. {"min": 50000, "max": 200000, 'color': '#d9534f', 'label': '5w-20w'},
  12. {"min": 200000, "max": 1000000, "color": '#F71E35', 'label': '20w-100w'},
  13. {"min": 1000000, 'color': '#C00000', 'label': '>100w'}])
  14. )
  15. )
  16. c.render_notebook()

 

 

版权声明:本文为jaysonteng原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/jaysonteng/p/12821088.html