2013-05-05 24 views
17

Sto provando a creare una mappa in ggplot2 utilizzando dati da frame di dati separati.In ggplot2, come posso aggiungere una legenda aggiuntiva?

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

Fino a questo punto tutto funziona come previsto e ho un bel mappa:

enter image description here

Quello che mi piacerebbe cambiare però è quello di aggiungere leggenda separata per i dati da xx.sub1.df - dal tutti i poligoni sono solo pieni di grigio spero che sarà una voce aggiuntiva.

Come posso ottenere quello?

+3

esempio riproducibile (http://tinyurl.com/reproducible-000) per favore? Il modo canonico per risolvere questo problema è quello di unire i set di dati, tra cui una variabile fattore che identifica i dati originali da cui proviene ciascun set di dati, quindi usa un aspetto estetico (nel tuo caso per riempimento, credo) ... potresti guardare il pacchetto 'scale 'per vedere se c'è un altro modo –

+0

@BenBolker Roger. Esempio aggiunto. Sono consapevole che sarebbe molto più facile avere tutto in un df. Tuttavia, lavoro spesso con diversi livelli di dati (potrebbe essere il mio pregiudizio di venire dal background GIS) che sarebbe un dolore al collo di aderire. E in questo particolare esempio ho bisogno di selezionare pochi poligoni e "evidenziare" o "mascherarli" in modo rapido. – radek

+0

Potresti aggiungere un 'dput' dei tuoi dati, in modo che uno possa rispondere alla tua domanda con una heatmap aggiornata? Sto supponendo che: (1) tu usi solo 2 colonne di 'xx.sub2', (2) gli stati appaiono grigi se sono presenti in' xx.sub1'. Quindi unirsi non sembra così fastidioso. Potresti semplicemente aggiungere un fattore in 'xx.sub2' per le voci che sono in' xx.sub1', e forse usare 'scale_fill_manual' per regolare i colori nella legenda. –

risposta

23

Non sono sicuro al 100% questo è quello che vuoi, ma ecco come mi avvicinerei al problema come ho capito. Se mappiamo alcuni geom inutilizzati con qualsiasi dato da xx.sub1.df, ma rendiamo invisibile il grafico, possiamo ancora ottenere una legenda per tale geom. Qui ho usato geom_point, ma potresti farne altri.

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

Ora abbiamo solo bisogno di modificare le dimensioni e la forma del punto della leggenda, e cambiare il nome della leggenda (grazie a @DizisElferts che hanno dimostrato questa earlier).

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

enter image description here

Naturalmente è possibile modificare il modo in cui le etichette di lavoro o qualsiasi altra cosa per evidenziare ciò che si desidera mostrare.

Se questo non è quello che cerchi, fammi sapere!

+0

Che bello! Mi è sembrato che non ci fossero altre soluzioni alternative all'aggiunta di una nuova estetica (qui 'geom_point') per la quale è possibile aggiungere una legenda. Non sapevo di 'shape = NA', quindi è davvero utile. –

Problemi correlati