【python數據分析】繪製疫情可視化地圖、氣泡圖

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章