2013-05-06 14 views
8

Mi piacerebbe creare un grafico sfaccettato con margini in ggplot2. Tuttavia, mi piacerebbe che la trama del margine avesse colori in base a quale facet il punto particolare è stato derivato. E 'probabilmente meglio illustrato con un esempio:Punti colorazione per fattore all'interno del margine di un diagramma ggplot2 sfaccettato in R

library(ggplot2) 

p <- ggplot(mtcars, aes(mpg, wt)) + geom_point() 
p + facet_grid(.~gear, margins = TRUE) 

all'interno della trama margine di etichettato come "(tutti)", voglio quei puntini che hanno "marcia = 3" da tracciare con un colore, quelli con "marcia = 4 "con un secondo colore e quelli con" ingranaggio = 5 "con un terzo.

questo non fare il lavoro:

p <- ggplot(mtcars, aes(mpg, wt)) + geom_point(aes(col=gear)) 
p + facet_grid(.~gear, margins = TRUE) 

C'è un modo per ottenere ciò che voglio?

risposta

3

Come creare una nuova variabile come riferimento e colorarne i punti? Sembra funzionare a condizione che non ti dispiaccia anche i punti delle prime 3 facce colorate.

mtcars$ref <- as.factor(mtcars$gear) 

p <- ggplot(mtcars, aes(mpg, wt)) + geom_point(aes(col=as.factor(gear))) 
p + facet_grid(.~ref, margins = TRUE) 

All points coloured by gear

EDIT: sono riuscito a farlo per rimuovere la chiave di colore dai primi 3 sfaccettature, ma non senza giocare con i dati originali;

Duplicare i dati originali (quindi ci sono 2 di ciascun record) quindi anziché utilizzare un grafico di margine per produrre il facet "tutto", utilizzando invece i record ridondanti.

library(ggplot2) 

mtcars$ref <- (mtcars$gear) 

# create the duplicate 
dat <- do.call("rbind", replicate(2, mtcars, simplify = FALSE)) 

# give the duplicates a false value for "gear" so they can be plotted together 
#This value can then be used for faceting, grouping everything with "all". 

dat$ref[1:32] <- "all" 


# where not in the "all" facet, change "gear" to one (so they are plotted with the same colour) 
dat$gear[dat$ref != "all"] <- 1 

# then plot using ref as the facet and gear to colour points. 

p <- ggplot(dat, aes(mpg, wt)) + geom_point(aes(col=as.factor(gear))) 
p + facet_grid(.~ref, margins = F) 

Points only coloured by gear in final facet

io non sono sicuro che sia il modo migliore per andare su di esso, ma forse qualcuno con più esperienza potrebbe essere in grado di consigliare?

+0

Ok, grazie, questa è davvero una buona e semplice idea! L'unico inconveniente è che in quel caso non vedo un modo per rimuovere i colori dai grafici non marginali. Hai davvero idea del perché 'col (gear)' (o 'col = (as.factor (gear))') non funziona, ma 'col = ref' fa? – AnjaM

+1

La modifica è migliore? Non è la soluzione più elegante, ma spero che aiuti. Penso che abbia a che fare con la definizione di colori e sfaccettature con la stessa variabile, ggplot conferisce ad ogni sfaccettatura il proprio colore. –

+1

@AnjaM potresti provare ad aggiungere 'scale_color_manual (values ​​= c (" black "," red "," green "," blue "))'. 'col = (as.factor (gear))' non funzionerà ma 'col = as.factor (gear)' dovrebbe – Carson

1

Un'altra opzione sarebbe quella di creare le trame sfaccettate e la trama margine separatamente e utilizzare la libreria gridExtra di combinarli:

library(ggplot2) 
library(gridExtra) 
mtcars$ALL <- "all" 
p <- ggplot(mtcars, aes(mpg, wt)) 
p1 <- p + geom_point() + facet_grid(.~gear) 
p2 <- p + geom_point(aes(color=factor(gear))) + facet_grid(.~ALL) 
grid.arrange(p1, p2, ncol=2) 

enter image description here

+0

Grazie, anche questa è una buona idea! Non sapevo che fosse così facile organizzare i grafici di 'ggplot2'! – AnjaM

Problemi correlati