Python-Plotnine包: 類別插值地圖

2021-02-20 EasyShu

今天這篇推文,我們繼續空間數據可視化的最後一個系列-類別插值(categorical-spatial-interpolation) 可視化繪製的推文教程,這期我們使用Python進行繪製,涉及的知識點如下:

sklearn.KNeighborsClassifier()機器學習應用

(兩大知識點,其中還會涉及幾個小點知識,會明確指出)

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

相關焦點

  • Python-plotnine 核密度空間插值可視化繪製
    大多人還是採用pip安裝geopandas以及其依賴包,可以自行查看官網下載依賴包即可。讀取geojson 地圖文件、散點數據及基礎繪圖代碼如下:散點數據預覽如下:>gaussian_kde()插值處理這裡直接給出代碼,如下:#生成插值網格#導入核密度估計包import scipy.stats as st#根據獲取的地圖文件範圍設置插值網格的大小範圍xmin = js_box[0]xmax = js_box[2
  • plotnine: Python版的ggplot2作圖庫
    通過plotnine這個庫,你就可以在python世界中體驗下R語言的新奇感,體驗可視化之美,如果著迷上癮,再學R也不遲。plotnine包,可以實現絕大多數ggplot2的繪圖功能,兩者語法十分相似,R和Python的語法轉換成本大大降低。
  • Python可視化43|plotnine≈Python版ggplot2
    plotnine是圖層圖形語法(The Grammar of Graphics)在python中的實現,是ggplot2的python版,使用方法和ggplot2幾乎一樣。本文將「基於圖層圖形語法(The Grammar of Graphics)系統介紹plotnine,不糾結某一個具體圖某一個參數,力爭全局把握。」
  • 推薦: 一本「高顏值」的Python語言數據可視化圖書
    所以很有必要系統性地介紹python的繪圖語法系統,包括最基礎也最常用的matplotlib包、常用於統計分析的seaborn、最新出現類似R ggplot2語法的plotnine以及用於地理空間數據可視化的basemap包。在先介紹數據可視化基礎理論後,本書系統性地介紹了幾乎所有常見的二維和三維圖表的繪製方法,包括簡單的柱形圖系列、條形圖系列、折線圖系列,地圖系列等。
  • 在Python中使用ggplot2風格及語法: plotnine與ggplot|可視化系列05
    Hadley Wickham編寫的ggplot2 在R語言中聲名遠揚,使得統計數據可視化能力成為R語言的一大優勢(這位大神還寫了dplyr、tidyr等影響深遠的R包)。繪圖基礎因為plotnine和ggplot兩個庫都對標R的ggplot2庫,他們大部分語句寫法相同,本文不使用from plotnine import * 的寫法,而是採用加前綴的寫法import plotnine as pn,通過pn.ggplot()和gg.ggplot()的寫法區分和對比兩個庫。
  • Python語言plotnine VS R語言ggplot2
    相對於R中的基礎可視化包,是基於圖形語法的繪圖包,一經提出就迅速受到廣大R語言使用者的喜愛。ggplot2包利用圖層疊加的繪圖方式,往圖像上不斷的添加圖形元素、注釋、統計結果等內容。plotnine庫可以看作是在Python中對ggplot2包的一種實現,方便Python對數據可視化的應用。本文章會分別介紹在R和Python中,如何使用相關的庫進行數據可視化分析。
  • python數據分析專題 (7):python數據分析模塊
    可以利用這種數組對整塊數據執行一些數學運算,比python自帶的數組以及元組效率更高,其語法跟變量元素之間的運算一樣,無需進行循環操作。在使用python進行數據分析的過程中,我們大部分時候是不會直接使用numpy包,而是其他包要用到numpy。可以說numpy是整個python數據分析工作的基石。
  • 基於Python等語言的Kriging、IDW空間插值對比分析
    故本文將對Matlab的地圖白化絕口不提,畢竟當年我真的沒搞明白如何利用m_map工具箱。1 我的m_map學習成果:註:我未能學到精髓,不敢班門弄斧耍大刀。2 MeteoInfo的idw插值:註:MeteoInfo的Kriging模塊尚未添加。
  • python可視化庫大全
    其它的可視化庫諸如:seaborn、pyecharts、ggplot、plotnine、holoviews、basemap、altair、pyqtgraph、pygal、vispy、networkx、plotly、bokeh、geoplotlib、folium、gleam、vincent、mpld3、python-igraph、missingno、mayavi2
  • 插值
    註:本篇就談一下多項式插值,對其他插值方法感興趣的小夥伴後臺回復「插值」獲取資源。二.多項式插值    所謂的多項式插值就是利用n個數據點構造一個n-1次多項式。(xx,f(xx),'k',lw=2,label="函數$f(x)=1/(1+20*x^2)$")n=13x,p=f_interpolate(n)ax.plot(x,f(x),'ro')ax.plot(xx,p(xx),'r',label='%d次多項式插值'% n)n=14x,p=f_interpolate(n)ax.plot(x,f(x),'go')ax.plot(xx,p(xx
  • 使用Python和R繪製數據地圖的十七個經典案例
    我還列出了資源,以便你可以了解每個教程中突出顯示的每個包以及進一步的用戶分析,從而獲得更多的靈感。 前言 為了探索目的而創建一個簡單的地圖不再需要你學習如何操作shapefile或想像投影。並且,無論你喜歡在R或Python,都有快速和簡單的方法把你的數據展現在地圖上。
  • R-plot3D包: 三維圖表繪製手冊(1)
    1.1.1 DEM地形圖require(plot3D)# 三維地圖模型可視化class(volcano)[1] 「matrix」dim(volcano)[1] 87 61z <- 3 * volcano  # 放大高度坐標x <- 10 * (1:nrow(z))
  • 三氯化六氨合鈷綜合實驗的python自動化作圖方法
    本學期的有機實驗終於過去,終於可以好好鼓搗一下python能大顯身手的實驗了,前面幾個分析和生化實驗也沒啥好作圖的,不過無機和物化裡面用到線性擬合圖像以及其他圖像的地方還是非常多總之,所有的」origin作圖「,理論上全都可以用python代替,origin的優勢在於拿起就能做,而python的優勢在於一勞永逸1.
  • 木蘭重生:與 Python 生態的兼容問題;字符串插值 - OSCHINA - 中文...
    1.1 元組 (tuple)python 中很常用的結構,可以如下初始化:>>> t = (1,2)>>> t(1, 2)>>> t = 2, 3>>> t(2, 3) 但木蘭中好像沒找到類似的簡便方法。
  • 數模筆記——數據的插值、擬合
    插值分類:平面插值(一維插值):最近鄰算法插值、拉格朗日插值算法空間插值(二維插值):雙線性內插算法、三次樣條插值地理學中的插值算法:克裡金插值、反距離權重插值算法 三、模型的使用流程(1)輸入已知數據,x,y(2)輸入待插自變量的值x1x=1:12;y=[5 8 9 15 25 29 31 30 22 25 27 24];x1=1:0.1:12;t=interp1(x,y,x1,'spline');%plot(x1,t,'r:')   %作圖xlabel('x軸的標籤'
  • Matlab曲線擬合和插值
    2、函數插值  一維插值: interp1(x,y,cx,’method』)  一維插值: interp1(x,y,z,cx,cy,’method』)method:nearest、linear、spline、cubic例:clearecho onx=-2:0.4:2;y=[2.8
  • Python 腳本案例:為流域插值雨量計
    您可以通過python解決幾乎任何問題。PCSWMM腳本繼承了IronPython的優點和局限性。IronPython支持的所有庫都可以在PCSWMM的腳本中使用。IronPython目前不支持帶有C擴展名的庫,比如numpy、scipy和matplotlib。但是,相似的功能可以在. net庫中找到,. net庫是受支持的。
  • python-數據分布型圖表-箱形圖系列-多數據系列箱形圖
    >df = pd.read_csv(data_url)多數據系列的箱型圖import pandas as pdimport numpy as npimport seaborn as snsimport matplotlib.pyplot as pltfrom plotnine