4-中國疫情示意圖
上篇是使用pyecharts繪制的中國疫情圖,今天采用大家都熟知的常用工具matplotlib工具來專心繪制此圖。到時候中國戰’疫’結束后,再來此博客查看,表達喜悅。
肯定會有那么一天,并且已經不會太久!!
導包
import time
import json
import requests
from datetime import datetime
import numpy as np
import matplotlib
import matplotlib.figure
from matplotlib.font_manager import FontProperties
from matplotlib.backends.backend_agg import FigureCanvasAgg
from matplotlib.patches import Polygon
from matplotlib.collections import PatchCollection
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
plt.rcParams['font.sans-serif'] = ['FangSong'] # 設置默認字體
plt.rcParams['axes.unicode_minus'] = False # 解決保存圖像時'-'顯示為方塊的問題
def catch_daily():
"""抓取每日確診和死亡數據"""
url = 'https://view.inews.qq.com/g2/getOnsInfo?name=wuwei_ww_cn_day_counts&callback=&_=%d'%int(time.time()*1000)
data = json.loads(requests.get(url=url).json()['data'])
data.sort(key=lambda x:x['date'])
date_list = list() # 日期
confirm_list = list() # 確診
suspect_list = list() # 疑似
dead_list = list() # 死亡
heal_list = list() # 治愈
for item in data:
month, day = item['date'].split('/')
date_list.append(datetime.strptime('2020-%s-%s'%(month, day), '%Y-%m-%d'))
confirm_list.append(int(item['confirm']))
suspect_list.append(int(item['suspect']))
dead_list.append(int(item['dead']))
heal_list.append(int(item['heal']))
return date_list, confirm_list, suspect_list, dead_list, heal_list
def catch_distribution():
"""抓取行政區域確診分布數據"""
data = {}
url = 'https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5&callback=&_=%d'%int(time.time()*1000)
for item in json.loads(requests.get(url=url).json()['data'])['areaTree'][0]['children']:
if item['name'] not in data:
data.update({item['name']:0})
for city_data in item['children']:
data[item['name']] += int(city_data['total']['confirm'])
return data
def plot_daily():
"""繪制每日確診和死亡數據"""
date_list, confirm_list, suspect_list, dead_list, heal_list = catch_daily() # 獲取數據
plt.figure('2019-nCoV疫情統計圖表', facecolor='#f4f4f4', figsize=(10, 8))
plt.title('2019-nCoV疫情曲線', fontsize=20)
plt.plot(date_list, confirm_list, label='確診')
plt.plot(date_list, suspect_list, label='疑似')
plt.plot(date_list, dead_list, label='死亡')
plt.plot(date_list, heal_list, label='治愈')
plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%m-%d')) # 格式化時間軸標注
plt.gcf().autofmt_xdate() # 優化標注(自動傾斜)
plt.grid(linestyle=':') # 顯示網格
plt.legend(loc='best') # 顯示圖例
plt.savefig('2019-nCoV疫情曲線.png') # 保存為文件
#plt.show()
def plot_distribution():
"""繪制行政區域確診分布數據"""
data = catch_distribution()
width = 1600
height = 800
rect = [0.1, 0.12, 0.8, 0.8]
lat_min = 0
lat_max = 60
lon_min = 77
lon_max = 140
'''全球等經緯投影模式使用以下設置,否則使用上面的對應設置
width = 3000
height = 1500
rect = [0, 0, 1, 1]
lat_min = -90
lat_max = 90
lon_min = 0
lon_max = 360
'''
handles = [
matplotlib.patches.Patch(color='#ffaa85', alpha=1, linewidth=0),
matplotlib.patches.Patch(color='#ff7b69', alpha=1, linewidth=0),
matplotlib.patches.Patch(color='#bf2121', alpha=1, linewidth=0),
matplotlib.patches.Patch(color='#7f1818', alpha=1, linewidth=0),
]
labels = [ '1-9人', '10-99人', '100-999人', '>1000人']
provincePos = {
"遼寧省":[121.7,40.9],
"吉林省":[124.5,43.5],
"黑龍江省":[125.6,46.5],
"北京市":[116.0,39.9],
"天津市":[117.0,38.7],
"內蒙古自治區":[110.0,41.5],
"寧夏回族自治區":[105.2,37.0],
"山西省":[111.0,37.0],
"河北省":[114.0,37.8],
"山東省":[116.5,36.0],
"河南省":[111.8,33.5],
"陜西省":[107.5,33.5],
"湖北省":[111.0,30.5],
"江蘇省":[119.2,32.5],
"安徽省":[115.5,31.8],
"上海市":[121.0,31.0],
"湖南省":[110.3,27.0],
"江西省":[114.0,27.0],
"浙江省":[118.8,28.5],
"福建省":[116.2,25.5],
"廣東省":[113.2,23.1],
"臺灣省":[120.5,23.5],
"海南省":[108.0,19.0],
"廣西壯族自治區":[107.3,23.0],
"重慶市":[106.5,29.5],
"云南省":[101.0,24.0],
"貴州省":[106.0,26.5],
"四川省":[102.0,30.5],
"甘肅省":[103.0,35.0],
"青海省":[95.0,35.0],
"新疆維吾爾自治區":[85.5,42.5],
"西藏自治區":[85.0,31.5],
"香港特別行政區":[115.1,21.2],
"澳門特別行政區":[112.5,21.2]
}
fig = matplotlib.figure.Figure()
fig.set_size_inches(width/100, height/100) # 設置繪圖板尺寸
axes = fig.add_axes(rect)
# 蘭博托投影模式,局部
# m = Basemap(projection='lcc', llcrnrlon=77, llcrnrlat=14, urcrnrlon=140, urcrnrlat=51, lat_1=33, lat_2=45, lon_0=100, ax=axes)
# 蘭博托投影模式,全圖
#m = Basemap(projection='lcc', llcrnrlon=80, llcrnrlat=0, urcrnrlon=140, urcrnrlat=51, lat_1=33, lat_2=45, lon_0=100, ax=axes)
# 圓柱投影模式,局部
#m = Basemap(llcrnrlon=lon_min, urcrnrlon=lon_max, llcrnrlat=lat_min, urcrnrlat=lat_max, resolution='l', ax=axes)
# 正射投影模式
# m = Basemap(projection='ortho', lat_0=36, lon_0=102, resolution='l', ax=axes)
# 全球等經緯投影模式,
m = Basemap(llcrnrlon=lon_min, urcrnrlon=lon_max, llcrnrlat=lat_min, urcrnrlat=lat_max, resolution='l', ax=axes)
m.etopo()
m.readshapefile('./china-shapefiles-master/china-shapefiles-master/china', 'province', drawbounds=True)
m.readshapefile('./china-shapefiles-master/china-shapefiles-master/china_nine_dotted_line', 'section', drawbounds=True)
m.drawcoastlines(color='black') # 洲際線
m.drawcountries(color='black') # 國界線
m.drawparallels(np.arange(lat_min,lat_max,10), labels=[1,0,0,0]) #畫經度線
m.drawmeridians(np.arange(lon_min,lon_max,10), labels=[0,0,0,1]) #畫緯度線
pset = set()
for info, shape in zip(m.province_info, m.province):
pname = info['OWNER'].strip('\x00')
fcname = info['FCNAME'].strip('\x00')
if pname != fcname: # 不繪制海島
continue
for key in data.keys():
if key in pname:
if data[key] == 0:
color = '#f0f0f0'
elif data[key] < 10:
color = '#ffaa85'
elif data[key] <100:
color = '#ff7b69'
elif data[key] < 1000:
color = '#bf2121'
else:
color = '#7f1818'
break
poly = Polygon(shape, facecolor=color, edgecolor=color)
axes.add_patch(poly)
pos = provincePos[pname]
text = pname.replace("自治區", "").replace("特別行政區", "").replace("壯族", "").replace("維吾爾", "").replace("回族", "").replace("省", "").replace("市", "")
if text not in pset:
x, y = m(pos[0], pos[1])
axes.text(x, y, text, fontsize=11, color='#00FFFF')
pset.add(text)
axes.legend(handles, labels, bbox_to_anchor=(0.5, -0.11), loc='lower center', ncol=4, prop=font_14)
axes.set_title("2019-nCoV疫情地圖", fontsize=14)
FigureCanvasAgg(fig)
fig.savefig('2019-nCoV疫情地圖2.png')
if __name__ == '__main__':
plot_distribution()
最終繪制圖例如下:
中國加油,武漢加油!!!
智能推薦
Matplotlib繪制機器學習中的判別分析示意圖
判別分析簡介 判別分析就是依據訓練樣本建立判別函數,借助判別函數對給定的新樣本數據做出類別歸屬的分類預測方法,是機器學習中的分類預測方法。 同樣,我們會通過判別函數對給定的一組新樣本做出分類歸屬的決策。 因此,將分類歸屬結果以可視化形式進行展示就顯得特別有意義,很重要哇。 Matplotlib編程實現 成品圖...
文獻插圖:在Unity中畫出360°全景視頻觀看示意圖
文獻插圖:在Unity中畫出全景視頻觀看示意圖 插圖說明 實現思路 操作步驟 創建場景 相機視錐體可視化 設置圖像顯示層級 實現效果 工程下載 插圖說明 在論文中需要畫出插圖,以說明全景視頻在觀看時的示意圖,類似于如下效果: 實現思路 創建兩個Sphere,設置其中一個球顯示效果為“透視”,另一個為“不透視”。“透視”球顯示全...
Python基礎03-對象的內存示意圖
前面我們了解了對象的基本組成,對"對象"有了一定的了解后,我們再深入探討------對象的內存 ################################################################################# 我們還是以昨天的例子為例: 定義兩個變量,一個變量名為a,一個變量名為b。 那么a和b的作用是不是也存放在了對象的里面呢...
GMT繪制研究區示意圖(圖中圖)
. . 數語記吾學,以備不時之需,若遇同仁愿得賜教。 . . GMT繪制青藏高原某湖泊 ,GMT中文手冊104頁已有詳細介紹,僅做部分修改。 inset begin 定義了小圖的位置位于大圖左下角(-DjBL),小圖區域的寬度為 3 厘米,高度為 3.6 厘米(+w3c/3.6c),并且相對大圖左下角偏移 0.1 厘米(+o0.1c)。同時還設置了小圖區域的背景色為白色(+gwhite),并繪制了...
猜你喜歡
freemarker + ItextRender 根據模板生成PDF文件
1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...
電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!
Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...
requests實現全自動PPT模板
http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...