2013-05-01 21 views
12

Załóżmy, że nie potrzebuję "prawidłowego" mapowania zmiennych, ale nadal chciałbym mieć klucze legendy, aby pomóc w zrozumieniu wykresu. Moje rzeczywiste dane są podobne do poniższego dfRóżne legendy kluczy wewnątrz tej samej legendy w ggplot2

df <- data.frame(id = 1:10, line = rnorm(10), points = rnorm(10)) 

library(ggplot2) 

ggplot(df) + 
    geom_line(aes(id, line, colour = "line")) + 
    geom_point(aes(id, points, colour = "points")) 

enter image description here

Zasadniczo chciałbym klucz względny legenda do points być .. tylko punkt, bez linii w środku. Do tego doszedłem:

library(reshape2) 

df <- melt(df, id.vars="id") 

ggplot() + 
    geom_point(aes(id, value, shape = variable), df[df$variable=="points",]) + 
    geom_line(aes(id, value, colour = variable), df[df$variable=="line",]) 

, ale definiuje dwie oddzielne legendy. Naprawienie drugiego kodu (i konieczność zmiany kształtu moich danych) również byłoby w porządku, ale wolałbym sposób (jeśli jest taki), aby ręcznie zmienić dowolny klucz legendy (i dalej używać pierwszego approch). Dzięki!

EDIT:

dzięki @alexwhan Państwo odświeżane moją pamięć o zmiennej mapowania. Jednak najprostszym sposobem mam tak daleko jest jeszcze następujące (bardzo zły siekać!):

df <- data.frame(id = 1:10, line = rnorm(10), points = rnorm(10)) 

ggplot(df) + 
    geom_line(aes(id, line, colour = "line")) + 
    geom_point(aes(id, points, shape = "points")) + 
    theme(legend.title=element_blank()) 

który jest po prostu ukrywa tytuł dwóch różnych legend.

enter image description here

Inne pomysły bardziej niż mile widziane !!!

Odpowiedz

25

Możesz użyć funkcji override.aes= wewnątrz guides(), aby zmienić domyślny wygląd legendy. W takim przypadku twój przewodnik to color=, a następnie powinieneś ustawić shape=c(NA,16), aby usunąć kształt linii, a następnie linetype=c(1,0), aby usunąć linię z punktu.

ggplot(df) + 
    geom_line(aes(id, line, colour = "line")) + 
    geom_point(aes(id, points, colour = "points"))+ 
    guides(color=guide_legend(override.aes=list(shape=c(NA,16),linetype=c(1,0)))) 

enter image description here

+0

Bardzo ładny sposób. Prawdopodobnie najlepszy dostępny. Chciałem tylko poczekać na kogoś innego, ale wygląda na to, że jest to jedyny :-). W każdym razie, wielkie dzięki! – Michele

6

nie jestem świadomy jakikolwiek sposób to zrobić łatwo, ale można zrobić wersję technikę tak (za pomocą topił dataframe):

p <- ggplot(df.m, aes(id, value)) + 
    geom_line(aes(colour = variable, linetype = variable)) + scale_linetype_manual(values = c(1,0)) + 
    geom_point(aes(colour = variable, alpha = variable)) + scale_alpha_manual(values = c(0,1)) 

enter image description here

Kluczem jest to, że trzeba aby uzyskać prawo mapowania, aby było poprawnie wyświetlane w legendzie. W tym przypadku, uzyskanie "właściwego", oznacza oszukanie go tak, aby wyglądał tak, jak chcesz. Warto chyba zauważyć, że działa to tylko dlatego, że można ustawić linetype na puste (0), a następnie użyć skali alpha dla punktów. Nie można używać obu tych urządzeń w wersji alpha, ponieważ zajmie to tylko jedną skalę.

Powiązane problemy