在ggmap中使用图像作为点标志的方法

7
我正在尝试创建一个简单的ggmap,并标注一些学校。我可以轻松地让学校显示在地图上(下面是代码)。但是,我想引入一张学校图标的图片来代替这些点。
据我所知,annotation_custom不起作用,因为它需要笛卡尔坐标。Inset应该可以工作,但这只会为一个学校带来图像,而不是所有学校。再次强调,我想将点字符更改为图像,而不仅仅是添加一个图像。
我怀疑答案可能与grImport、subplot和可能与geom_point交互的函数有关。但是,我束手无策。
这是一种很好的图标形式:wikimedia graduation hat 这个问题的答案在ggplot2中使用刻度标记图片很好地添加了图片,但我想将图片作为点字符并根据属性更改颜色、大小等。
# Load needed packages
# install.packages(c("rgdal", "rgeos", "maptools", "ggmap", "sp", "plyr", "XML",    "grImport"))
library(rgdal) 
library(rgeos)
library(maptools) 
library(ggmap) 
library(sp)
library(plyr)
library(XML) 
library(grImport)

# Define a value for the Seattle Public Schools (SPS) url:
SPSurl <- "http://www.seattleschools.org/modules/cms/pages.phtml? pageid=197023&sessionid=95b8499fc128fde5d7e1335751c73fee&t"

# All of the addresses for SPS, multiple tables: 
SPSaddresses <- readHTMLTable(SPSurl)

# Just elementary schools
SPSelementary <- readHTMLTable(SPSurl, which=3, header=T)

# Just keep the names of the schools and addresses
SPSelementary <- SPSelementary[,c(1,3)]

# Change the address column name
colnames(SPSelementary)[2] <- "address"

# Convert all to character
SPSelementary <- 
  data.frame(lapply(SPSelementary, 
                    as.character), 
             stringsAsFactors=FALSE)

# get rid of the phone numbers in the address
SPSelementary$address <- substr(SPSelementary$address, 
                                 1,
                                 nchar(SPSelementary$address)-14)

# get rid of extra space at end of line
SPSelementary$address <- sub("[[:blank:]]+$", 
                              "", 
                              SPSelementary$address)              

# get the longitude and latitude of the school addresses
SPSelementary_lonlat <- geocode(SPSelementary$address)

# combine addresses with longitude and latitude data
SPSelementary$id <- rownames(SPSelementary)
SPSelementary_lonlat$id <- rownames(SPSelementary_lonlat)

SPSelementary_ll <- merge(SPSelementary, 
                          SPSelementary_lonlat,
                          by="id")


# Get a map of the area around the McDonald school
McDonald_map <- get_map("144 NE 54th Street Seattle WA 98105",
                        zoom=15,
                        maptype='roadmap')

McDonald_map_plot <-
  ggmap(McDonald_map)

McDonald_map_plot

# Add the schools
McDonald_map_plot <- McDonald_map_plot +
  geom_point(data=SPSelementary_ll, 
             mapping=aes(x=lon, 
                         y=lat),
             shape = 17, ### This be a triangle, want to change to school. 
             size = 4,
             alpha=.75) 

McDonald_map_plot
2个回答

6

根据hrbrmstr的答案,这里提供了一段完整的代码,可以生成与您示例SVG非常相似的符号。它使用了Symbola字体,其中包含许多地图定向符号。从这里安装:http://zhm.github.io/symbola/

重要的是,您需要安装字体的TTF版本,而不是OTF版本,除非您下载extrafonts软件包的devtools版本。将来访问此页面的用户可能需要再次确认extrafonts是否支持OTF,因为我相信OTF是未来。

这是hrbrmstr所描述的完整工作版本:

# Load needed packages
# install.packages(c("rgdal", "rgeos", "maptools", "ggmap", "sp", "plyr", "XML", "rgdal", "grImport"))
library(rgdal) 
library(rgeos)
library(maptools) 
library(ggmap) 
library(sp)
library(plyr)
library(XML) 
library(extrafont)

font_import(pattern="Symbola", prompt=FALSE)

# Define a value for the Seattle Public Schools (SPS) url:
SPSurl <- "http://www.seattleschools.org/modules/cms/pages.phtml?pageid=197023&sessionid=95b8499fc128fde5d7e1335751c73fee&t"

# All of the addresses for SPS, multiple tables: 
SPSaddresses <- readHTMLTable(SPSurl, header=T)

# Just elementary schools
SPSelementary <- readHTMLTable(SPSurl, which=3)

# Just keep the names of the schools and addresses
SPSelementary <- SPSelementary[,c(1,3)]

# Change the address column name
colnames(SPSelementary)[2] <- "address"

# Convert all to character
SPSelementary <- 
  data.frame(lapply(SPSelementary, 
                    as.character), 
             stringsAsFactors=FALSE)

# get rid of the phone numbers in the address
SPSelementary$address <- substr(SPSelementary$address, 
                                1,
                                nchar(SPSelementary$address)-14)

# get rid of extra space at end of line
SPSelementary$address <- sub("[[:blank:]]+$", 
                             "", 
                             SPSelementary$address)              

# get the longitude and latitude of the school addresses
SPSelementary_lonlat <- geocode(SPSelementary$address)

# combine addresses with longitude and latitude data
SPSelementary$id <- rownames(SPSelementary)
SPSelementary_lonlat$id <- rownames(SPSelementary_lonlat)

SPSelementary_ll <- merge(SPSelementary, 
                          SPSelementary_lonlat,
                          by="id")

SPSelementary_ll$marker <- "⅔" 

# Get a map of the area around the McDonald school
McDonald_map <- get_map("144 NE 54th Street Seattle WA 98105",
                        zoom=15,
                        maptype='roadmap')

McDonald_map_plot <-
  ggmap(McDonald_map)

McDonald_map_plot <- McDonald_map_plot +
  geom_text(data=SPSelementary_ll, 
            mapping=aes(x=lon, 
                        y=lat, label=marker, family="Symbola"),
            size = 16) 

McDonald_map_plot

带学位帽符号的地图

我应该加上免责声明,这可能是这类问题的一种巧妙而通用的解决方案。理论上,您可以像symbola文档中描述的那样将svg符号添加到自定义字体中:

https://github.com/zhm/symbola/blob/master/README.md

3
如果您按照这里的说明 - https://github.com/wch/extrafont - 导入字体,您可以尝试找到一个具有学校符号(并且已正确编码)的好符号字体。然后您可以像这样操作:
# add a market object that is the proper
# symbol location in the font family

SPSelementary_ll$marker <- "A" 

# Use geom_text() vs geom_point() 
# you may (will?) need to do some tweaks to the position of the symbol

McDonald_map_plot <- McDonald_map_plot +
  geom_text(data=SPSelementary_ll, 
             mapping=aes(x=lon, 
                         y=lat, label=marker, family="Wingdings-Regular", fontface="plain"),
             size = 10,
             alpha=.75) 

enter image description here

虽然不是最理想的,但它相当灵活。我几乎可以确定有一种"grob"的方法可以实现您想要的效果,但在Stack Overflow上真正出色的ggploter中有机会添加该解决方案之前,这可能会有所帮助。


2
你在这个方法上比我更快。由于OP正在寻找地图符号,我建议查看Symbola字体,其中包括许多地理标记,包括与示例类似的学位帽。目前正在努力使其与extrafont一起导入。需要注意的一件事是,在使用extrafont时,您可能需要下载字体的TTF版本而不是OTF版本。 - Peter
+1 for Symbola字体。一定要加入我的收藏。 - hrbrmstr

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