2013-08-14 20 views
5

È possibile sovrapporre più diagrammi stat_contour da ggplot2 utilizzando dati provenienti da diversi dataframes?Come posso sovrapporre più diagrammi stat_contour sullo stesso grafico usando ggplot2?

Ho letto le soluzioni per sovrapporre diverse geografie, ma per questo in particolare voglio utilizzare stat_contour.

Le variabili X e Y sono le stesse per entrambi i set di dati. Alcuni dati di esempio per lavorare con:

# some sample data 
require(ggplot2) 
require(reshape2) 

v1 <- melt(volcano) 
v2 <- v1 
v2$value <- v2$value*1.5 

Così tracciando ciascuno individualmente funziona:

ggplot(v1, aes(x = Var1, y = Var2, z = value)) + 
+ stat_contour(aes(color = ..level..)) + scale_colour_gradient(low = "white", high="#ff6666") 

ggplot(v2, aes(x = Var1, y = Var2, z = value)) + 
+ stat_contour(aes(color = ..level..)) + scale_colour_gradient(low = "white", high="#A1CD3A") 

Esiste un modo per sovrapporre queste trame densità sullo stesso grafico?

Ho provato a creare una variabile fattore assegnando a ciascun set un valore diverso, quindi li impilamento, ma ottengo un errore perché hanno più di un valore per ogni X e Y (Var 1 e Var2 qui).

Grazie per l'aiuto!

+0

Si dovrebbe essere in grado di aggiungere più 'geom_contour's ad una trama, ma non sarà in grado di utilizzare diverse scale, solo 1 in scala è consentito per estetica per trama. Quindi potresti dover trovare una soluzione diversa per discriminare tra i tuoi due set di dati. –

risposta

7

Qui ci sono diverse opzioni per la sovrapposizione di due set di dati di contorno in ggplot2. Un avvertimento significativo (come notato da @Drew Steen) è che non è possibile avere due scale colour separate nello stesso grafico.

# Add category column to data.frames, then combine. 
v1$category = "A" 
v2$category = "B" 
v3 = rbind(v1, v2) 

p1 = ggplot(v3, aes(x=Var1, y=Var2, z=value, colour=category)) + 
    stat_contour(binwidth=10) + 
    theme(panel.background=element_rect(fill="grey90")) + 
    theme(panel.grid=element_blank()) + 
    labs(title="Plot 1") 

p2 = ggplot(v3, aes(x=Var1, y=Var2, z=value, colour=category)) + 
    stat_contour(aes(alpha=..level..), binwidth=10) + 
    theme(panel.background=element_rect(fill="white")) + 
    theme(panel.grid=element_blank()) + 
    labs(title="Plot 2") 

p3 = ggplot(v3, aes(x=Var1, y=Var2, z=value, group=category)) + 
    stat_contour(aes(color=..level..), binwidth=10) + 
    scale_colour_gradient(low="white", high="#A1CD3A") + 
    theme(panel.background=element_rect(fill="grey50")) + 
    theme(panel.grid=element_blank()) + 
    labs(title="Plot 3") 

p4 = ggplot(v3, aes(x=Var1, y=Var2, z=value, linetype=category)) + 
    stat_contour(aes(color=..level..), binwidth=10) + 
    scale_colour_gradient(low="white", high="#A1CD3A") + 
    theme(panel.background=element_rect(fill="grey50")) + 
    theme(panel.grid=element_blank()) + 
    labs(title="Plot 4") 

library(gridExtra) 
ggsave(filename="plots.png", height=8, width=10, 
     plot=arrangeGrob(p1, p2, p3, p4, nrow=2, ncol=2)) 
  • Plot 1: Plot i due strati in diversi colori solidi con aes(colour=category)
  • Trama 2: Mostra ..level.. con trasparenza alfa. Imita con due gradienti di colore separati.
  • Grafico 3: traccia entrambi i livelli con lo stesso gradiente. Mantenere i livelli distinti con aes(group=category)
  • Grafico 4: utilizzare un gradiente di colore singolo, ma distinguere i livelli con il tipo di linea.

enter image description here

+0

Grazie. Questa sembra la soluzione più vicina possibile alla visualizzazione che sto immaginando. Grazie per aver introdotto anche il pacchetto 'gridExtra', lo controllerò. –

Problemi correlati