疫情數據地理可視化
1. 示例圖
圖一:具體某天的全國確診病例可視化地圖
圖二:具體某天的全國確診病例可視化氣泡圖
圖三:具體某天的全國確診病例可視化氣泡圖(增加顏色維度,代表疑似病例),並增加地圖背景
2. 前期準備
2.1 python第三方庫
不多廢話,直接上正題,需要使用到的python第三方庫如下:
geopandas
(處理地理空間數據),pandas
(數據合併及處理),matplotlib
(出圖)
注意: 使用的編輯器是jupyter notebook,關於geopandas下載安裝建議在Anaconda裏的命令行使用conda指令進行,使用的三個庫的版本號爲:
import geopandas,matplotlib,pandas
print('geopandas使用的當前版本號:{}\n'.format(geopandas.__version__),
'matplotlib使用的當前版本號:{}\n'.format(matplotlib.__version__),
'pandas使用的當前版本號:{}'.format(pandas.__version__))
→ 輸出的結果爲:(由於存在着版本的不同,在調用的時候可能會出現warning警告,這個可以引入自帶的warning庫進行警告過濾。注意:警告不是報錯,不影響程序執行)
geopandas使用的當前版本號:0.6.1
matplotlib使用的當前版本號:3.1.3
pandas使用的當前版本號:1.0.3
import warnings
warnings.filterwarnings('ignore')
2.2 準備文件
第一份:疫情數據,手動整理官方渠道發佈的數據(時間起始爲:2020年1月22至2020年2月23日)
第二份:中國地圖(這裏使用是省市地圖json格式,也可以是shp格式,方便在地圖上顯示註解文字)
關於上面的兩份文件已經上傳至資源,有需要可以自行下載
3. 數據整理
3.1 數據文件導入
在最開始導入需要使用的第三方庫後,進行所需文件數據的讀取,包含了疫情數據和中國地圖數據
import warnings
warnings.filterwarnings('ignore')
# 設置不彈出警告
import pandas as pd
import geopandas as gpd
import matplotlib.pyplot as plt
df = pd.read_excel('virus_data.xlsx')
china_spatial = gpd.GeoDataFrame.from_file('chinadata.json')
print(df.head())
print(china_spatial.head())
→ 輸出的結果爲:(上面爲疫情數據,下面爲中國地圖數據)
區域編碼 省市 疑似 確診 死亡 date
0 110000 北京市 0 14 0 20200122
1 120000 天津市 0 4 0 20200122
2 130000 河北省 0 1 0 20200122
3 140000 山西省 1 1 0 20200122
4 150000 內蒙古自治區 0 0 0 20200122
name centerlng centerlat geometry
0 安徽省 117.226 31.8257 POLYGON ((119.62594 31.13353, 119.64401 31.114...
1 北京市 116.412 40.1844 POLYGON ((117.38359 40.22566, 117.37170 40.216...
2 福建省 117.981 26.0783 MULTIPOLYGON (((118.25399 24.44654, 118.27072 ...
3 甘肅省 100.612 37.8776 POLYGON ((104.29087 37.43066, 104.30275 37.415...
4 廣西壯族自治區 108.789 23.8206 MULTIPOLYGON (((107.15419 21.75961, 107.15774 ...
3.2 數據處理及某日數據提取
觀察date字段(時間)信息,發現並不是直接可以使用的,需要轉化爲時間序列,再進行數據的提取以及時間序列的分析(這裏只需要提取某一日的數據即可)
# 時間序列轉換
df['date'] = df['date'].astype('str') # 先將字段轉化爲字符串
df['date'] = pd.to_datetime(df['date']) # 再進行時間序列轉換
# 提取2020-2-1日數據
data_0201 = df[df['date'] == '2020-2-1']
data_0201.head()
→ 輸出的結果爲:(這一步清洗完了date時間字段的數據)
區域編碼 省市 疑似 確診 死亡 date
340 110000 北京市 0 183 1 2020-02-01
341 120000 天津市 112 45 0 2020-02-01
342 130000 河北省 104 104 1 2020-02-01
343 140000 山西省 64 56 0 2020-02-01
344 150000 內蒙古自治區 7 26 0 2020-02-01
根據輸出的結果可以發現,疫情數據和中國地圖數據中存在相同的字段,因此可以進行合併,構成繪製可視化地圖的數據
data_china0201 = pd.merge(china_spatial, data_0201, left_on = 'name', right_on = '省市', how = 'left')
del data_china0201['name'] # 刪除多餘字段,這裏存在重複字段,刪除一個
data_china0201 = data_china0201.sort_values(by = '疑似',ascending = False)
data_china0201.head()
→ 輸出的結果爲:(這一步形成的數據就可以直接繪製圖像了)
centerlng centerlat geometry 區域編碼 省市 疑似 確診 死亡 date
10 112.271 30.9752 POLYGON ((110.98875 33.25267, 111.02028 33.215... 420000 湖北省 14872 9074 294 2020-02-01
8 113.614 33.8815 POLYGON ((115.47751 36.14881, 115.47705 36.116... 410000 河南省 754 493 2 2020-02-01
11 111.709 27.6099 POLYGON ((113.93672 29.05043, 113.94089 29.021... 430000 湖南省 434 463 0 2020-02-01
30 107.875 30.0571 POLYGON ((109.58158 31.73005, 109.61777 31.713... 500000 重慶市 425 262 1 2020-02-01
4 108.789 23.8206 MULTIPOLYGON (((107.15419 21.75961, 107.15774 ... 450000 廣西壯族自治區 319 111 0 2020-02-01
4. 繪製圖形
4.1 疫情可視化地圖
第一步: 設置畫布大小
第二步:設置標題文字屬性
第三步:出圖(其中的參數除了選擇數據的外,幾乎都是圖像的屬性參數)
第四步:網格線(這裏建議在使用matplotlib時候直接把配置文件的屬性修改了),可以參考matplotlib配置參數修改
plt.figure(figsize=(20,20))
plt.title('2020-2-1 全國確診病例', fontsize = 20)
# 繪製疫情地圖
data_china0201.plot(ax=plt.subplot(1,1,1), alpha=1,edgecolor='k', linewidth = 0.5,
legend=True, scheme = 'FisherJenks', column='確診', cmap = 'Reds')
# 設置網格線
plt.grid(True,alpha=0.5)
→ 輸出的結果爲:(第一張圖基本出來了)
爲什麼選擇省市地圖數據,因爲地圖板塊劃分的較大,方便在地圖上進行文字註解,如果需要地級市的中國地圖資源,也可以(這個也上傳了),有需要可以自己下載
# 添加省市信息
lst = data_china0201[['省市','centerlng','centerlat','確診']].to_dict(orient = 'record')
print(lst[:5]) # 查看輸出結果
for i in lst:
plt.text(i['centerlng']-1, i['centerlat'], i['省市'] +':' + str(i['確診']))
→ 輸出的結果爲:(第一張圖完成)
4.2 疫情可視化氣泡圖
前面已經處理好的數據,這裏可以直接拿來用。不同的是,繪製氣泡圖之前需要有一個底圖(就是中國地圖),一般的話透明度要設置小一點,不然會遮擋住顯示的數據
plt.figure(figsize=(20,20))
plt.title('2020-2-1 全國確診病例', fontsize = 20)
# 繪製底圖
data_china0201.plot(ax=plt.subplot(1,1,1),
edgecolor='k', linewidth = 0.5, color = 'gray', alpha = 0.1)
# 添加氣泡圖
plt.scatter(data_china0201['centerlng'],data_china0201['centerlat'],
s = data_china0201['確診'], edgecolors='k', alpha = 0.8)
# 設置網格線
plt.grid(True,alpha=0.5)
# 添加省市信息
lst = data_china0201[['省市','centerlng','centerlat','確診']].to_dict(orient = 'record')
for i in lst:
plt.text(i['centerlng'], i['centerlat'], i['省市'] +':' + str(i['確診']))
→ 輸出的結果爲:(基本上沒有什麼變化,就是添加一個plt.scatter()繪製氣泡圖,其餘的和之前一樣,其中前兩個參數就是繪圖的x,y軸,s參數就代表這起泡的大小,最後兩個參數設置的是邊緣線顏色和透明度)
4.3 疫情可視化氣泡圖(增添顏色)
在數據處理的最後一步是將數據按照“疑似”字段的數據進行排序,就是爲了這裏將疑似病例的多少按照起泡顏色的深淺進行顯示。和上面代碼不同的地方就是在plt.scatter()中設置了c參數,用來顯示顏色
fig = plt.figure(figsize=(20,20))
plt.title('2020-2-1 全國確診病例', fontsize = 20)
fig.set_facecolor('lightsteelblue')
# 繪製底圖
data_china0201.plot(ax=plt.subplot(1,1,1),
edgecolor='k', linewidth = 0.5, color = 'gray', alpha = 0.5)
# 添加氣泡圖
plt.scatter(data_china0201['centerlng'],data_china0201['centerlat'], c = data_china0201['疑似'],
#cmap= ‘Reds’,
s = data_china0201['確診'], edgecolors='k', alpha = 0.8)
# 設置網格線
plt.grid(True,alpha=0.5)
# 添加省市信息
lst = data_china0201[['省市','centerlng','centerlat','確診']].to_dict(orient = 'record')
for i in lst:
plt.text(i['centerlng']-1, i['centerlat'], i['省市'] +':' + str(i['確診']),color = 'black',alpha = 0.8)
plt.axis('off')
小技巧: c參數一般配合cmap參數(顏色板樣式)使用,如果當前默認的顏色不符合自己的需求,想要進行改變顏色,可以查看cmap裏面提供了哪些可選的顏色參數,然後再進行設定,這裏使用默認的配色,故將cmap參數註釋。查看可選的cmap參數的方法
→ 輸出的結果爲:(最後一張圖完成)
5. 防槓處理
通過上面三張圖,可以發現地圖中並沒有南海的部分,如果進行地圖數據可視化,最後生成的圖像是要用來商用的或是進行期刊發表的,這裏建議進行南海地圖的添加,處理方式簡單粗暴,直接進行ps修圖
5.1 南海版圖
爲了避免圖像清晰度的問題,這裏推薦的是直接使用pyecharts官網上面代碼生成一箇中國地圖數據,這裏以0.5.11版本的爲例
from pyecharts import Map
value = [155, 10, 66, 78]
attr = ["福建", "山東", "北京", "上海"]
map = Map("全國地圖示例", width=1200, height=600)
map.add("", attr, value, maptype='china')
map
→ 輸出的結果爲:(可以看到右下角就有一個很清晰南海版圖,點擊右邊的下載按鈕就可以保存本地了)
5.2 圖形ps
第二張圖的基調和這個南海版圖的一致,這裏選擇第二圖進行處理,打開ps,分別導入兩個圖片,然後進行處理
補充一下matplotlib儲存圖片的方式(dpi代表輸出的圖像的分辨率),也可以直接截圖保存
plt.savefig(r'C:\Users\86177\Desktop\demo1.png',dpi =300)
最後將南海版圖轉移到已經生成的可視化地圖上即可
上面列舉第二個基調的圖形進行ps處理。如果是其他顏色的,在摳圖轉移之後,ps的右邊菜單欄有圖層選項設置,可以選擇圖層之間融合即可,比如拿第三張圖片進行圖形ps
6. 手動防爬蟲
碼字梳理不易,最近在網上看到了一些博客上直接爬蟲的文章,標題都是一樣的,爲了維護“知識產權”,無可奈何,設置“手動反爬蟲”提示
博客來源於CSDN作者lys_828,資源鏈接爲:https://editor.csdn.net/md?articleId=106363593