Sovrapponi due diagrammi ggplot2 stat_density2d con canali alfa

Voglio sovrapporre due grafici ggplot2 con canali alfa in modo che l’immagine risultante mostri entrambi i set di dati. Questi sono i miei dati di prova:

 data = read.table(text="P1 -1 0 4\nP2 0 0 2\nP3 2 1 8\nP4 -2 -2 6\nP5 0.5 2 12") data2 = read.table(text="Q1 1 1 3\nQ2 1 -1 2\nQ3 -1 1 8") colnames(data) = c("name","x","y","score") colnames(data2) = c("name","x","y","score") 

Ed ecco come tracciamo questi dati:

 ggplot(data, aes(x=x,y=y)) + stat_density2d(data=data,geom="tile", aes(fill = ..density..,alpha=..density..), contour=FALSE) + theme(legend.position="none") + scale_fill_gradient (low = "#FFFFFF", high = "#FF0000") + xlim(-3,3) + ylim(-3,3) + geom_point() ggplot(data2, aes(x=x,y=y)) + stat_density2d(data=data2,geom="tile", aes(fill = ..density..,alpha=..density..), contour=FALSE) + theme(legend.position="none") + scale_fill_gradient (low = "#FFFFFF", high = "#00FF00") + xlim(-3,3) + ylim(-3,3) + geom_point() 

Il primo grafico mostra i dati , il secondo grafico2 :

Grafico per set di dati * dati *Plot per set di dati * data2 *

Ora voglio una combinazione di entrambe le trame. L’immagine seguente è ciò che voglio ottenere. L’ho prodotto con il mio programma di modifica delle immagini sul desktop moltiplicando entrambe le immagini come livelli.

Entrambi i set di dati in un grafico

Ho provato a tracciare un set di dati uno sopra l’altro, ma questo non moltiplica entrambi i livelli e il secondo colore sovrascrive il primo.

 ggplot(data, aes(x=x,y=y)) + stat_density2d(data=data,geom="tile", aes(fill = ..density..,alpha=..density..), contour=FALSE) + theme(legend.position="none") + scale_fill_gradient (low = "#FFFFFF", high = "#FF0000") + xlim(-3,3) + ylim(-3,3) + stat_density2d(data=data2,geom="tile", aes(fill = ..density..,alpha=..density..), contour=FALSE) + scale_fill_gradient (low = "#FFFFFF", high = "#00FF00") 

inserisci la descrizione dell'immagine qui

Inoltre ricevo questo avviso: la scala per “riempimento” è già presente. Aggiungendo un’altra scala per “riempire”, che sostituirà la scala esistente.

C’è un modo per farlo in R? O c’è un altro modo (usando altre funzioni come per esempio smoothScatter) per ottenere questo o un risultato simile? Come una sorta di soluzione, penso che otterrò un risultato simile usando ImageMagick sul server, ma preferirei fare tutto in R.

Aggiornamento 1

La moltiplicazione di due strati viene eseguita in ImageMagick in questo modo;

 composite -compose multiply data-red.png data-green.png im-multiply.png 

Questo dà lo stesso risultato mostrato sopra.

Aggiornamento 2

@Roland mi ha insegnato nella sua risposta come tracciare i due dataset all’interno della stessa trama. Mentre questo è grande, rimane un problema: l’immagine dipende dall’ordine con cui i dati vengono inseriti nella trama.

 ggplot(rbind(data.frame(data, group="a"), data.frame(data2, group="b")), aes(x=x,y=y)) + stat_density2d(geom="tile", aes(fill = group, alpha=..density..), contour=FALSE) + scale_fill_manual(values=c("a"="#FF0000", "b"="#00FF00")) + geom_point() + theme_minimal() + xlim(-3.3, 3.3) + ylim(-3.3, 3.3) + coord_cartesian(xlim = c(-3.2, 3.2), ylim = c(-3.2, 3.2)) 

dà questo risultato:

Quando si scambia l’ordine di entrambi i set di dati (ora il set di dati “b” alias data2 viene prima, quindi il set di dati dati “a”), si ottiene un risultato simile, ma ora il colore rosso domina, perché viene tracciato in un secondo momento e quindi sovrascrive i dati verdi.

 ggplot(rbind(data.frame(data2, group="a"), data.frame(data, group="b")), aes(x=x,y=y)) + stat_density2d(geom="tile", aes(fill = group, alpha=..density..), contour=FALSE) + scale_fill_manual(values=c("b"="#FF0000", "a"="#00FF00")) + geom_point() + theme_minimal() + xlim(-3.3, 3.3) + ylim(-3.3, 3.3) + coord_cartesian(xlim = c(-3.2, 3.2), ylim = c(-3.2, 3.2)) 

inserisci la descrizione dell'immagine qui

Ho bisogno di soluzioni che non dipendano dall’ordine dei set di dati.

Ecco esattamente la stessa soluzione di @Roland, ad eccezione del fatto che suggerisco una linea di controllo. Questo ti permette di apprezzare la sovrapposizione. Non riesco a vedere come geom_tile e la tua idea di “moltiplicazione” possano permetterti di apprezzarlo. Forse se usi il blu e il rosso per non sovrapporre l’area e un colore viola “appesantito” per l’area sovrapposta. Ma immagino che dovresti calcolarlo in un passo precedente prima di fare il supposario.

contour_line

 ggplot(rbind(data.frame(data, group="a"), data.frame(data2, group="b")), aes(x=x,y=y)) + stat_density2d(geom="density2d", aes(color = group,alpha=..level..), size=2, contour=TRUE) + #scale_color_manual(values=c("a"="#FF0000", "b"="#00FF00")) + geom_point() + theme_minimal() + xlim(-3.3, 3.3) + ylim(-3.3, 3.3) + coord_cartesian(xlim = c(-3.2, 3.2), ylim = c(-3.2, 3.2)) 

È necessario tracciare entrambe le densità sulla stessa scala:

 ggplot(rbind(data.frame(data, group="a"), data.frame(data2, group="b")), aes(x=x,y=y)) + stat_density2d(geom="tile", aes(fill = group, alpha=..density..), contour=FALSE) + scale_fill_manual(values=c("a"="#FF0000", "b"="#00FF00")) + geom_point() + theme_minimal() + xlim(-3.3, 3.3) + ylim(-3.3, 3.3) + coord_cartesian(xlim = c(-3.2, 3.2), ylim = c(-3.2, 3.2)) 

inserisci la descrizione dell'immagine qui

Altrimenti visualizzi un’immagine distorta dei tuoi dati.