2012-05-03 19 views
33

Chciałbym umieścić czarną obwódkę wokół punktów na wykresie rozrzutu, które są wypełniane na podstawie danych, przy użyciu ggplot2. Poza tym chciałbym uniknąć wpisu legendy dla czarnej granicy, ponieważ będzie on w każdym punkcie. Zasadniczo szukam tej fabuły, ale z czarną obwódką wokół każdego punktu.Umieść obramowanie wokół punktów

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

Jako bonus, chciałbym nie mieć wpis legendy na czarną obwódką. Moja najlepsza próba jest:

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) 

Co daje:

not at all the plot I want

Nie rozumiem, dlaczego nie daje mi to, czego chcą, a co gorsza (dla mojej edukacji w ggplot2) I nie rozumiem, dlaczego nie wydaje się mapować koloru wypełnienia do niczego! Jakaś pomoc?

Być może, jeśli uda mi się uzyskać kontur i wypełnienie mapowania, mogę użyć haka, takiego jak ten w ostatnim zestawie cyfr here, aby wyłączyć legendę.

Odpowiedz

60

To trochę niejasne, ale trzeba użyć pch> 20 (myślę 21:25 są odpowiednie kształty): fill kontroluje wnętrze colo (u) pierścień i colour kontroluje linię wokół krawędzi.

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

aktualizacja: z ostatnich wersji ggplot2 (np 2.0.0, nie wiem, jak daleko wstecz to idzie) przewodnik domyślny jest colourbar. Potrzebujesz g0 + guides(fill="legend"), aby uzyskać legendę z punktami jak na pokazanym tu wykresie. Przerwy domyślne zostały zmienione, zbyt: do dokładnie powtórzeniach tego wykresu trzeba g0 + scale_fill_continuous(guide="legend",breaks=seq(0.2,0.8,by=0.1)) ...

enter image description here

Podobne, ale nie identyczne: how to create a plot with customized points in R?. Przyjęta odpowiedź na to pytanie używa techniki warstwowej pokazanej w odpowiedzi @ jorana, ale (IMO) odpowiedź @jbaums, która używa techniki pch=21, jest lepsza. (Myślę shape=21 jest alternatywą, a może nawet korzystne, aby pch=21.)

PS należy umieścić colourpoza mapowanie (aes bit), jeśli chcesz, aby ustawić go całkowicie, a nie według wartości niektórych zmienna ...

+0

Masz rację, ta technika jest lepsza. – joran

+0

Dzięki Ben. Czy istnieje sposób na zmianę szerokości obrysu (konturu) przy użyciu tej metody? – geotheory

+0

Nie widzę jednego (próbowałem ustawić "szerokość" i "lwd"), przepraszam. –

21

Pierwsze pytanie to daj:

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

I, oh, ty nie chcą dodatkowego legendę. Myślę, że robi to wtedy:

enter image description here

+0

ciekawe przewodnikiem nie pojawi się na drugim geom_point - Naprawdę nie rozumiem, dlaczego tak jest, ale ponieważ jest to, co chciałem i tak będę martwić kolejny dzień –

+0

Och, rozumiem, dlaczego - ponieważ nie jest w środku aes() zadzwoń –

+0

@ DrewSteen - wygląda na to, że masz to, zadałem podobne pytanie jakiś czas temu, ponieważ zajęło mi trochę czasu, aby to zrozumieć. Nie jestem pewien, czy/co byłoby nieaktualne przez wprowadzenie ggplot 0.9: http://stackoverflow.com/questions/4221168/ggplot-legend-issue-w-geom-point-and-geom-text – Chase

4

Miałem ten sam problem, ale potrzebowałem rozwiązania, które pozwala również na jitter. W tym celu należy użyć pch, który jest wypełnionym kształtem z ramką i funkcją grid.edit z pakietu gridExtra.Korzystanie przykład:

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)) 
Powiązane problemy