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.
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)
O algo con este espíritu.
r
plot
density-plot
pasta
fuente
fuente
ylim
utilizandorange(dens1$y, dens2$y)
dóndedens1
ydens2
son los objetos que contienen los dos objetos de estimación de densidad. Use estoylim
en la llamada aplot()
.lwd
), el tipo de línea (lty
) o el color de línea (col
) debería ayudar aquí. En ese punto, también podría considerar agregar una leyenda, usandolegend()
ggplot2 es otro paquete de gráficos que maneja cosas como el problema de rango que menciona Gavin de una manera bastante hábil. También maneja la generación automática de leyendas apropiadas y, en mi opinión, generalmente tiene una sensación más pulida fuera de la caja 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)
fuente
ggplot (melt (MyData), mapping = aes (fill = variable, x = value)) + geom_density (alpha = .5)
dat
en mi entorno, así que lo nombrédat2
... aunque los datos simulados que proporciono funcionan como se anuncia. elmelt()
comando proviene del paquetereshape2
. En 2011,reshape2
se cargó automáticamente cuandoggplot2
se cargó, pero ese ya no es el caso, por lo que debe hacerlo porlibrary(reshape2)
separado.Agregar una versión de gráficos base que se ocupa de los límites del eje y, agrega colores y funciona 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) )
Luego 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:
fuente
dens <- apply(myData, 2, density)
adens <- apply(myData, 2, density, na.rm=TRUE)
y debería funcionar.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:
fuente
data.frame
:densityplot(~rnorm(100)+rnorm(100, 10, 5), plot.points=FALSE, ref=TRUE, auto.key = list(space = "right"))
. O para datos OPdensityplot(~Column1+Column2, data=myData)
.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 comentar ...)
Primero necesita obtener la información sobre los valores máximos para el eje y de las gráficas de densidad. Por lo tanto, primero debe calcular las densidades por separado
dta_A <- density(VarA, na.rm = TRUE) dta_B <- density(VarB, na.rm = TRUE)
Luego, grábelos de acuerdo con la primera respuesta y defina los valores mínimo y máximo para el eje y que acaba de obtener. (Puse 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 agregue una leyenda en la esquina superior derecha
legend("topright", c("VarA","VarB"), lty = c(1,1), col = c("blue","red"))
fuente
Tomé el ejemplo de celosía anterior e hice una función ingeniosa. Probablemente haya una mejor manera de hacer esto con remodelar a través de fusión / fundición. (Comente o edite 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,...) }
Uso de ejemplo:
multi.density.plot(list(BN1=bn1$V1,BN2=bn2$V1),main='BN1 vs BN2') multi.density.plot(list(BN1=bn1$V1,BN2=bn2$V1))
fuente
Puede utilizar el
ggjoy
paquete. Digamos que tenemos tresbeta
distribuciones diferentes como:set.seed(5) b1<-data.frame(Variant= "Variant 1", Values = rbeta(1000, 101, 1001)) b2<-data.frame(Variant= "Variant 2", Values = rbeta(1000, 111, 1011)) b3<-data.frame(Variant= "Variant 3", Values = rbeta(1000, 11, 101)) df<-rbind(b1,b2,b3)
Puede obtener las tres distribuciones diferentes de la siguiente manera:
library(tidyverse) library(ggjoy) ggplot(df, aes(x=Values, y=Variant))+ geom_joy(scale = 2, alpha=0.5) + scale_y_discrete(expand=c(0.01, 0)) + scale_x_continuous(expand=c(0.01, 0)) + theme_joy()
fuente
Siempre que haya problemas de límites de eje no coincidentes,
base
se debe utilizar la herramienta correcta en gráficosmatplot
. La clave es aprovechar los argumentosfrom
yto
paradensity.default
. Es un poco hack, pero bastante sencillo de rodar usted mismo: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))
Añadir campanas y silbatos como desee (
matplot
acepta todos los estándarplot
/par
argumentos, por ejemplolty
,type
,col
,lwd
, ...).fuente