专栏名称: EasyCharts
EasyCharts,易图表,我们将定期推送各种数据可视化与分析教程,包括Excel(Power BI)、Origin、Sigmaplot、GraphPad、R、Python、Matlab、Tableau、D3.js等。
目录
相关文章推荐
前端早读课  ·  【3456期】7种在 JavaScript ... ·  9 小时前  
前端早读课  ·  【早阅】始终将你的估算值乘以π ·  昨天  
前端大全  ·  从 DeepSeek 看25年前端的一个小趋势 ·  3 天前  
前端早读课  ·  【第3455期】快手主站前端工程化探索:Gu ... ·  2 天前  
前端早读课  ·  【第3454期】如何用语音学习编程的 ·  3 天前  
51好读  ›  专栏  ›  EasyCharts

空间数据可视化与simple future模型应用

EasyCharts  · 公众号  · 前端  · 2019-10-12 16:14

正文



这是一篇关于关于空间地理信息数据可视化与simple feature 模型应用的笔记小结。

之前关于simple feature地理信息数据模型的分享已经有两篇了,这里会继续分享simple feature模型在构建 Point/MutiPoint、LineString/MutiString、Polygon/MutiPolygons。

Polygon/MutiPolygons的应用其实就是数据地图模型的新拓展,在R语言的ggplot2中使用geom_polygon图层函数制作数据地图,需要使用基于sp包的 SpatialPolygonsDataFrame模型,从中提取所需要的行政区划信息和地理特征信息结合业务数据合并,最终实现可视化需求。

simple feature模型构建了新的基于特征的空间地理信息数据存储格式,详细的介绍及其实现可以参考以下资源:

空间数据可视化笔记——simple features空间对象基础

左手用R右手Python系列12——空间数据可视化与数据地图

基于R语言sf包simple feature案例应用:

devtools::install_github("tidyverse/ggplot2")
#如果提示无geom_sf函数则需下载github上开发板的ggplot2
library("ggplot2")
library("magrittr")
library("reshape2")
library("ggthemes")
library('dplyr')
library("sf")

1、素材导入:

china_map3 "D:/R/mapdata/State/china.geojson",stringsAsFactors=FALSE) 
str(china_map3)
class(china_map3)
class(china_map3$geometry)


业务数据:

mydata   id = 1:34,
 name = china_map3$name,
 scale = runif(34,100,200) %>% round(),
 Scope = rep(LETTERS[1:5],length = 34)
)

将业务数据与地图数据合并

final_namdata2 1,3,4)],by = 'id')
final_namdata2 3857) #转换编码

连续型指标

ggplot() +
 geom_sf(data=final_namdata2,aes(fill = scale)) +
 coord_sf() +
 scale_fill_distiller(palette ='BrBG' ) +
 theme_void()


离散指标

ggplot() +
 geom_sf(data=final_namdata2,aes(fill=Scope)) +
 coord_sf() +
 scale_fill_brewer(palette ='BrBG' ) +
 theme_void()


点图(point):

province_city "D:/R/rstudy/Province/chinaprovincecity.csv") 

cities "北京","上海","天津","重庆","沈阳","呼和浩特","太原","郑州","西安","兰州","合肥","南京","杭州","长沙","武汉")
map_point "jd", "wd")) %>% filter(city %in% cities)
st_crs(map_point) = 4326 #设置投影信息str(map_point)
class(map_point)
class(map_point$geometry)

叠加散点图

ggplot() +
 geom_sf(data=final_namdata2, aes(fill = Scope),alpha = .3) +
 geom_sf(data=map_point,aes(colour = class,size=zhibiao)) +
 coord_sf() +
 scale_fill_brewer(palette ='BrBG' ) +
 scale_colour_wsj() +
 theme_void()

线图(line):

mutiline_data 28),group = rep(NA,28))
mutiline_data$group 1:14,each = 2)
for (i in 1:28){
 if (i%%2) {
   mutiline_data$city[i] = '郑州'
 } else {
   mutiline_data$city[i] = cities[cities!='郑州'][i/2]
 }
}

转换为sf特有的LINESTRING格式

mutiline_data "city"




    
,"jd","wd")],by = "city") %>% 
 st_as_sf(coords = c("jd", "wd")) %>%
 group_by(group) %>%
 summarize() %>%
 st_cast("LINESTRING")

str(mutiline_data)
class(mutiline_data)
class(mutiline_data$geometry)

st_crs(mutiline_data) 4326 #设置地理信息投影
ggplot() +
 geom_sf(data = final_namdata2, aes(fill = Scope),alpha = .3) +
 geom_sf(data = mutiline_data,aes(group = group),colour = "black",size = .8) +
 geom_sf(data = map_point,aes(colour = class,size=zhibiao)) +
 coord_sf() +
 scale_fill_brewer(palette ='BrBG' ) +
 scale_colour_wsj() +
 theme_void()
 




基于Python GeoDataFrame包的simple feature应用实现:


Polygon:

from shapely.geometry
import Point,LineString
import geopandas
from matplotlib.colors
import LinearSegmentedColormap
from matplotlib import pyplot as plt
import pandas as pd
import numpy  as np
import string
China_map = geopandas.GeoDataFrame.from_file("D:/R/mapdata/State/china.geojson", encoding = 'gb18030')
China_map = China_map.to_crs({'init': 'epsg:4326'})

业务数据:

mydata = pd.DataFrame({
 "id":range(1,35),
 "name":China_map["name"],
 "scale":np.random.randint(100,200,34),
 "Scope":list(string.ascii_uppercase[:5])*6 + list(string.ascii_uppercase[:4])
},columns = ["id","name","scale","Scope"])

将业务数据与地图数据合并

final_namdata = China_map.set_index('id').join(mydata.loc[:,["id","scale","Scope"]].set_index('id'))
final_namdata.plot(column='scale',cmap=plt.get_cmap("BrBG"),figsize=(20,10), legend = True);
plt.gca().xaxis.set_major_locator(plt.NullLocator())
plt.gca().yaxis.set_major_locator(plt.NullLocator())
plt.legend(labels = ['a', 'b'], loc = 'best')


Points:

province_city = pd.read_csv("D:/R/rstudy/Province/chinaprovincecity.csv",encoding = "gbk") 
cities = ["北京","上海","天津","重庆","沈阳","呼和浩特","太原","西安","兰州","合肥","南京","杭州","长沙","武汉"]
gd_Point = geopandas.GeoDataFrame(
   data = {
   "division":province_city["city"],
   "class":province_city["class"],
   "scale":province_city["zhibiao"]
   },
   geometry=[Point(i,j) for i,j in zip(province_city["jd"],province_city["wd"])]
)
gd_Point.crs = {'init': 'epsg:4326'}
base1 = final_namdata.plot(column='scale',cmap=plt.get_cmap("BrBG"),figsize=(20, 10),legend = True)
gd_Point.plot(ax = base1,column ="scale", marker='o')
plt.scatter(province_city['jd'],province_city['wd'],s = province_city['zhibiao'],c=province_city['zhibiao'],alpha=0.6)


LineStrings:

line_data = pd.DataFrame({
   "start_city":["郑州"]*14,
   "end_city":cities,
   "s_jd":list(province_city.loc[province_city.city == "郑州",'jd'])*14,
   "s_wd":list(province_city.loc[province_city.city == "郑州",'wd'])*14,
   "jd":province_city.loc[province_city.city.isin(cities),'jd'],
   "wd":province_city.loc[province_city.city.isin(cities),'wd']
},columns = ["start_city","end_city","s_jd","s_wd","jd","wd"])
line_data = geopandas.GeoDataFrame(
   data = line_data.iloc[:,:2],
   geometry=[LineString([tuple(line_data.iloc[j,2:4]),tuple(line_data.iloc[j,4:6])]) for j in range(14)]
)
line_data.crs = {'init': 'epsg:4326'}
base1 = final_namdata.plot(column='scale',cmap=plt.get_cmap("BrBG"),figsize=(20, 10),legend = True)
line_data.plot(ax = base1,figsize=(20,10))







请到「今天看啥」查看全文