2013-05-01 22 views
12

Diciamo che non ho bisogno di una mappatura delle variabili "corretta" ma vorrei comunque avere le chiavi della legenda per aiutare la comprensione del grafico. I miei dati reali sono simili al seguente dfDiverse chiavi della legenda all'interno della stessa legenda in 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

In sostanza, vorrei la leggenda relativa chiave per points per essere .. solo un punto, senza la linea nel mezzo. Mi sono avvicinato a questo:

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

ma definisce due legende separate. Anche la correzione del secondo codice (e la necessità di rimodellare i miei dati) andrebbe bene, ma preferirei un modo (se esiste) di modificare manualmente qualsiasi tasto della legenda (e continuare a usare il primo approccio). Grazie!

EDIT:

grazie @alexwhan rinfrescati la memoria sulla mappatura variabile. Tuttavia, il modo più semplice che ho finora è ancora il seguente (molto male mod!):

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

che è solo nascondere il titolo dei due diversi leggende.

enter image description here

Altre idee più che benvenuti !!!

risposta

25

È possibile utilizzare override.aes= all'interno della funzione guides() per modificare l'aspetto predefinito della legenda. In questo caso la guida è color= e quindi è necessario impostare shape=c(NA,16) per rimuovere la forma per la linea e quindi linetype=c(1,0) per rimuovere la linea dal punto.

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

metodo molto bello. Probabilmente il migliore disponibile. Volevo solo aspettare qualcun altro, ma sembra che sia anche l'unico :-). Comunque, grazie mille! – Michele

6

io non sono a conoscenza di un modo per farlo facilmente, ma si può fare una versione mod come questo (usando il vostro dataframe fuso):

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

La chiave è che è necessario per ottenere correttamente la mappatura per visualizzarla correttamente nella legenda. In questo caso, ottenerlo 'giusto', significa ingannarlo per sembrare nel modo in cui lo desideri. Probabilmente vale la pena sottolineare che funziona solo perché è possibile impostare linetype su bianco (0) e quindi utilizzare la scala alpha per i punti. Non è possibile utilizzare alpha per entrambi, perché richiederà solo una scala.

Problemi correlati