2012-06-19 10 views
12

Ho questo (5) geom_vline() nella mia trama e voglio che abbiano un colore diverso. C'è un modo per farlo?ggplot2: Come avere un colore diverso di geom_vline()

Ecco i miei codici,

library(ggplot2) 

x <- seq(-7, 8, length = 90) 
tvalues <- dt(x,15) 

qplot(x, tvalues) + geom_polygon(fill = "purple", colour = "purple", alpha = 0.5) + 
    geom_point(fill = "purple", colour = "purple", alpha = 0.2, pch = 21) + 
    geom_vline(xintercept = c(a <- c(-2.27685371, 0.01661155, 
    0.33598194, 1.92426022), mean(a)), linetype = "dashed", colour = "red") + theme_bw() + xlab(bquote(bold('Average Tensile Strength (lb/in'^'2'*')'))) + 
    ylab(expression(bold(P(x)))) + 
    opts(title = expression(bold("Student t Distribution")), plot.title = theme_text(size = 20, colour = "darkblue"), 
     panel.border = theme_rect(size = 2, colour = "red")) 

E qui è l'uscita,

enter image description here

Privacy cinque linee verticali nella trama, voglio ciascuno di questi linea per avere un colore diverso ,

Ho provato questo

library(colorRamps) 
geom_vline(xintercept = c(a <- c(-2.27685371, 0.01661155, 
    0.33598194, 1.92426022), mean(a)), linetype = "dashed", colour = matlab.like(5)) 

ma non ha funzionato, altro tentativo

geom_vline(xintercept = c(a <- c(-2.27685371, 0.01661155, 
    0.33598194, 1.92426022), mean(a)), linetype = "dashed", colour = c("red","blue","green","yellow","orange")) 

ed ancora senza successo.

Grazie in anticipo!

risposta

26

Così si sta sorta di perdere l'idea fondamentale dietro ggplot2, che è che mettete sempre tutti i dati in un data.frame e ogni estetica che si mappa corrisponde ad una variabile nel frame di dati.

È possibile ottenere 5 linee verticali, ognuna di un colore diverso con cinque chiamate separate a geom_vline ma manca il punto dell'intero pacchetto. Invece, si crea un frame di dati:

a <- c(-2.27685371,0.01661155,0.33598194,1.92426022) 
vlines <- data.frame(xint = c(a,mean(a)),grp = letters[1:5]) 

Ho esplicitamente creato una variabile di raggruppamento grp per mappare a colour. Poi aggiungiamo il livello e mappare l'estetica di queste variabili utilizzando aes:

qplot(x, tvalues) + 
    geom_polygon(fill = "purple", colour = "purple", alpha = 0.5) + 
    geom_point(fill = "purple", colour = "purple", alpha = 0.2, pch = 21) + 
    geom_vline(data = vlines,aes(xintercept = xint,colour = grp), linetype = "dashed") + 
    theme_bw() + 
    xlab(bquote(bold('Average Tensile Strength (lb/in'^'2'*')'))) + 
    ylab(expression(bold(P(x)))) + 
    opts(title = expression(bold("Student t Distribution")), 
     plot.title = theme_text(size = 20, colour = "darkblue"), 
     panel.border = theme_rect(size = 2, colour = "red")) 

(I colori saranno difficili da distinguere perché sono linee tratteggiate, e due di loro sono quasi uno sopra l'altro.)

si ottiene molto di più dalla ggplot2 se la transizione da qplot verso ggplot() e cominciare a mettere i dati in frame di dati piuttosto che i vettori.

+0

Bene, grazie per avermelo ricordato :) Avrei dovuto pensarci. Grazie mille! risparmi il mio tempo :) –

+0

Grazie mille @joran! –

+0

Questa è un'ottima risposta, mi ha dato la giusta direzione per fare qualcosa di simile. Avevo bisogno di aggiungere geom_hlines alla media di una trama con gruppi diversi. Intendevo per gruppo e usavo geom_hline come descritto da te. La differenza è che ho usato "linetype = grp" per avere diversi tipi di linea ed era all'interno della chiamata AES, invece di essere all'esterno come mostrato qui. – Eduardo

1

Se si desidera semplicemente mettere una riga, aggiungere il seguente geom aggiungere una riga verticale a x=1 in colore rosso e tratteggiata.

+ geom_vline(aes(xintercept=1), colour="#BB0000", linetype="dashed") 
Problemi correlati