2013-04-05 8 views
15

Vorrei usare ggplot e sfaccettatura per costruire una serie di grafici di densità raggruppati per un fattore. Inoltre, vorrei creare uno strato di densità su ciascuna delle faccette che non è soggetto ai vincoli imposti dalla faccetta.ggplot2: C'è un modo per sovrapporre un singolo grafico a tutti gli aspetti in un ggplot

Per esempio, la trama sfaccettato sarebbe simile a questa:

require(ggplot2) 
ggplot(diamonds, aes(price)) + facet_grid(.~clarity) + geom_density() 

e poi mi piacerebbe avere il seguente plot densità singolo strato sulla parte superiore di ciascuna delle sfaccettature:

ggplot(diamonds, aes(price)) + geom_density() 

Inoltre, è ggplot con sfaccettatura il modo migliore per farlo, o c'è un metodo preferito?

risposta

18

Un modo per ottenere questo sarebbe quello di rendere telaio nuovi dati diamonds2 che contiene solo colonna price e quindi due geom_density() chiamate - uno che utilizzeranno originale diamonds e seconda che utilizza diamonds2. Come in diamonds2 non ci sarà la colonna clarity tutti i valori saranno usati in tutti i lati.

diamonds2<-diamonds["price"] 
ggplot(diamonds, aes(price)) + geom_density()+facet_grid(.~clarity) + 
    geom_density(data=diamonds2,aes(price),colour="blue") 

enter image description here

UPDATE - come suggerisce @BrianDiggs lo stesso risultato può essere raggiunto senza apportare nuova cornice dati ma trasformandola all'interno geom_density().

ggplot(diamonds, aes(price)) + geom_density()+facet_grid(.~clarity) + 
    geom_density(data=transform(diamonds, clarity=NULL),aes(price),colour="blue") 

Un altro approccio sarebbe quello di tracciare i dati senza sfaccettatura. Aggiungi due chiamate a geom_density() - in una aggiunta aes(color=clarity) per avere linee di densità in diversi colori per ogni livello di clarity e lasciare vuoto secondo geom_density() - che aggiungerà la linea di densità nera complessiva.

ggplot(diamonds,aes(price))+geom_density(aes(color=clarity))+geom_density() 

enter image description here

+0

Grazie per una grande risposta. Se avessi abbastanza reputazione, farei un voto positivo :) Grazie. – skleene

+0

Una leggera variazione sul primo approccio: non devi fare un nome 'diamonds2' prima del tempo. Puoi dichiararlo in-line nell'argomento dati al secondo 'geom_density()': 'data = transform (diamonds, clear = NULL)' –

+0

@BrianDiggs Grazie. Avevo un'idea simile anche dopo la risposta inviata, ma ho deciso di lasciare questo modo per mostrare che altri dati non hanno questa colonna e per essere più generici (se c'è già un altro data frame disponibile). –

Problemi correlati