如何使用ggplot/ggmap绘制并着色空间线数据框中的街道?

6
我有一个包含科隆所有街道的shapefile (SpatialLinesDataFrame),可以从这里下载。我将此@data与外部数据源的数据合并。如何绘制这些街道(如果可能的话使用ggmaps在谷歌地图上),以便每条街道都具有不同的颜色(或粗细),取决于其个体价值?
到目前为止,我已经完成了以下工作:
shapefile <- readOGR(shapfile, "Strasse", stringsAsFactors=FALSE, 
encoding="latin-9")
shp <- spTransform(shapefile, CRS("+proj=longlat +datum=WGS84"))

此时,我向shp@data数据框中添加了另一列,其中包含每条街道的某个值。然后,我加强了shapefile,以便可以使用ggplot进行绘图:

shp$id <- rownames(shp@data)
shp.df <- as.data.frame(shp)
data_fort <- fortify(shp, region = "id")
data_merged <- join(data_fort, shp.df, by="id")

当我使用geom_lines时,线条不够美观且不易辨认:

ggplot(data_merged, aes(x=long, y=lat,
                      group=group,
                      colour=values)) +
 geom_line()

这里我看到可以转换shapefile以便使用geom_segment(或在这种情况下修改的函数“geom_segment2”),但会失去街道特定的值。


您的shapefile似乎有超过5500条街道。您是否希望每条街道都是不同的颜色?此外,属性表中没有“值”列。 - jlhoward
我将@data与外部数据文件进行了匹配(由于隐私原因,我无法上传该文件)。只有那些在我的原始数据文件中的街道才留在了shapefile中。然后,我将外部文件中的值附加到了shapefile@data数据框中。现在我意识到可以上传修改后的shapefile,明天会这样做。值列在我的shapefile中,其中包含1-10的值,但这是模拟的。当我使用geom_line()时,某些线(街道)的某些部分会填充颜色形状,您知道为什么吗? - masto_don
首先,您需要使用 geom_path(...) 而不是 geom_line(...) - jlhoward
刚刚测试了一下,没有真实数据,看起来好多了 :) 谢谢。我还发现,并不需要直接访问 @data 数据框,而是通过 shapefile 对象即可访问。 - masto_don
1个回答

4

这段代码从您的shapefile中获取了100条最长的道路,随机分配了(1,10)之间的“值”,并根据值的大小在科隆的Google栅格图像上进行了颜色编码。

library(ggplot2)   
library(ggmap)          # for ggmap(...) and get_map(...)
library(rgdal)          # for readOGR(...)
library(plyr)           # for join(...)
set.seed(1)             # for reproducible example
setwd(" <directory with your shapefiles> ")
spl <- readOGR(dsn=".", "Strasse", encoding="latin-9")
spl <- spl[spl$SHAPE_LEN %in% tail(sort(spl$SHAPE_LEN),100),]
shp       <- spTransform(spl, CRS("+proj=longlat +datum=WGS84"))
shp.df    <- data.frame(id=rownames(shp@data),
                        values=sample(1:10,length(shp),replace=T),
                        shp@data, stringsAsFactors=F)

data_fort   <- fortify(shp)
data_merged <- join(data_fort, shp.df, by="id")

ggmap(get_map(unlist(geocode("Cologne")),zoom=11))+
  geom_path(data=data_merged,size=1,
            aes(x=long,y=lat,group=group,color=factor(values)))+
  labs(x="",y="")+
  theme(axis.text=element_blank(),axis.ticks=element_blank())

通过使用以下方法,可以使ggmap(...)调用更简单:

ggmap(get_map("Cologne"))

但是有一个问题:zoom = ...参数被解释的不同,我无法使地图缩放足够大。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接