如何用R語言和Python進(jìn)行空間數(shù)據(jù)可視化與數(shù)據(jù)地圖

本篇文章為大家展示了如何用R語言和Python進(jìn)行空間數(shù)據(jù)可視化與數(shù)據(jù)地圖,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。

公司主營業(yè)務(wù):網(wǎng)站設(shè)計、做網(wǎng)站、移動網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。成都創(chuàng)新互聯(lián)是一支青春激揚、勤奮敬業(yè)、活力青春激揚、勤奮敬業(yè)、活力澎湃、和諧高效的團隊。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團隊有機會用頭腦與智慧不斷的給客戶帶來驚喜。成都創(chuàng)新互聯(lián)推出祥云免費做網(wǎng)站回饋大家。

以前我一直覺得Python的繪圖工具與R語言ggplot2比起來,不夠優(yōu)雅,這也是我一直堅定的選擇使用R+ggplot2深入的學(xué)習(xí)數(shù)據(jù)可視化的原因,ggplot2在坐標(biāo)系的整合與兼容性和擴展性上確實技高一籌,所以ggplot2成了可視化的巨無霸,成了可視化界的微信,不僅自身生態(tài)日趨完善,而且還有眾多的開發(fā)者為其開發(fā)輔助功能包(你可以理解為依附于微信的小程序)。

最近偶然在學(xué)習(xí)Python可視化的過程中,了解到了geopandas,確實第一眼看著很眼熟,或許你第一眼就能把它與pandas聯(lián)系起來。的確,它跟pandas有著千絲萬縷的聯(lián)系,并且繼承了pandas的諸多高頻函數(shù)。而geo是什么鬼呢?

geo是地理信息系統(tǒng)的簡寫,geopandas是Python中用于處理空間地理信息數(shù)據(jù)的后起之秀(為什么是后起之秀呢,因為有個叫basemap的包,據(jù)說很難用,我還沒有深入了解過呢)。

今天要講解的主角是R語言中的sf包和Python中的geopandas庫。


為什么今天把geopandas和R語言空間數(shù)據(jù)可視化寫在一起,因為他們很巧合的用到了相同的地理信息處理技術(shù),無論是數(shù)據(jù)源的支持上、還是空間數(shù)據(jù)的結(jié)構(gòu)存儲還是投影設(shè)置上都是如此。

我以前寫過大量ggplot2空間數(shù)據(jù)可視化的文章,但是那些大多是基于shp數(shù)據(jù)源,和ggplot2中的geom_ploygon或者gemo_map函數(shù)來制作的。

對,你沒看錯,真的有這種操作~

如何用R語言和Python進(jìn)行空間數(shù)據(jù)可視化與數(shù)據(jù)地圖

shp數(shù)據(jù)源導(dǎo)入所依賴的maptools包已經(jīng)快要被遺棄了,而geom_ploygon、gemo_map函數(shù)所支持的數(shù)據(jù)結(jié)構(gòu)復(fù)雜難懂,無論是對于初學(xué)者還是老手們都是一種挑戰(zhàn),需要做大量的數(shù)據(jù)合并、轉(zhuǎn)換、匹配,在前期的數(shù)據(jù)處理上花費的時間和代碼量已經(jīng)遠(yuǎn)遠(yuǎn)超過了可視化的代碼量。

好在新技術(shù)總是不斷地出現(xiàn),數(shù)據(jù)源上json格式的數(shù)據(jù)為我們提供了更為便捷、高效、低廉的空間數(shù)據(jù)信息,而sf包則可以使用直觀易懂的Simple Features數(shù)據(jù)結(jié)構(gòu)來從新規(guī)整地圖數(shù)據(jù)源,使得過去需要分別準(zhǔn)備地理邊界屬性信息和地理邊界經(jīng)緯點信息來呈現(xiàn)地理空間信息數(shù)據(jù)結(jié)構(gòu)。

巧合的是,python中的geopandas用了同樣的 技術(shù)來簡化空間數(shù)據(jù)可視化的復(fù)雜度,其核心理念也是通過壓縮單個地理多邊形為一個Simple Features,使得所有的地理多邊形與其屬性信息嚴(yán)格對齊,行政一個呈現(xiàn)友好的帶有地理信息數(shù)據(jù)的數(shù)據(jù)框。

也許以上描述過于抽象,因為涉及到到的內(nèi)容比較深入,我實在是不知道該如何把這些內(nèi)容將的通俗易懂,接下來會使用圖片輔助演示。

R中制作地圖傳統(tǒng)的方式是使用geom_ploygon+maptools+shp數(shù)據(jù)

library(ggplot2)

library(plyr)

library(maptools)

#數(shù)據(jù)導(dǎo)入:

china_map<-readShapePoly("D:/R/rstudy/CHN_adm/bou2_4p.shp")

Warning message:   

#已經(jīng)開始提出警告了!

(替代方案,使用rgdal中的readORG函數(shù)或者sf包中的st_read函數(shù))

use rgdal::readOGR or sf::st_read

china_map1<-fortify(china_map)

#從SP(空間數(shù)據(jù)對象)中剝離地理多邊形邊界點信息和多邊形屬性信息

x<-china_map@data      

xs<-data.frame(id=row.names(x),x)  

china_map_data <- join(china_map1, xs, type = "full") 

#導(dǎo)入業(yè)務(wù)數(shù)據(jù)

province_city <- read.csv("D:/R/rstudy/Province/chinaprovincecity.csv") 

mydata <- read.csv("D:/R/rstudy/Province/geshengzhibiao.csv")

china_data <- join(china_map_data, mydata, type="full")

#可視化代碼:

ggplot(china_data,aes(long,lat))+

     geom_polygon(aes(group=group),fill="white",colour="grey60")+

     geom_point(data =province_city,aes(x = jd,y = wd),colour="red")+

     coord_map("polyconic")+ 

     theme_void()

如何用R語言和Python進(jìn)行空間數(shù)據(jù)可視化與數(shù)據(jù)地圖

過程何其辛苦!

為什么使用maptools+geom_ploygon技術(shù)組合這么辛苦呢,問題出在數(shù)據(jù)源上,如果你想要詳細(xì)了解maptools導(dǎo)入的空間信息結(jié)果以及goem_ploygon根據(jù)什么規(guī)則映射地圖信息,請看這一篇。

一篇小短文助你打開數(shù)據(jù)可視化的任督二脈!

我能告訴你的是,geom_ploygon制作地圖的時候,剝離了地理信息邊界點數(shù)據(jù)和多邊形屬性信息,所以你需要同時兼顧、處理兩個包含空間信息的數(shù)據(jù)框,如果是對不同區(qū)域進(jìn)行等值線映射,你還需要對這兩個數(shù)據(jù)框進(jìn)行合并操作。

而sf包則使用了新的、更為優(yōu)雅簡潔的空間信息呈現(xiàn)技術(shù)——Simple Features

以上便是使用shp+maptools+geom_ploygon技術(shù)的核心數(shù)據(jù)結(jié)構(gòu)概況,接下來我們會跟大家講解新技術(shù)組合下所支持的空間數(shù)據(jù)結(jié)構(gòu)。

sf包則也是同時支持shp數(shù)據(jù)源和json數(shù)據(jù)源

library("sf")

library("ggplot2")

china_map<-st_read("D:/R/rstudy/CHN_adm/bou2_4p.shp",stringsAsFactors=FALSE,quiet=TRUE)

Encoding(china_map$NAME)<-"GBK"

china_map<-st_read("D:/R/mapdata/State/china.geojson",stringsAsFactors=FALSE,quiet=TRUE)

如何用R語言和Python進(jìn)行空間數(shù)據(jù)可視化與數(shù)據(jù)地圖

如何用R語言和Python進(jìn)行空間數(shù)據(jù)可視化與數(shù)據(jù)地圖

如何用R語言和Python進(jìn)行空間數(shù)據(jù)可視化與數(shù)據(jù)地圖

####轉(zhuǎn)換編碼

st_crs(china_map)$epsg<-4267

st_crs(china_map)$proj4string<-"+proj=longlat +datum=NAD27 +no_defs"

china_map<-st_transform(china_map,3395)

#####合并數(shù)據(jù)

mydata<-data.frame(NAME=unique(china_map$NAME),value=runif(34,1,100))

china_map<-merge(china_map,mydata,by="NAME")

如何用R語言和Python進(jìn)行空間數(shù)據(jù)可視化與數(shù)據(jù)地圖

ggplot() +

  geom_sf(data=china_map,aes(fill=value))

如何用R語言和Python進(jìn)行空間數(shù)據(jù)可視化與數(shù)據(jù)地圖

所以使用sf提供的新技術(shù),制作數(shù)據(jù)地圖通常僅需以上幾步。任務(wù)量大大縮減。

而Python的geopandas包則也提供了相同的空間數(shù)據(jù)結(jié)構(gòu)處理技術(shù)。

import pandas as pd

import numpy as np

import geopandas as gp

import matplotlib.pyplot as plt

province_city = pd.read_csv("D:/R/rstudy/Province/chinaprovincecity.csv", encoding = 'gb18030') 

china_map=gp.GeoDataFrame.from_file("D:/R/rstudy/CHN_adm/bou2_4p.shp", encoding = 'gb18030')

china_map=gp.GeoDataFrame.from_file("D:/R/mapdata/State/china.geojson", encoding = 'gb18030')

如何用R語言和Python進(jìn)行空間數(shù)據(jù)可視化與數(shù)據(jù)地圖

如何用R語言和Python進(jìn)行空間數(shù)據(jù)可視化與數(shù)據(jù)地圖

geopandas包同時支持導(dǎo)入shp素材和json素材,導(dǎo)入之后得數(shù)據(jù)結(jié)構(gòu)與R語言中得sf導(dǎo)入之后得結(jié)構(gòu)是一致得,地理多邊形邊界點信息都被壓縮成了一個非常整齊的列表存儲,列表內(nèi)每一個單獨的子項目都代表著一個多邊形。

實際上導(dǎo)入之后,你可以看到它的結(jié)構(gòu)是一種特殊的帶有地理信息列的數(shù)據(jù)框。

geopandas.geodataframe.GeoDataFrame

這種格式數(shù)據(jù)框繼承了大多數(shù)pandas普通數(shù)據(jù)框的函數(shù)及屬性,可以直接針對其使用plot函數(shù)繪圖。

china_map.plot(figsize=(20,12))

如何用R語言和Python進(jìn)行空間數(shù)據(jù)可視化與數(shù)據(jù)地圖

其內(nèi)部數(shù)據(jù)結(jié)構(gòu)與sf包的數(shù)據(jù)結(jié)構(gòu)如出一轍。

我們可以給其指定一個數(shù)值變量,使得映射出來的地圖各區(qū)塊根據(jù)數(shù)值單獨填色。

china_map.plot(column="AREA",figsize=(20,12),cmap="Greens")

如果你想要在此圖層上添加另外一個散點圖層,則需設(shè)定兩個具有同樣投影信息的GeoDataFrame對象。

使用剛才導(dǎo)入的province_city數(shù)據(jù),將其合并進(jìn)china_map中去。

china_map=china_map.merge(province_city,left_on='NAME', right_on='province', how='left')

from shapely.geometry import Point

china_map["center"]=gp.GeoSeries([Point(x, y) for x, y in zip(china_map["jd"], china_map["wd"])])

如何用R語言和Python進(jìn)行空間數(shù)據(jù)可視化與數(shù)據(jù)地圖

china_map_ploygon=china_map[["AREA","NAME","geometry","class"]]

china_map_ploygon=china_map_ploygon

china_map_point=china_map[["AREA","NAME","center","class"]]

china_map_point=china_map_point.set_geometry('center')

如何用R語言和Python進(jìn)行空間數(shù)據(jù)可視化與數(shù)據(jù)地圖

###設(shè)置相同的投影:

china_map_ploygon.crs={'init': 'epsg:3395'}

china_map_point.crs  ={'init': 'epsg:3395'}

###地圖可視化過程:

base=china_map_ploygon.plot(column="AREA", edgecolor='black',figsize=(20,12),cmap="Greens")

china_map_point.plot(ax=base,marker='o',color='red',markersize=5)

如何用R語言和Python進(jìn)行空間數(shù)據(jù)可視化與數(shù)據(jù)地圖

最后讓我們再次看一下R語言中的sf數(shù)據(jù)對象和Pyhton中的geodatafame對象的對比。

如何用R語言和Python進(jìn)行空間數(shù)據(jù)可視化與數(shù)據(jù)地圖

上述內(nèi)容就是如何用R語言和Python進(jìn)行空間數(shù)據(jù)可視化與數(shù)據(jù)地圖,你們學(xué)到知識或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識儲備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

當(dāng)前題目:如何用R語言和Python進(jìn)行空間數(shù)據(jù)可視化與數(shù)據(jù)地圖
標(biāo)題鏈接:http://muchs.cn/article22/ijccjc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供虛擬主機、App設(shè)計、全網(wǎng)營銷推廣企業(yè)建站、營銷型網(wǎng)站建設(shè)電子商務(wù)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

小程序開發(fā)