征服json數據——數據可視化的一座孤島
前不久寫的那個,關於如何提取json格式數據地圖素材中的相關數據,來適應ggplot2場景下的數據框作圖,其實那個代碼寫的一直都沒有通用性。
導致我每做一一個需要使用json地圖素材的項目,都需要從新修改那個代碼,雖然每一次都能簡化不少,但是依然無法適用所有的json素材。
知道最近在leaflet社區瀏覽案例的時候,才發現大神已經提供了很好的json數據解析方案里,起碼有兩個(保守估計)以上的包可以完勝這個任務,而且是直接調用現成的函數,無需自己編寫方案。
瞬間感覺死磕在json上的時間都能再過一個五一小長假了。
以上所說的解決方案就是利用成熟的json介面(I/O)工具:
geojsonio包和rgdal包:
這兩個包可以在主流的空間格式數據之間進行無縫轉換。
下面以世界地圖為例,演示數據的轉換過程。
而且以上代碼還不能保證每次都好用,可能每遇到一個新的素材,隨著josn內部層級嵌套結構的變化,你都需要隨之更改代碼,工作量那是杠杠的~
可是如果你掌握了以下兩個工具,那麼josn數據操縱起來基本就沒煩惱了,就跟之前操縱shp數據一樣,這兩個工作就是將json直接導入成控制項格式數據,方便使用者進一步提取內部信息。
world_Map1<-geojson_read("world.json",what="sp") #geojsonio包導入nworld_Map2<-readOGR("world.json","OGRGeoJSON") #rgdal包導入n
world_Mapdata1<-world_Map1@data%>%.[,c("NAME","NAME_LONG","BRK_A3","POP_EST","GDP_MD_EST")]%>%rename(region=NAME)nworld_Mapdata1$id<-rownames(world_Mapdata1)nworld_MapdataPloygon1<-fortify(world_Map1)%>%left_join(.,world_Mapdata1[,c(6,1,4)])n
ggplot(world_Mapdata1,aes(map_id=region))+ngeom_map(aes(fill=POP_EST),map=world_MapdataPloygon1)+nexpand_limits(x=world_MapdataPloygon1$long,y=world_MapdataPloygon1$lat)+nscale_fill_gradient2(low="#33A15A",high="#BB0126",mid="#FCFFB7",midpoint=mean(world_Mapdata1$POP_EST))+ncoord_map("ortho",orientation=c(0,120,0))+nscale_y_continuous(breaks=(-6:6)*15) +nscale_x_continuous(breaks=(-12:12)*15)+ntheme_minimal()+ntheme(axis.text=element_blank(),axis.title=element_blank())n
一個案例應用(來自plotly官網社區,本來是用於展示plot_ly函數應用,這裡借用一下)
air <- read.csv(https://raw.githubusercontent.com/plotly/datasets/master/2011_february_us_airport_traffic.csv)nflights <- read.csv(https://raw.githubusercontent.com/plotly/datasets/master/2011_february_aa_flight_paths.csv)nflights$id <- seq_len(nrow(flights))n
CairoPNG("D:/world_map.png",1000,900)nshowtext.begin()nggplot()+ngeom_polygon(data=world_MapdataPloygon1,aes(x=long,y=lat,group=group),fill="grey95",col="grey")+ngeom_segment(data=flights,aes(x=start_lon,y=start_lat,xend=end_lon,yend=end_lat),col="red",size=.2)+ngeom_point(data=air,aes(x=long,y=lat,size=cnt),shape=21,fill="#D73434",col="grey",alpha = 0.5)+nscale_y_continuous(breaks=(-6:6)*15) +nscale_x_continuous(breaks=(-12:12)*15)+nscale_size_area(max_size=15)+ncoord_map("ortho",orientation=c(25,-100,0))+ntheme_minimal()+ntheme(axis.text=element_blank(),axis.title=element_blank())nshowtext.end()ndev.off()n
最新版的ggplot2中已經出現了一個新的圖層函數——geom_sf,專門用於處理空間數據格式,這樣算起來,ggplot系統中已經有至少三個可以處理空間數據的函數了,geom_polygongeom_mapgeom_sf(如果不算ggmap這種外接函數的話)。
R語言之所在主流數據可視化領域長盛不衰,也許就是靠著諸多愛好者源源不斷的貢獻能夠適應各種場景、各種需求和目的的應用解決方案,空間數據可視化是呈現數據可視化之美非常獨特的視角,可以說是上帝之眼~
倘若有一天,自己的水平和火候到了,一定要為R語言可視化領域貢獻一份微薄之力(雖然不知道能不能有這麼一天~_~)
地圖源數據在魔方學院qq群共享中下載:
聯繫方式:
wechat:ljty1991
Mail:578708965@qq.com 個人公眾號:數據小魔方(datamofang)團隊公眾號:EasyCharts
qq交流群:[魔方學院]553270834推薦閱讀:
※數據時間軸展開後的上帝視角(一):銀行年報數據的可視化
※流量結構分布圖——桑基圖(Sankey)
※可視化設計中的形式美法則