varias tutorial superponer studio graficas ggplot geom_line geom_bar español r plot ggplot2

tutorial - superponer graficas en r ggplot



Superpone dos gráficos ggplot2 stat_density2d con canales alfa (2)

Quiero superponer dos gráficos ggplot2 con canales alfa de manera que la imagen resultante muestre ambos conjuntos de datos. Estos son mis datos de prueba:

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")

Y aquí es cómo trazo estos datos:

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()

La primera gráfica muestra datos , la segunda gráfica datos2 :

Ahora quiero una combinación de ambas parcelas. La siguiente imagen es lo que quiero obtener. Lo produje con mi programa de edición de imágenes en el escritorio al multiplicar ambas imágenes como capas.

Intenté trazar un conjunto de datos encima del otro, pero eso no multiplica ambas capas y el segundo color sobrescribe al primero.

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")

Además, recibo esta advertencia: la escala de ''relleno'' ya está presente. Añadiendo otra escala para ''relleno'', que reemplazará la escala existente.

¿Hay una manera de hacer esto en R? ¿O hay otra forma (usando otras funciones como, por ejemplo, smoothScatter) para obtener este o un resultado similar? Como una especie de solución, creo que obtendré un resultado similar al usar ImageMagick en el servidor, pero preferiría hacerlo todo en R.

Actualización 1

La multiplicación de dos capas se realiza en ImageMagick de esta manera;

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

Esto da el mismo resultado que se muestra arriba.

Actualización 2

@Roland me enseñó en su respuesta cómo trazar los dos conjuntos de datos dentro de la misma trama. Si bien esto es excelente, queda un problema: la imagen depende del orden en el que alimenta los datos a la gráfica.

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))

da este resultado:

Cuando se intercambia el orden de ambos conjuntos de datos (ahora el conjunto de datos "b" también conocido como data2 viene primero, luego el conjunto de datos también conocido como "a"), se obtiene un resultado similar, pero ahora el color rojo predomina, ya que se traza más tarde y, por lo tanto, se sobrescribe. Los datos verdes.

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))

Necesito soluciones que no dependan del orden de los conjuntos de datos.


Aquí es exactamente la misma solución que @Roland, excepto que sugiero una línea controvertida. Esto le permite apreciar la superposición. No puedo ver cómo geom_tile y tu idea de "multiplicación" podrían permitirte apreciar eso. Tal vez si usa azul y rojo para el área sin superposición, y un color violeta "ponderado" para el área de superposición. Pero supongo que tendrías que calcularlo en un paso anterior antes de trazar, supongo.

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))


Debes trazar ambas densidades en la misma escala:

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))

De lo contrario, se muestra una imagen distorsionada de sus datos.