studio - superponer graficas en r ggplot
¿Cómo superponer diagramas de densidad en R? (7)
Me gustaría superponer 2 diagramas de densidad en el mismo dispositivo con R. ¿Cómo puedo hacer eso? Busqué en la web, pero no encontré ninguna solución obvia (soy bastante nuevo en R).
Mi idea sería leer datos de un archivo de texto (columnas) y luego usar
plot(density(MyData$Column1))
plot(density(MyData$Column2), add=T)
bueno algo en este espíritu ...
Gracias por adelantado
Agregar una versión de gráficos base que cumpla con los límites del eje y, agregue colores y funcione para cualquier cantidad de columnas:
Si tenemos un conjunto de datos:
myData <- data.frame(std.nromal=rnorm(1000, m=0, sd=1),
wide.normal=rnorm(1000, m=0, sd=2),
exponent=rexp(1000, rate=1),
uniform=runif(1000, min=-3, max=3)
)
Entonces para trazar las densidades:
dens <- apply(myData, 2, density)
plot(NA, xlim=range(sapply(dens, "[", "x")), ylim=range(sapply(dens, "[", "y")))
mapply(lines, dens, col=1:length(dens))
legend("topright", legend=names(dens), fill=1:length(dens))
Lo que da:
Así es como lo hago en la base (en realidad se menciona en los comentarios de la primera respuesta, pero mostraré el código completo aquí, incluida la leyenda, ya que aún no puedo hacer ningún comentario ...)
Primero necesita obtener la información sobre los valores máximos para el eje y a partir de los gráficos de densidad. Entonces, primero debe calcular las densidades por separado
dta_A <- density(VarA, na.rm = TRUE)
dta_B <- density(VarB, na.rm = TRUE)
Luego grábalos de acuerdo con la primera respuesta y define los valores mínimo y máximo para el eje y que acabas de obtener. (Establecí el valor mínimo en 0)
plot(dta_A, col = "blue", main = "2 densities on one plot"),
ylim = c(0, max(dta_A$y,dta_B$y)))
lines(dta_B, col = "red")
Luego agrega una leyenda a la esquina superior derecha
legend("topright", c("VarA","VarB"), lty = c(1,1), col = c("blue","red"))
Siempre que haya problemas de límites de eje no coincidentes, la herramienta adecuada en gráficos base
es usar matplot
. La clave es aprovechar los argumentos from
y to
para density.default
. Es un poco hackish, pero bastante sencillo de rodar:
set.seed(102349)
x1 = rnorm(1000, mean = 5, sd = 3)
x2 = rnorm(5000, mean = 2, sd = 8)
xrng = range(x1, x2)
#force the x values at which density is
# evaluated to be the same between ''density''
# calls by specifying ''from'' and ''to''
# (and possibly ''n'', if you''d like)
kde1 = density(x1, from = xrng[1L], to = xrng[2L])
kde2 = density(x2, from = xrng[1L], to = xrng[2L])
matplot(kde1$x, cbind(kde1$y, kde2$y))
Agregue campanas y silbatos como desee ( matplot
acepta todos los plot
estándar par
/ par
, p. Ej. lty
, type
, col
, lwd
, ...).
Solo para proporcionar un conjunto completo, aquí hay una versión de la respuesta de Chase usando lattice
:
dat <- data.frame(dens = c(rnorm(100), rnorm(100, 10, 5))
, lines = rep(c("a", "b"), each = 100))
densityplot(~dens,data=dat,groups = lines,
plot.points = FALSE, ref = TRUE,
auto.key = list(space = "right"))
que produce una trama como esta:
Tomé el ejemplo del enrejado anterior e hice una función ingeniosa. Probablemente haya una mejor manera de hacer esto con la remodelación mediante derretimiento / fusión. (Coméntelo o edítelo si ve una mejora).
multi.density.plot=function(data,main=paste(names(data),collapse = '' vs ''),...){
##combines multiple density plots together when given a list
df=data.frame();
for(n in names(data)){
idf=data.frame(x=data[[n]],label=rep(n,length(data[[n]])))
df=rbind(df,idf)
}
densityplot(~x,data=df,groups = label,plot.points = F, ref = T, auto.key = list(space = "right"),main=main,...)
}
Ejemplo de uso:
multi.density.plot(list(BN1=bn1$V1,BN2=bn2$V1),main=''BN1 vs BN2'')
multi.density.plot(list(BN1=bn1$V1,BN2=bn2$V1))
usa lines
para el segundo:
plot(density(MyData$Column1))
lines(density(MyData$Column2))
Sin embargo, asegúrese de que los límites de la primera parcela sean adecuados.
ggplot2 es otro paquete de gráficos que maneja cosas como el problema de rango que Gavin menciona de una manera muy hábil. También maneja automáticamente la generación de leyendas apropiadas y, en general, tiene una sensación más pulida en mi opinión, con menos manipulación manual.
library(ggplot2)
#Sample data
dat <- data.frame(dens = c(rnorm(100), rnorm(100, 10, 5))
, lines = rep(c("a", "b"), each = 100))
#Plot.
ggplot(dat, aes(x = dens, fill = lines)) + geom_density(alpha = 0.5)