今天這篇推文,我們繼續空間數據可視化的最後一個系列-類別插值(categorical-spatial-interpolation) 可視化繪製的推文教程,這期我們使用Python進行繪製,涉及的知識點如下:
(兩大知識點,其中還會涉及幾個小點知識,會明確指出)
sklearn.KNeighborsClassifier()終於這篇推文將機器學習和可視化完美的結合起來,即:機器學習處理數據,數據可視化技術展現、美化數據(以後的深度學習部分也會延續這個風格,只不過比重不同而已)。首先,我們給出我們今天的數據:散點數據和四川省的地圖文件,python讀取操作如下:
import pandas as pd
import numpy as np
from sklearn.neighbors import KNeighborsClassifier
data = pd.read_excel(r"sichuan_df_label.xlsx")
import geopandas as gpd
si_map = gpd.read_file(r"四川省.json")預覽如下:散點:地圖文件:
計算網格插值這一步之前的推文中已說了很多次,這次我們設置800x800的網格,邊界設置依據還是我們地圖文件的經緯度範圍,代碼如下:
bounds = si_map.total_bounds
grid_size = 800
grid_lon = np.linspace(bounds[0],bounds[2],grid_size)
grid_lat = np.linspace(bounds[1],bounds[3],grid_size)
xgrid, ygrid = np.meshgrid(grid_lon, grid_lat)
#將插值網格數據整理
df_grid =pd.DataFrame(dict(lon=xgrid.flatten(),lat=ygrid.flatten()))
df_grid.head()結果如下:接下來,我們就是使用機器學習技術在基於點數據屬性的基礎上構建分類模型,再將訓練好的模型應用到我們插值生成的數據上(儘量大白話,讓你們更加好理解)
構建knn類模型這一部分,我們將使用機器學習中最常用的sklearn包進行分類模型的構建及在新數據(網格插值數據)上的應用。詳細代碼如下:
from sklearn.neighbors import KNeighborsClassifier
neigh = KNeighborsClassifier(n_neighbors=100,weights="distance")
neigh_al = neigh.fit(X.values,y.values)這樣我們就構建了一個機器學習的分類模型了,其中KNeighborsClassifier的其他屬性,大家可以去sklearn 官網進行查看哈。接下來,我們將使用構建好的neigh_al模型應用在我們的插值數據上,代碼如下:
x_test = df_grid[["lon",'lat']].values
knn_result = neigh_al.predict(x_test)
knn_result
##
#array([2, 2, 2, ..., 1, 1, 1], dtype=int64)可以看到,我們已經對每一組數據生成相應的分類結果了,由於我們作圖還需使用到分類可能性數據,我們使用predict_proba方法計算其分類結果在不同類別上的可能性(最終的分類結果是取可能性最大的對應結果的)。
knn_result_pro = neigh_al.predict_proba(x_test)我們需要將結果保存,則需要對knn_result_pro結果進行操作,即篩選出每一個結果的最大值,這裡使用np.amax() 方法操作,代碼如下:
knn_result_pro_max = np.amax(knn_result_pro,axis=1)結果另存:
df_grid["knn_result"] = knn_result
df_grid["knn_result_pro"] = knn_result_pro_max
df_grid.head()
plotnine 可視化繪製使用分類模型將結果計算出,並規整完畢,接下來就可以進行可視化繪製了,這裡我們使用Plotnine 包進行繪製,代碼如下:
「散點分布圖:」
import plotnine
from plotnine import *
plotnine.options.figure_size = (5, 4.5)
point_map = (ggplot() +
geom_map(sichuan,fill='none',color='gray',size=0.4) +
geom_point(data,aes(x='lon',y='lat',color='label'),size=1) +
scale_color_cmap_d(name = "Dark2")+
xlim(97,109)+
ylim(25.8,34.5)+
scale_x_continuous(breaks=[98,100,102,104,106,108])+
scale_y_continuous(breaks=[26,28,30,32,34,36,38])+
labs(title="Map Charts in Python Exercise 03: Map point",
)+
#添加文本信息
annotate('text',x=97,y=35.3,label="processed map charts with plotnine",ha="left",
size=10)+
annotate('text',x=104.5,y=26,label="Visualization by DataCharm",ha="left",size=9)+
theme(
text=element_text(family="Roboto Condensed"),
#修改背景
panel_background=element_blank(),
axis_ticks_major_x=element_blank(),
axis_ticks_major_y=element_blank(),
axis_text=element_text(size=12),
axis_title = element_text(size=14),
panel_grid_major_x=element_line(color="gray",size=.5),
panel_grid_major_y=element_line(color="gray",size=.5),
))可視化結果如下:「插值網格可視化:」
import plotnine
from plotnine import *
plotnine.options.figure_size = (5, 4.5)
#mycolor = ["#1B9E77","#D95F02","#7570B3","#E7298A","#66A61E"]
knn_map_grid = (ggplot(data=knn_grid) +
geom_map(sichuan,fill='none',color='gray',size=0.4) +
aes(fill="knn_result")+
geom_tile(knn_grid,aes(x="lon",y="lat",color='knn_result',alpha="knn_result_pro"),size=.1,
show_legend={'alpha': False}) +
scale_color_cmap_d(name = "Dark2")+
xlim(97,109)+
ylim(25.8,34.5)+
scale_x_continuous(breaks=[98,100,102,104,106,108])+
scale_y_continuous(breaks=[26,28,30,32,34,36,38])+
labs(title="Map Charts in Python Exercise 03: Categorical Interpolation Grid",
)+
#添加文本信息
annotate('text',x=97,y=35.3,label="processed map charts with plotnine",ha="left",
size=10)+
annotate('text',x=104.5,y=26,label="Visualization by DataCharm",ha="left",size=9)+
theme(
text=element_text(family="Roboto Condensed"),
#修改背景
panel_background=element_blank(),
axis_ticks_major_x=element_blank(),
axis_ticks_major_y=element_blank(),
axis_text=element_text(size=12),
axis_title = element_text(size=14),
panel_grid_major_x=element_line(color="gray",size=.5),
panel_grid_major_y=element_line(color="gray",size=.5),
))
knn_map_grid可視化結果如下:這裡由於將類別(label)和可能性(pro)分別映射在color(顏色和)alpha(透明度),注意如下代碼(與ggplot2繪製有所不同):
(ggplot(data=knn_grid) +
geom_map(sichuan,fill='none',color='gray',size=0.4) +
aes(fill="knn_result")+
geom_tile(knn_grid,aes(x="lon",y="lat",color='knn_result',alpha="knn_result_pro"),size=.1,
show_legend={'alpha': False}) +若是採用類似ggplot2的映射理念繪圖,即採用如下代碼繪製:
ggplot() +
geom_map(sichuan,fill='none',color='gray',size=0.4) +
geom_tile(knn_grid,aes(x="lon",y="lat",color='knn_result',alpha="knn_result_pro"),size=.1,
show_legend={'alpha': False})得到的可視化結果如下:圖中紅框部分不能很好的表達圖表含義。
裁剪操作這一步也是說了很多次了,將模型預測結果轉換geopandas數據類型,再使用clip() 方法裁剪即可,我們直接給出繪圖代碼:
#繪圖
import plotnine
from plotnine import *
plotnine.options.figure_size = (5, 4.5)
#mycolor = ["#1B9E77","#D95F02","#7570B3","#E7298A","#66A61E"]
knn_map_grid_clip = (ggplot(data=knn_grid_clip) +
geom_map(sichuan,fill='none',color='gray',size=0.7) +
aes(fill="knn_result")+
geom_tile(knn_grid_clip,aes(x="lon",y="lat",color='knn_result',alpha="knn_result_pro"),size=.1,
show_legend={'alpha': False}) +
scale_color_cmap_d(name = "Dark2")+
xlim(97,109)+
ylim(25.8,34.5)+
scale_x_continuous(breaks=[98,100,102,104,106,108])+
scale_y_continuous(breaks=[26,28,30,32,34,36,38])+
labs(title="Map Charts in Python Exercise 03: Categorical Interpolation",
)+
#添加文本信息
annotate('text',x=97,y=35.3,label="processed map charts with plotnine",ha="left",
size=10)+
annotate('text',x=104.5,y=26,label="Visualization by DataCharm",ha="left",size=9)+
theme(
text=element_text(family="Roboto Condensed"),
#修改背景
panel_background=element_blank(),
axis_ticks_major_x=element_blank(),
axis_ticks_major_y=element_blank(),
axis_text=element_text(size=12),
axis_title = element_text(size=14),
panel_grid_major_x=element_line(color="gray",size=.5),
panel_grid_major_y=element_line(color="gray",size=.5),
))最終我們的可視化結果如下:注意:
由於以上數據的類別列(label)是直接隨機生成的,可能是連續性數值,所以在繪圖之前,需要添加如下類型轉換操作代碼:
knn_grid["knn_result"] = knn_grid["knn_result"].astype("object")
總結這一期的可視化繪製推文,我們加入了機器學習的內容(也算是機器學習相關的第一篇推文),原理性的東西我這邊儘量少介紹,我們關注的是實際應用,無論是可視化的數據處理、各個領域的應用等,希望這篇推文對大家的可視化設計或者機器學習等知識面都有所幫助。
如需聯繫EasyShu團隊
請加微信:EasyCharts
微信公眾號【EasyShu】博文代碼集合地址
https://github.com/Easy-Shu/EasyShu-WeChat
《Python數據可視化之美》-配套原始碼下載地址
https://github.com/Easy-Shu/Beautiful-Visualization-with-python
《R語言數據可視化之美》-增強版配套原始碼下載地址
https://github.com/Easy-Shu/Beautiful-Visualization-with-R