2013-05-05 20 views
17

Próbuję utworzyć mapę w ggplot2 przy użyciu danych z oddzielnych ramek danych.W ggplot2, jak mogę dodać dodatkową legendę?

library(maptools) 

xx <- readShapePoly(system.file("shapes/sids.shp", package="maptools")[1], IDvar="FIPSNO", proj4string=CRS("+proj=longlat +ellps=clrk66")) 

xx.sub1 <- subset(xx, xx$FIPSNO < 37010) 
xx.sub2 <- subset(xx, xx$FIPSNO > 37010) 

[email protected]$id <- rownames([email protected]) 
xx.sub1.points <- fortify(xx.sub1, region="id") 
xx.sub1.df = join(xx.sub1.points, [email protected], by="id") 

[email protected]$id <- rownames([email protected]) 
xx.sub2.points <- fortify(xx.sub2, region="id") 
xx.sub2.df = join(xx.sub2.points, [email protected], by="id") 

ggplot(xx.sub2.df) + 
    aes(long, lat, fill = (SID79/BIR79)*1000, group = group) + 
    geom_polygon() + geom_path(color="grey80") + 
    coord_equal() + 
    scale_fill_gradientn(colours = brewer.pal(7, "YlOrBr")) + 
    geom_polygon(data = xx.sub1.df, fill = "grey50") + 
    geom_path(data = xx.sub1.df, color="grey80") + 
    labs(fill = "Mapped value", title = "Title") 

Do tego momentu wszystko działa zgodnie z oczekiwaniami i uzyskać ładny mapę:

enter image description here

Co chciałbym zmienić jednak jest dodanie oddzielnego legendę dla danych z xx.sub1.df - od wszystkie wielokąty są wypełnione szarym, mam nadzieję, że będzie to dodatkowy wpis.

Jak mogę to osiągnąć?

+3

odtwarzalny przykład (http://tinyurl.com/reproducible-000), proszę? Kanonicznym sposobem rozwiązania tego problemu jest scalenie zestawów danych, w tym zmienna czynnikowa określająca, z której oryginalnej serii danych pochodzi każdy zestaw danych, następnie użycie estetyki (w twoim przypadku dla wypełnienia, myślę) ... możesz spojrzeć na pakiet 'scale', aby sprawdzić, czy istnieje inny sposób. –

+0

@BenBolker Roger that. Dodano przykład. Jestem świadomy, że łatwiej byłoby mieć wszystko w jednym df. Jednak często pracuję z różnymi warstwami danych (może to być moja stronniczość pochodząca z tła GIS), które byłyby bólem w szyi. I w tym konkretnym przykładzie muszę wybrać kilka wielokątów i "podświetlić" lub "zamaskować" je w szybki sposób. – radek

+0

Czy możesz dodać "dput" swoich danych, aby można było odpowiedzieć na twoje pytanie zaktualizowaną mapą termiczną? Zgaduję, że: (1) używasz tylko dwóch kolumn 'xx.sub2', (2) stany są szare, jeśli są obecne w' xx.sub1'. Dlatego dołączenie nie wydaje się takie denerwujące. Możesz po prostu dodać czynnik w 'xx.sub2' dla wpisów, które są w' xx.sub1', i być może użyć 'scale_fill_manual' aby dopasować kolory w legendzie. –

Odpowiedz

23

Nie jestem w 100% pewny, że tego właśnie chcesz, ale oto jak podchodzę do problemu, tak jak go rozumiem. Jeśli mapujemy niektóre nieużywane geom z danymi z xx.sub1.df, ale sprawimy, że będą one niewidoczne na wykresie, nadal możemy uzyskać legendę dotyczącą tego geom. Tutaj użyłem geom_point, ale możesz zrobić to innym.

p <- ggplot(xx.sub2.df) + 
    aes(long, lat, fill = (SID79/BIR79)*1000, group = group) + 
    geom_polygon() + geom_path(color="grey80") + 
    coord_equal() + 
    scale_fill_gradientn(colours = brewer.pal(7, "YlOrBr")) + 
    geom_polygon(data = xx.sub1.df, fill = "grey50") + 
    geom_path(data = xx.sub1.df, color="grey80") + 
    labs(fill = "Mapped value", title = "Title") 

#Now we add geom_point() setting shape as NA, but the colour as "grey50", so the 
#legend will be displaying the right colour 

p2 <- p + geom_point(data = xx.sub1.df, aes(size="xx.sub1", shape = NA), colour = "grey50") 

enter image description here

Teraz musimy tylko zmienić rozmiar i kształt punktu na legendzie, i zmienić nazwę legendy (dzięki @DizisElferts którzy wykazali to earlier).

p2 + guides(size=guide_legend("Source", override.aes=list(shape=15, size = 10))) 

enter image description here

oczywiście można zmienić sposób etykiety pracy lub cokolwiek, aby podkreślić to, co chcesz pokazać.

Jeśli to nie jest to, o co prosisz, daj mi znać!

+0

To miło! Wydawało mi się, że nie było to inne obejście niż dodanie nowej estetyki (tutaj "geom_point"), do której można dodać legendę. Nie wiedziałem o "shape = NA", więc jest to naprawdę przydatne. –

Powiązane problemy