减少 shp map choropleth 的处理时间
Decreasing processing time for shp map choropleth
我正在制作一张来自阿根廷的等值线图,我将在其中绘制一些数据。
我可以毫无问题地张贴地图并在上面绘制一些数据。例如像这样:
问题是我认为 R 渲染地图的质量太高(我不需要)并且处理时间很长。 (约 3 分钟)显示该等值线。这是我使用的代码。
arg_shp <- readOGR("ARG_adm_shp/ARG_adm1.shp", "ARG_adm1")
puntos <- read.csv("puntos.csv", sep = ",", header = T)
arg_pv <- fortify(arg_shp, region = "NAME_1")
gg <- ggplot()
gg <- gg + geom_map(data=arg_pv, map=arg_pv,
aes(long, lat, map_id=id),
color="#2b2b2b", size=0.15, fill=NA)
gg <- gg + coord_map()
gg <- gg + ggthemes::theme_map()
gg + geom_map(data = puntos, aes(map_id = Provincia, fill = Puntos),
map = arg_pv)
或者我试过使用类似的东西来查看它是否有任何不同。
ggplot() + geom_map(data = puntos, aes(map_id = Provincia, fill = Puntos),
map = arg_pv) + expand_limits(x = arg_pv$long , y = arg_pv$lat)
在尝试了一些数据之后,我很清楚使处理时间变长的代码显然是
expand_limits
获取 fortify 中所有 259k 个数据点的信息也是如此 table。
有什么解决办法吗?
UPDATED 新方式 ggplot2 映射 "works" O_o
这个:
library(maptools)
library(rgdal)
library(raster)
library(rgeos)
library(ggplot2)
library(ggalt)
library(ggthemes)
library(viridis)
library(magrittr)
# as stated in the other answer, this is the same as your shapefile
arg_adm <- raster::getData('GADM', country='ARG', level=1)
# make the polygons a bit less verbose
gSimplify(arg_adm, 0.01, topologyPreserve=TRUE) %>%
SpatialPolygonsDataFrame(dat=arg_adm@data) -> arg_adm
# turn them into a data frame
arg_map <- fortify(arg_adm, region="NAME_1")
# use a gd projection for this region
arg_proj <- "+proj=aeqd +lat_0=-37.869859624840764 +lon_0=-66.533203125"
# reproducibly simulate some data
set.seed(1492)
puntos <- data.frame(id=c("Buenos Aires", "Córdoba", "Catamarca", "Chaco", "Chubut",
"Ciudad de Buenos Aires", "Corrientes", "Entre Ríos", "Formosa",
"Jujuy", "La Pampa", "La Rioja", "Mendoza", "Misiones", "Neuquén",
"Río Negro", "Salta", "San Juan", "San Luis", "Santa Cruz",
"Santa Fe", "Santiago del Estero", "Tierra del Fuego", "Tucumán"),
value=sample(100, 24))
# plot it
gg <- ggplot()
# necessary in the new world of ggplot2 mapping O_o
gg <- gg + geom_blank(data=arg_map, aes(long, lat))
# draw the base polygon layer
gg <- gg + geom_map(data=arg_map, map=arg_map,
aes(map_id=id),
color="#b2b2b2", size=0.15, fill=NA)
# fill in the polygons
gg <- gg + geom_map(data=puntos, map=arg_map,
aes(fill=value, map_id=id),
color="#b2b2b2", size=0.15)
gg <- gg + scale_fill_viridis(name="Scale Title")
gg <- gg + coord_proj(arg_proj)
gg <- gg + theme_map()
gg <- gg + theme(legend.position=c(0.8, 0.1))
gg
在我的系统上真正快速渲染:
benchplot(gg)
## step user.self sys.self elapsed
## 1 construct 0.000 0.000 0.000
## 2 build 0.029 0.002 0.031
## 3 render 0.206 0.006 0.217
## 4 draw 0.049 0.001 0.051
## 5 TOTAL 0.284 0.009 0.299
尝试按照上面的习语与你正在做的事情或 post dput(puntos)
的输出到你的问题中,这样它就可以重现了。另外:在您的问题中继续包含整个 RStudio window 确实既无帮助也无济于事。
我正在制作一张来自阿根廷的等值线图,我将在其中绘制一些数据。
我可以毫无问题地张贴地图并在上面绘制一些数据。例如像这样:
问题是我认为 R 渲染地图的质量太高(我不需要)并且处理时间很长。 (约 3 分钟)显示该等值线。这是我使用的代码。
arg_shp <- readOGR("ARG_adm_shp/ARG_adm1.shp", "ARG_adm1")
puntos <- read.csv("puntos.csv", sep = ",", header = T)
arg_pv <- fortify(arg_shp, region = "NAME_1")
gg <- ggplot()
gg <- gg + geom_map(data=arg_pv, map=arg_pv,
aes(long, lat, map_id=id),
color="#2b2b2b", size=0.15, fill=NA)
gg <- gg + coord_map()
gg <- gg + ggthemes::theme_map()
gg + geom_map(data = puntos, aes(map_id = Provincia, fill = Puntos),
map = arg_pv)
或者我试过使用类似的东西来查看它是否有任何不同。
ggplot() + geom_map(data = puntos, aes(map_id = Provincia, fill = Puntos),
map = arg_pv) + expand_limits(x = arg_pv$long , y = arg_pv$lat)
在尝试了一些数据之后,我很清楚使处理时间变长的代码显然是
expand_limits
获取 fortify 中所有 259k 个数据点的信息也是如此 table。
有什么解决办法吗?
UPDATED 新方式 ggplot2 映射 "works" O_o
这个:
library(maptools)
library(rgdal)
library(raster)
library(rgeos)
library(ggplot2)
library(ggalt)
library(ggthemes)
library(viridis)
library(magrittr)
# as stated in the other answer, this is the same as your shapefile
arg_adm <- raster::getData('GADM', country='ARG', level=1)
# make the polygons a bit less verbose
gSimplify(arg_adm, 0.01, topologyPreserve=TRUE) %>%
SpatialPolygonsDataFrame(dat=arg_adm@data) -> arg_adm
# turn them into a data frame
arg_map <- fortify(arg_adm, region="NAME_1")
# use a gd projection for this region
arg_proj <- "+proj=aeqd +lat_0=-37.869859624840764 +lon_0=-66.533203125"
# reproducibly simulate some data
set.seed(1492)
puntos <- data.frame(id=c("Buenos Aires", "Córdoba", "Catamarca", "Chaco", "Chubut",
"Ciudad de Buenos Aires", "Corrientes", "Entre Ríos", "Formosa",
"Jujuy", "La Pampa", "La Rioja", "Mendoza", "Misiones", "Neuquén",
"Río Negro", "Salta", "San Juan", "San Luis", "Santa Cruz",
"Santa Fe", "Santiago del Estero", "Tierra del Fuego", "Tucumán"),
value=sample(100, 24))
# plot it
gg <- ggplot()
# necessary in the new world of ggplot2 mapping O_o
gg <- gg + geom_blank(data=arg_map, aes(long, lat))
# draw the base polygon layer
gg <- gg + geom_map(data=arg_map, map=arg_map,
aes(map_id=id),
color="#b2b2b2", size=0.15, fill=NA)
# fill in the polygons
gg <- gg + geom_map(data=puntos, map=arg_map,
aes(fill=value, map_id=id),
color="#b2b2b2", size=0.15)
gg <- gg + scale_fill_viridis(name="Scale Title")
gg <- gg + coord_proj(arg_proj)
gg <- gg + theme_map()
gg <- gg + theme(legend.position=c(0.8, 0.1))
gg
在我的系统上真正快速渲染:
benchplot(gg)
## step user.self sys.self elapsed
## 1 construct 0.000 0.000 0.000
## 2 build 0.029 0.002 0.031
## 3 render 0.206 0.006 0.217
## 4 draw 0.049 0.001 0.051
## 5 TOTAL 0.284 0.009 0.299
尝试按照上面的习语与你正在做的事情或 post dput(puntos)
的输出到你的问题中,这样它就可以重现了。另外:在您的问题中继续包含整个 RStudio window 确实既无帮助也无济于事。