2015-01-01 14 views
5

Mam kreślenia trasy i punkty na ggmap i muszę dodać legendę do listy nazwisk, że punkty reprezentujące tjDodawanie tabeli legenda/tekstową do ggmap z wielu warstw

1 Bill Harris, 2 Anne Jones itd.

Przygotowałem przykładowe dane.

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") 

Oto mój kod do tej pory. Zwróć uwagę, że dla parametru geom_path i geom.route parametr Rozmiar & jest poza funkcją AES. Nie muszę dostosowywać rozmiaru ani koloru w oparciu o dane. Jeśli umieściłem Rozmiar & Kolor w funkcji AES, otrzymam legendę, ale nie jest to, czego chcę. Używa danych punktowych zamiast nazwy firmy.

Nie jestem nawet pewien, czy Legenda to najlepsza droga. Potrzebuję tylko danych wyświetlanych na wykresie w prostej tabeli.

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))) 

} 
+0

Czy trzeba być na mapie? – hrbrmstr

Odpowiedz

8

Oto jedna z możliwości. Możesz ustawić nazwy firm i ponownie użyć geom_point, aby utworzyć legendę. W tym geom_point używasz alpha = 0. Dlatego tak naprawdę nie widzisz żadnych punktów; po prostu widzisz żółte punkty, jak określono w pierwszym geom_point. Tutaj twoje dane nazywają się 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

+0

Doskonała odpowiedź. Próbowałem go zastosować na prostszej mapie bez ścieżek, ale nie mogę wyjść poza ten błąd: Błąd: niepoprawna specyfikacja koloru "1 Lynch". Problem jest w tym wierszu, uważam: geom_point (data = talent.loc, aes (x = long, y = lat), color = factor (talent.loc $ lawyer, levels = unique (talent.loc $ lawyer)) , alpha = 0). W jaki sposób kolor argumentu akceptuje poziomy czynnikowe jako kolor? – lawyeR

+0

@jazzurro Musisz być ekspertem od 'ggmap'. (+1) – akrun

+0

@lawyeR Dzięki za komentarz. Wygląda na to, że 'kolor' pozostaje poza' aes' w twojej linii. Czy próbowałbyś dodać 'colour' w' aes' i zobaczyć, co się dzieje? – jazzurro

Powiązane problemy