在具有多个图层的ggmap中添加图例/文本表

5

我正在使用ggmap绘制路线和点,并且需要添加一个图例来列出这些点所代表的名称,例如:

1. 比尔·哈里斯, 2. 安妮·琼斯 等等。

我已经准备好了样本数据。

structure(list(business.names = structure(c(8L, 9L, 5L, 6L, 7L, 
1L, 4L, 3L, 2L, 10L), .Label = c("Bill Harris", "Anne Jones", 
"Sue Perkins", "Morris Jones", "Bert Harris", "Bob Jones", 
"Mike Taylor", "Paul Jones", "John Roberts", 
"Fred Morris"), class = "factor"), X1 = structure(c(7L, 
8L, 10L, 9L, 3L, 2L, 1L, 4L, 5L, 6L), .Label = c("53.186744", 
"53.1884117", "53.1894004", "53.189836", "53.1902965", "53.1905138631287", 
"53.1912196", "53.1916771", "53.193418", "53.1934748"), class = "factor"), 
    X2 = structure(c(7L, 3L, 2L, 1L, 5L, 4L, 6L, 10L, 9L, 8L), .Label = c("-2.881248", 
    "-2.8814698", "-2.8846099", "-2.88802", "-2.8886692", "-2.890165", 
    "-2.8902453", "-2.89043889005541", "-2.8919373", "-2.893896"
    ), class = "factor")), .Names = c("business.names", "X1", 
"X2"), row.names = c(10L, 9L, 8L, 1L, 7L, 6L, 3L, 4L, 5L, 2L), class = "data.frame")

以下是翻译的结果,保留了html标签:

这是我迄今为止的代码。请注意,对于geom_path和geom.route,大小和颜色参数在AES函数之外。我不需要根据数据调整大小或颜色。如果将大小和颜色放入AES函数中,会得到一个图例,但这不是我想要的。它使用的是点数据而不是企业名称。

我甚至不确定图例是否是最好的选择。我只需要在图表中以简单的表格形式显示数据。

create.map<-function(lst){
  require("ggmap")
  require("qmap")
  way.points<-data.frame(lapply(lst[,1:3], as.character), stringsAsFactors=FALSE)
  rte.from   <- apply(way.points[-nrow(way.points),2:3],1,paste,collapse=",")
  rte.to     <- apply(way.points[-1,2:3],1,paste,collapse=",")
  rte        <- do.call(rbind,
                      mapply(route, rte.from, rte.to, SIMPLIFY=FALSE,
                             MoreArgs=list(mode="walking",structure="legs")))


  map.centre<-c(mean(as.numeric(way.points$X2)),mean(as.numeric(way.points$X1)))

  coords   <- rbind(as.matrix(rte[,7:8]),as.matrix(rte[nrow(rte),9:10]))
  coords   <- as.data.frame(coords)

  ggm <- qmap(location=map.centre,zoom = 15, maptype = "road", legend="topright")  

  ggm +
    geom_path(data=coords,aes(x=startLon,y=startLat),color="blue",size=2)+
    geom_point(data=way.points,aes(x=as.numeric(X2),y=as.numeric(X1)),
               size=10,color="yellow")+
    geom_text(data=way.points,
              aes(x=as.numeric(X2),y=as.numeric(X1), label=seq_along(X1)))

}

需要在地图上显示吗? - hrbrmstr
1个回答

8

这里有一个可能性。您可以安排业务名称并再次使用geom_point创建图例。在这个geom_point中,您使用alpha = 0。因此,您实际上看不到任何点; 您只能看到第一个geom_point中指定的黄色点。在这里,您的数据称为mydf

foo <- mutate(mydf, business.names = paste(seq_along(X1), business.names, sep = " "))

#   business.names               X1                X2
#1    1 Paul Jones       53.1912196        -2.8902453
#2  2 John Roberts       53.1916771        -2.8846099
#3   3 Bert Harris       53.1934748        -2.8814698
#4     4 Bob Jones        53.193418         -2.881248
#5   5 Mike Taylor       53.1894004        -2.8886692
#6   6 Bill Harris       53.1884117          -2.88802
#7  7 Morris Jones        53.186744         -2.890165
#8   8 Sue Perkins        53.189836         -2.893896
#9    9 Anne Jones       53.1902965        -2.8919373
#10 10 Fred Morris 53.1905138631287 -2.89043889005541

create.map<-function(lst){
require("ggmap")
require("qmap")
way.points <-data.frame(lapply(lst[,1:3], as.character), stringsAsFactors=FALSE)
rte.from <- apply(way.points[-nrow(way.points),2:3],1,paste,collapse=",")
rte.to <- apply(way.points[-1,2:3],1,paste,collapse=",")
rte <- do.call(rbind,
               mapply(route, rte.from, rte.to, SIMPLIFY=FALSE,
                      MoreArgs=list(mode="walking",structure="legs")))


map.centre<-c(mean(as.numeric(way.points$X2)),mean(as.numeric(way.points$X1)))

coords <- rbind(as.matrix(rte[,7:8]),as.matrix(rte[nrow(rte),9:10]))
coords <- as.data.frame(coords)

ggm <- qmap(location=map.centre,zoom = 15, maptype = "road", legend="topright")  

ggm +
geom_path(data=coords,aes(x=startLon,y=startLat),color="blue",size=2)+
geom_point(data=way.points,aes(x=as.numeric(X2),y=as.numeric(X1)),
           size=10,color="yellow")+
geom_point(data=way.points,aes(x=as.numeric(X2),y=as.numeric(X1),
           color = factor(business.names, levels=business.names)), alpha = 0) +
geom_text(data=way.points,
          aes(x=as.numeric(X2),y=as.numeric(X1), label=seq_along(X1))) +
scale_color_discrete(name = "Business names") +
theme(legend.key = element_rect(fill = NA))

}

create.map(foo)

enter image description here


非常好的答案。我尝试将其应用于一个没有路径的简单地图,但是无法解决这个错误:错误:无效的颜色规范“1 Lynch”。我相信问题在于这一行:geom_point(data = talent.loc,aes(x = long,y = lat),color = factor(talent.loc $ lawyer,levels = unique(talent.loc $ lawyer)),alpha = 0)。您的颜色参数如何接受因子水平作为颜色? - lawyeR
@jazzurro,你一定是ggmap方面的专家。(+1) - akrun
@lawyeR 感谢您的评论。看起来在您的代码行中,colour 似乎是在 aes 之外。您可以尝试将 colour 添加到 aes 中,看看会发生什么? - jazzurro
@akrun 感谢您的评论。ggmap 部分是由 OP 和 jlhoward 完成的。我在假期期间看到了这个问题,对 jlhoward 的工作印象深刻。我在这里所做的只是为了图例。这种技术是我上个月在我的一篇文章中使用的。我也从 jlhoward 那里得到了建议。因此,在这里我想向 jlhoward 致以崇高的敬意。 - jazzurro

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