diff --git a/.idea/wuhan_2019-nCoV.iml b/.idea/wuhan_2019-nCoV.iml index cd37703..df82b1e 100644 --- a/.idea/wuhan_2019-nCoV.iml +++ b/.idea/wuhan_2019-nCoV.iml @@ -5,6 +5,13 @@ + + + + + + + diff --git a/README.MD b/README.MD index 6fb4a1b..1c5f854 100644 --- a/README.MD +++ b/README.MD @@ -4,8 +4,8 @@ - 数据获取与分析提取 - china_shapfiles - 地图基础数据 - - nCov_map_visualization - - 疫情数据可视化,包含全国疫情地图、世界疫情地图、主要省份疫情地、图全国疫情随时间变化图 + - nCov_basemap_visualization + - 疫情数据可视化,包含全国疫情地图、世界疫情地图、主要省份疫情地图、全国疫情随时间变化图 #### 1. 数据来源 - 数据来源,腾讯新闻:https://news.qq.com/zt2020/page/feiyan.htm @@ -22,4 +22,5 @@ - 中国截止目前累积数据、每日累积的数据(1月13日开始进行每日数据统计) #### 4. 数据可视化 - +- 方式1: +- 方式2:使用 basemap + matplotlib diff --git "a/basemap_matplotlib_\344\275\277\347\224\250\346\241\210\344\276\213/001_basemap_\347\273\230\345\210\266\344\270\226\347\225\214\345\234\260\345\233\276.py" "b/basemap_matplotlib_\344\275\277\347\224\250\346\241\210\344\276\213/001_basemap_\347\273\230\345\210\266\344\270\226\347\225\214\345\234\260\345\233\276.py" new file mode 100644 index 0000000..871614c --- /dev/null +++ "b/basemap_matplotlib_\344\275\277\347\224\250\346\241\210\344\276\213/001_basemap_\347\273\230\345\210\266\344\270\226\347\225\214\345\234\260\345\233\276.py" @@ -0,0 +1,28 @@ +# -*- coding:utf-8 -*- +# project_xxx\venv\Scripts python + +''' +Author: Felix +WeiXin: AXiaShuBai +Email: xiashubai@gmail.com +Blog: https://blog.csdn.net/u011318077 +Date: 2020/1/31 14:17 +Desc: +''' + +# 首先导入绘图包和地图包 +import matplotlib.pyplot as plt +from mpl_toolkits.basemap import Basemap + +# 第一步:设置图片大小及分辨率 +plt.figure(figsize=(16, 8), dpi=128) + +# 第二步:创建一个地图 +m = Basemap() + +# 第三步:绘制地图上的线条,比如海岸线,国界线 +m.drawcoastlines(linewidth=1,linestyle='solid',color='black') # 绘制海岸线 +m.drawcountries(linewidth=1,linestyle='solid',color='black') # 绘制国界线 + +# 第四步:显示图形 +plt.show() \ No newline at end of file diff --git "a/basemap_matplotlib_\344\275\277\347\224\250\346\241\210\344\276\213/002_basemap_\347\273\230\345\210\266\344\270\255\345\233\275\345\234\260\345\233\276_GADM\345\234\260\345\233\276\346\226\207\344\273\266.py" "b/basemap_matplotlib_\344\275\277\347\224\250\346\241\210\344\276\213/002_basemap_\347\273\230\345\210\266\344\270\255\345\233\275\345\234\260\345\233\276_GADM\345\234\260\345\233\276\346\226\207\344\273\266.py" new file mode 100644 index 0000000..3c36c15 --- /dev/null +++ "b/basemap_matplotlib_\344\275\277\347\224\250\346\241\210\344\276\213/002_basemap_\347\273\230\345\210\266\344\270\255\345\233\275\345\234\260\345\233\276_GADM\345\234\260\345\233\276\346\226\207\344\273\266.py" @@ -0,0 +1,38 @@ +# -*- coding:utf-8 -*- +# project_xxx\venv\Scripts python + +''' +Author: Felix +WeiXin: AXiaShuBai +Email: xiashubai@gmail.com +Blog: https://blog.csdn.net/u011318077 +Date: 2020/1/31 14:47 +Desc: +''' + +# 首先导入绘图包和地图包 +import matplotlib.pyplot as plt +from mpl_toolkits.basemap import Basemap + +# 第一步:设置图片大小及分辨率 +plt.figure(figsize=(16, 8), dpi=300) + +# 第二步:创建一个地图,设置经度纬度范围,只显示中国区域范围,projection选择投影模式 +m = Basemap(llcrnrlon=77, llcrnrlat=14, urcrnrlon=140, urcrnrlat=51, projection='lcc', lat_1=33, lat_2=45, lon_0=100) +# 读取中国行政区文件,使用国即组织GADM的地图文件,网站地址https://gadm.org/country +# 大陆,台湾,港澳地区文件是分开的,都要进行读取,并且藏南地区和一些岛屿未标注出来 +# 推荐使用案例003,网上已经整理好的中国地图文件 +m.readshapefile('../china_shapfiles/gadm36_CHN_shp/gadm36_CHN_1', 'china', drawbounds=True) +m.readshapefile('../china_shapfiles/gadm36_HKG_shp/gadm36_HKG_1', 'hkg', drawbounds=True) +m.readshapefile('../china_shapfiles/gadm36_MAC_shp/gadm36_MAC_1', 'mac', drawbounds=True) +m.readshapefile('../china_shapfiles/gadm36_TWN_shp/gadm36_TWN_1', 'twn', drawbounds=True) + +# m.readshapefile('../china_shapfiles/china-shapefiles-simple-version/china', 'china', drawbounds=True) + +# 上面使用读取了本地地图文件,就不需要使用basemap绘制海岸线和国界线了,避免混乱 +# 第三步:绘制地图上的线条,比如海岸线,国界线 +# m.drawcoastlines(linewidth=1,linestyle='solid',color='black') # 绘制海岸线 +# m.drawcountries(linewidth=1,linestyle='solid',color='black') # 绘制国界线 + +# 第四步:显示图形 +plt.show() \ No newline at end of file diff --git "a/basemap_matplotlib_\344\275\277\347\224\250\346\241\210\344\276\213/003_basemap_\347\273\230\345\210\266\344\270\255\345\233\275\345\234\260\345\233\276_GitHub\344\270\212\347\232\204\344\270\255\345\233\275\345\234\260\345\233\276\346\225\260\346\215\256.py" "b/basemap_matplotlib_\344\275\277\347\224\250\346\241\210\344\276\213/003_basemap_\347\273\230\345\210\266\344\270\255\345\233\275\345\234\260\345\233\276_GitHub\344\270\212\347\232\204\344\270\255\345\233\275\345\234\260\345\233\276\346\225\260\346\215\256.py" new file mode 100644 index 0000000..a2bf5ac --- /dev/null +++ "b/basemap_matplotlib_\344\275\277\347\224\250\346\241\210\344\276\213/003_basemap_\347\273\230\345\210\266\344\270\255\345\233\275\345\234\260\345\233\276_GitHub\344\270\212\347\232\204\344\270\255\345\233\275\345\234\260\345\233\276\346\225\260\346\215\256.py" @@ -0,0 +1,34 @@ +# -*- coding:utf-8 -*- +# project_xxx\venv\Scripts python + +''' +Author: Felix +WeiXin: AXiaShuBai +Email: xiashubai@gmail.com +Blog: https://blog.csdn.net/u011318077 +Date: 2020/1/31 15:31 +Desc: +''' +# 首先导入绘图包和地图包 +import matplotlib.pyplot as plt +from mpl_toolkits.basemap import Basemap + +# 第一步:设置图片大小及分辨率 +plt.figure(figsize=(16, 8), dpi=300) + +# 第二步:创建一个地图,设置经度纬度范围,只显示中国区域范围,projection选择投影模式,兰勃特投影 +m = Basemap(llcrnrlon=77, llcrnrlat=14, urcrnrlon=140, urcrnrlat=51, projection='lcc', lat_1=33, lat_2=45, lon_0=100) +# 读取中国行政区文件,使用GitHub上已经整理好的地图文件,drawbounds参数显示图形 +# 藏南区域和岛屿都有明显的标注,可以对比002结果,信息更加丰富,藏南更准确 +m.readshapefile('../china_shapfiles/china-shapefiles-simple-version/china', 'china', drawbounds=True) +# 九段线地图数据 +m.readshapefile('../china_shapfiles/china-shapefiles-simple-version/china_nine_dotted_line', 'china', drawbounds=True) + + +# 上面使用读取了本地地图文件,就不需要使用basemap绘制海岸线和国界线了,避免混乱 +# 第三步:绘制地图上的线条,比如海岸线,国界线 +# m.drawcoastlines(linewidth=1,linestyle='solid',color='black') # 绘制海岸线 +# m.drawcountries(linewidth=1,linestyle='solid',color='black') # 绘制国界线 + +# 第四步:显示图形 +plt.show() \ No newline at end of file diff --git "a/basemap_matplotlib_\344\275\277\347\224\250\346\241\210\344\276\213/004_basemap_\347\273\230\345\210\266\344\270\255\345\233\275\345\234\260\345\233\276\345\271\266\344\270\212\350\211\262.py" "b/basemap_matplotlib_\344\275\277\347\224\250\346\241\210\344\276\213/004_basemap_\347\273\230\345\210\266\344\270\255\345\233\275\345\234\260\345\233\276\345\271\266\344\270\212\350\211\262.py" new file mode 100644 index 0000000..3d8054a --- /dev/null +++ "b/basemap_matplotlib_\344\275\277\347\224\250\346\241\210\344\276\213/004_basemap_\347\273\230\345\210\266\344\270\255\345\233\275\345\234\260\345\233\276\345\271\266\344\270\212\350\211\262.py" @@ -0,0 +1,40 @@ +# -*- coding:utf-8 -*- +# project_xxx\venv\Scripts python + +''' +Author: Felix +WeiXin: AXiaShuBai +Email: xiashubai@gmail.com +Blog: https://blog.csdn.net/u011318077 +Date: 2020/1/31 16:38 +Desc: +''' +import matplotlib.pyplot as plt +from mpl_toolkits.basemap import Basemap +from matplotlib.patches import Polygon + +# 第一步:设置图片大小及分辨率 +plt.figure(figsize=(16, 8), dpi=300) + +# 第二步:创建一个地图,设置经度纬度范围,只显示中国区域范围,projection选择投影模式,兰勃特投影 +m = Basemap(llcrnrlon=77, llcrnrlat=14, urcrnrlon=140, urcrnrlat=51, projection='lcc', lat_1=33, lat_2=45, lon_0=100) +# 读取中国行政区文件,使用GitHub上已经整理好的地图文件,drawbounds参数显示图形 +# 藏南区域和岛屿都有明显的标注,可以对比002结果,信息更加丰富,藏南更准确 +m.readshapefile('../china_shapfiles/china-shapefiles-simple-version/china', 'china', drawbounds=True) +# 九段线地图数据 +m.readshapefile('../china_shapfiles/china-shapefiles-simple-version/china_nine_dotted_line', 'china_nine', drawbounds=True) + +# 第三步:上色 + +ax = plt.gca() + +for nshape, seg in enumerate(m.china): + poly = Polygon(seg, facecolor='red', edgecolor='black') + ax.add_patch(poly) + + + + +# 第四步:显示图形 +plt.show() + diff --git "a/nCov_basemap_visualization/2019-nCoV\347\226\253\346\203\205\345\217\230\345\214\226\346\227\266\351\227\264\345\233\276.png" "b/nCov_basemap_visualization/2019-nCoV\347\226\253\346\203\205\345\217\230\345\214\226\346\227\266\351\227\264\345\233\276.png" new file mode 100644 index 0000000..1ca8f5d Binary files /dev/null and "b/nCov_basemap_visualization/2019-nCoV\347\226\253\346\203\205\345\217\230\345\214\226\346\227\266\351\227\264\345\233\276.png" differ diff --git a/nCov_basemap_visualization/nCov_basemap_matplotlib_visual.py b/nCov_basemap_visualization/nCov_basemap_matplotlib_visual.py new file mode 100644 index 0000000..1dabf8f --- /dev/null +++ b/nCov_basemap_visualization/nCov_basemap_matplotlib_visual.py @@ -0,0 +1,57 @@ +# -*- coding:utf-8 -*- +# project_xxx\venv\Scripts python + +''' +Author: Felix +WeiXin: AXiaShuBai +Email: xiashubai@gmail.com +Blog: https://blog.csdn.net/u011318077 +Date: 2020/1/31 17:18 +Desc: +''' + +import matplotlib.pyplot as plt +from china_data_analysis import ChinaData + +# 显示中文和显示负号 +plt.rcParams['font.sans-serif'] = ['SimHei'] +plt.rcParams['axes.unicode_minus'] = False + +# 绘制画布和子图对象 +fig, ax1 = plt.subplots(figsize=(10, 6)) + +# 获取每日疫情数据,日期,确诊,疑似,死亡,治愈 +date_list, everyday_confirm, everyday_suspect, everyday_dead, everyday_heal = ChinaData().china_everyday_data() + +# 左Y轴绘制确诊和疑似病例曲线 +ax1.plot(date_list, everyday_confirm, lw=2, ls='--', marker='o', color='red', label='确诊') +ax1.plot(date_list, everyday_suspect, lw=2, ls='--', marker='o', color='orange', label='疑似') + +# 设置标题,XY轴标题,刻度 +ax1.set_title("2019-nCoV疫情变化时间图", fontsize=16) +ax1.set_xlabel("2020年1月", fontsize=16) +ax1.set_xticklabels(date_list, rotation=30) +ax1.set_ylabel(r"确诊及疑似人数", fontsize=16) +ax1.set_ylim(0, 16000) +# 显示网格线和显示图例 +plt.grid(which='major', axis='both', color='grey', linestyle='--', alpha=0.2) +plt.legend(loc='upper left', bbox_to_anchor=(0.3,1)) + + +# 右Y轴绘制死亡和治愈病例曲线,共用ax1的X轴 +ax2 = ax1.twinx() +ax2.plot(date_list, everyday_dead, lw=1, ls='--', marker='.', color='cyan', label='死亡') +ax2.plot(date_list, everyday_heal, lw=1, ls='--', marker='.', color='green', label='治愈') + +# 设置标题刻度 +ax2.set_ylabel(r"死亡及治愈人数", fontsize=16) +ax2.set_ylim(0, 400) +# 显示网格线和显示图例 +plt.grid(which='major', axis='both', color='grey', linestyle='--', alpha=0.2) +plt.legend(loc='upper center') + + +# 展示图形 +# plt.show() +# 保存图形为图片,第一个参数保存路径,第二个参数裁掉多余的空白部分 +plt.savefig('2019-nCoV疫情变化时间图.png', bbox_inches='tight') diff --git a/nCov_data_analysis/china_data_analysis.py b/nCov_data_analysis/china_data_analysis.py index 7a4c568..61071aa 100644 --- a/nCov_data_analysis/china_data_analysis.py +++ b/nCov_data_analysis/china_data_analysis.py @@ -12,7 +12,7 @@ import a_get_html -class WorldData(): +class ChinaData(): def __init__(self): self.ncovdata = a_get_html.nCovData() @@ -21,7 +21,7 @@ def __init__(self): def china_total_data(self): # 累积数据汇总(实际该累积数据包含其它国家的数据),chinaTotal键对应的值就是累积数据 chinaTotal = self.all_data['chinaTotal'] - print(chinaTotal) + # print(chinaTotal) return chinaTotal def china_everyday_data(self): @@ -38,15 +38,17 @@ def china_everyday_data(self): everyday_suspect.append(int(everyday['suspect'])) everyday_dead.append(int(everyday['dead'])) everyday_heal.append(int(everyday['heal'])) - print(date_list) - print(everyday_confirm) # 中国累积确诊数据少于上面chinaTotal累积数据 + # print(date_list) + # print(everyday_confirm) # 中国累积确诊数据少于上面chinaTotal累积数据 + return date_list, everyday_confirm, everyday_suspect, everyday_dead, everyday_heal + def main(self): self.china_total_data() self.china_everyday_data() if __name__ == '__main__': - world_data= WorldData() + world_data= ChinaData() world_data.main() diff --git a/nCov_data_analysis/city_data_analysis.py b/nCov_data_analysis/city_data_analysis.py index d9e90ae..bf0087a 100644 --- a/nCov_data_analysis/city_data_analysis.py +++ b/nCov_data_analysis/city_data_analysis.py @@ -9,6 +9,8 @@ Date: 2020/1/30 22:11 Desc: ''' +# 获取每个省份下各地级市详细数据,以湖北举例说明 +# 其它省份获取一样,若要全部获取,可以使用使用循环取出每一个省份,然后再取出每个省份下地级市的数据 import a_get_html @@ -19,11 +21,11 @@ def __init__(self): self.all_data = self.ncovdata.get_html_text() def hubei_total_data(self): - '''获取湖北省各城市累积数据''' + '''获取湖北省各地级市累积数据''' # areaTree对应的第一个数据就是中国,下面的children对应的就是每个省份的数据, # 第一个省份就是湖北省,湖北省下面的children就是每个地级市的数据,也是一个列表,列表里面是字典 areaTree = self.all_data['areaTree'][0]['children'][0]['children'] - print(areaTree) + # print(areaTree) city_name = list() city_total_confirm = list() city_total_suspect = list() @@ -39,7 +41,7 @@ def hubei_total_data(self): print(city_total_confirm) def hubei_today_data(self): - '''获取各国今日数据''' + '''获取湖北省各地级市今日数据''' areaTree = self.all_data['areaTree'][0]['children'] city_name = list() city_today_confirm = list()