2012-05-03 25 views
33

Vorrei posizionare un bordo nero attorno ai punti su un grafico a dispersione riempito in base ai dati, utilizzando ggplot2. Inoltre, vorrei evitare di avere una voce della legenda per il bordo nero poiché sarà su ogni punto. Fondamentalmente sto cercando questa trama, ma con un bordo nero attorno ad ogni punto.Posizionare un bordo attorno ai punti

df <- data.frame(id=runif(12), x=1:12, y=runif(12)) 
ggplot(df, aes(x=x, y=y))+geom_point(aes(colour=id), size=12) 

the plot I want, except it doesn't have borders around the points

Come bonus, mi piacerebbe non avere una voce di legenda per il bordo nero. Il mio migliore prova è:

df <- data.frame(id=runif(12), x=1:12, y=runif(12)) 
ggplot(df, aes(x=x, y=y))+geom_point(aes(fill=id, colour="black"), size=12) 

Che dà:

not at all the plot I want

Non capisco perché questo non mi dà quello che voglio, e peggio (per la mia formazione in ggplot2) I non capisco perché non sembra mappare il colore di riempimento a nulla! Qualsiasi aiuto?

Forse se riesco a ottenere il contorno e il riempimento della mappatura, posso usare un trucco simile a quello dell'ultima serie di figure here per disattivare la legenda.

risposta

60

è un po 'oscuro, ma è necessario utilizzare pch> 20 (credo 21:25 sono le forme rilevanti): fill controlla l'anello interno colo (u) e colour controlla la linea attorno al bordo.

(g0 <- ggplot(df, aes(x=x, y=y))+geom_point(aes(fill=id), 
     colour="black",pch=21, size=5)) 

aggiornamento: con le versioni più recenti ggplot2 (ad esempio 2.0.0, non so quanto indietro si va) la guida di default è un COLOURBAR. Bisogno di g0 + guides(fill="legend") per ottenere una legenda con punti come nella trama mostrata qui. Le interruzioni di default sono cambiate, troppo: per esattamente replicare questa trama è necessario g0 + scale_fill_continuous(guide="legend",breaks=seq(0.2,0.8,by=0.1)) ...

enter image description here

correlati ma non identici: how to create a plot with customized points in R?. La risposta accettata a questa domanda utilizza la tecnica di stratificazione mostrata nella risposta di @ joran, ma (IMO) la risposta di @jbaums, che utilizza la tecnica pch=21, è superiore. (Credo shape=21 è un'alternativa, e forse anche preferito, a pch=21.)

PS si dovrebbe mettere colourdi fuori la mappatura (aes bit) se si desidera impostare assolutamente e non in base al valore di alcuni variabile ...

+0

Hai ragione, questa tecnica è migliore. – joran

+0

Grazie Ben. C'è un modo per cambiare la larghezza del tratto (contorno) usando questo metodo? – geotheory

+0

Non ne vedo uno (ho provato a impostare 'width' e' lwd'), mi dispiace. –

21

La prima domanda è un dammi:

ggplot(df, aes(x=x, y=y)) + 
    geom_point(aes(colour=id), size=12) + 
    geom_point(shape = 1,size = 12,colour = "black") 

E, oh, è Non vuole una leggenda in più. Penso che fa poi:

enter image description here

+0

È interessante notare che una guida non dimostra per la seconda geom_point - Io non capisco perché questo è, ma dato che è quello che volevo comunque mi preoccuperò un altro giorno –

+0

Oh, capisco perché - perché non è all'interno di una chiamata aes() –

+0

@DrewSteen - sembra che tu abbia capito, ho fatto una domanda simile qualche tempo fa da quando mi ci è voluto un po 'per capirlo. Non sono sicuro se/che cosa sarebbe reso obsoleto dall'introduzione di ggplot 0.9: http://stackoverflow.com/questions/4221168/ggplot-legend-issue-w-geom-point-and-geom-text – Chase

4

Ho avuto lo stesso problema, ma avevo bisogno di una soluzione che consenta anche il jitter. Per questo è necessario utilizzare un pch che è una forma piena con un bordo e una funzione grid.edit dal pacchetto gridExtra.Usando il tuo esempio:

df <- data.frame(id=runif(12), x=1:12, y=runif(12)) 
ggplot(df, aes(x=x, y=y, fill=id))+geom_point(pch=21, colour="Black", size=12) 

library(gridExtra) 
grid.edit("geom_point.points", grep = TRUE, gp = gpar(lwd = 3)) 
Problemi correlati