溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發(fā)布時間:2021-10-11 17:52:33 來源:億速云 閱讀:233 作者:柒染 欄目:大數(shù)據(jù)

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

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

最近偶然在學習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ù)據(jù)源的支持上、還是空間數(shù)據(jù)的結構存儲還是投影設置上都是如此。

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

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

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

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

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

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

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

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

library(ggplot2)

library(plyr)

library(maptools)

#數(shù)據(jù)導入:

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") 

#導入業(yè)務數(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進行空間數(shù)據(jù)可視化與數(shù)據(jù)地圖

過程何其辛苦!

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

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

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

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

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

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進行空間數(shù)據(jù)可視化與數(shù)據(jù)地圖

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

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

####轉換編碼

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進行空間數(shù)據(jù)可視化與數(shù)據(jù)地圖

ggplot() +

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

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

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

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

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進行空間數(shù)據(jù)可視化與數(shù)據(jù)地圖

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

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

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

geopandas.geodataframe.GeoDataFrame

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

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

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

其內部數(shù)據(jù)結構與sf包的數(shù)據(jù)結構如出一轍。

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

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

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

使用剛才導入的province_city數(shù)據(jù),將其合并進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進行空間數(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進行空間數(shù)據(jù)可視化與數(shù)據(jù)地圖

###設置相同的投影:

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進行空間數(shù)據(jù)可視化與數(shù)據(jù)地圖

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

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

上述內容就是如何用R語言和Python進行空間數(shù)據(jù)可視化與數(shù)據(jù)地圖,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內容。

AI