专栏名称: EasyCharts
EasyCharts,易图表,我们将定期推送各种数据可视化与分析教程,包括Excel(Power BI)、Origin、Sigmaplot、GraphPad、R、Python、Matlab、Tableau、D3.js等。
目录
相关文章推荐
奇舞精选  ·  Chrome 129:正式推出原生的 ... ·  昨天  
前端早读课  ·  【第3388期】React 组件设计-避免条件渲染 ·  2 天前  
前端大全  ·  这个 JavaScript API ... ·  3 天前  
前端早读课  ·  【早阅】VoidZero Inc.:下一代 ... ·  1 周前  
NE时代新能源  ·  【NE云之声】为了做好电驱耐久,智新科技竟然 ... ·  1 周前  
51好读  ›  专栏  ›  EasyCharts

案例是最好的学习方式——教你如何优雅的操纵json数据地图素材

EasyCharts  · 公众号  · 前端  · 2017-05-20 15:58

正文

前不久写的那个,关于如何提取json格式数据地图素材中的相关数据,来适应ggplot2场景下的数据框作图,其实那个代码写的一直都没有通用性。


导致我每做一一个需要使用json地图素材的项目,都需要从新修改那个代码,虽然每一次都能简化不少,但是依然无法适用所有的json素材。


知道最近在leaflet社区浏览案例的时候,才发现大神已经提供了很好的json数据解析方案里,起码有两个(保守估计)以上的包可以完胜这个任务,而且是直接调用现成的函数,无需自己编写方案。


瞬间感觉死磕在json上的时间都能再过一个五一小长假了。


以上所说的解决方案就是利用成熟的json接口(I/O)工具:


geojsonio包和rgdal包:


这两个包可以在主流的空间格式数据之间进行无缝转换。


下面以世界地图为例,演示数据的转换过程。


library("jsonlite")

library("ggplot2")

library(plyr)

library(dplyr)

library(geojsonio)

library(rgdal)


如果还是停留在使用jsonlite包手工提取数据时代,你可能需要经历以下不可描述的代码环节:


setwd("D:/R/mapdata/State")

###

world_data

world_city_data

world_city_data

world_data$features$geometry$coordinates[[1]][,,1]

world_data$features$geometry$coordinates[[1]][,,2]


###


而且以上代码还不能保证每次都好用,可能每遇到一个新的素材,随着josn内部层级嵌套结构的变化,你都需要随之更改代码,工作量那是杠杠的~


可是如果你掌握了以下两个工具,那么josn数据操纵起来基本就没烦恼了,就跟之前操纵shp数据一样,这两个工作就是将json直接导入成控件格式数据,方便使用者进一步提取内部信息。



world_Map1

world_Map2#rgdal包导入



world_Mapdata1%.[,c("NAME","NAME_LONG","BRK_A3","POP_EST","GDP_MD_EST")]%>%rename(region=NAME)

world_Mapdata1$id

world_MapdataPloygon1%left_join(.,world_Mapdata1[,c(6,1,4)])


ggplot(world_Mapdata1,aes(map_id=region))+

geom_map(aes(fill=POP_EST),map=world_MapdataPloygon1)+

expand_limits(x=world_MapdataPloygon1$long,y=world_MapdataPloygon1$lat)+

scale_fill_gradient2(low="#33A15A",high="#BB0126",mid="#FCFFB7",midpoint=mean(world_Mapdata1$POP_EST))+

coord_map("ortho",orientation=c(0,120,0))+

scale_y_continuous(breaks=(-6:6)*15) +

scale_x_continuous(breaks=(-12:12)*15)+

theme_minimal()+

theme(axis.text=element_blank(),axis.title=element_blank())



一个案例应用(来自plotly官网社区,本来是用于展示plot_ly函数应用,这里借用一下)


air

flights

flights$id



CairoPNG("D:/world_map.png",1000,900)

showtext.begin()

ggplot()+

geom_polygon(data=world_MapdataPloygon1,aes(x=long,y=lat,group=group),fill="grey95",col="grey")+

geom_segment(data=flights,aes(x=start_lon,y=start_lat,xend=end_lon,yend=end_lat),col="red",size=.2)+

geom_point(data=air,aes(x=long,y=lat,size=cnt),shape=21,fill="#D73434",col="grey",alpha = 0.5)+

scale_y_continuous(breaks=(-6:6)*15) +

scale_x_continuous(breaks=(-12:12)*15)+

scale_size_area(max_size=15)+

coord_map("ortho",orientation=c(25,-100,0))+

theme_minimal()+

theme(axis.text=element_blank(),axis.title=element_blank())

showtext.end()

dev.off()



最新版的ggplot2中已经出现了一个新的图层函数——geom_sf,专门用于处理空间数据格式,这样算起来,ggplot系统中已经有至少三个可以处理空间数据的函数了,geom_polygon\geom_map\geom_sf(如果不算ggmap这种外接函数的话)。


R语言之所在主流数据可视化领域长盛不衰,也许就是靠着诸多爱好者源源不断的贡献能够适应各种场景、各种需求和目的的应用解决方案,空间数据可视化是呈现数据可视化之美非常独特的视角,可以说是上上帝之眼~


倘若有一天,自己的水平和火候到了,一定要为R语言可视化领域贡献一份微薄之力(虽然不知道能不能有这么一天~_~)


地图源数据在魔方学院qq群共享中下载:


欢迎关注魔方学院QQ群