R에서 밀도 플롯을 오버레이하는 방법은 무엇입니까?


81

R을 사용하여 동일한 장치에 2 개의 밀도 플롯을 오버레이하고 싶습니다. 어떻게 할 수 있습니까? 웹을 검색했지만 확실한 해결책을 찾지 못했습니다.

내 아이디어는 텍스트 파일 (열)에서 데이터를 읽고

plot(density(MyData$Column1))
plot(density(MyData$Column2), add=T)

아니면 이런 정신으로.

답변:


92

lines두 번째 사용 :

plot(density(MyData$Column1))
lines(density(MyData$Column2))

그러나 첫 번째 플롯의 한계가 적합한 지 확인하십시오.


9
+1 두 밀도의 범위가 다르고 두 번째 곡선이 플롯 한계 내에 맞지 않는 경우 약간 더 복잡한 것이 필요할 수 있습니다. 그런 다음 플로팅하기 전에 밀도를 계산 하고 두 밀도 추정 객체를 포함하는 객체 와 위치를 ylim사용하여 적절한 값 을 계산할 수 있습니다. 에 대한 호출에서 이것을 사용하십시오 . range(dens1$y, dens2$y)dens1dens2ylimplot()
Gavin Simpson

2
두 줄을 구분하고 싶을 수도 있습니다. 선 너비 ( lwd), 선 유형 ( lty) 또는 선 색상 ( col)을 설정하면 도움이됩니다. 이 시점에서 다음을 사용하여 범례를 추가 할 수도 있습니다.legend()
nullglob

@Gavin OP가 파일에서 읽는 경우 데이터 (sapply, lapply)를 읽고 모든 데이터 세트의 범위를 찾고 기본 범위를 모두의 최대 범위로 설정 한 다음 플로팅하는 정교한 함수를 구성합니다. ) 밀도.
Roman Luštrik 2011 년

50

ggplot2 는 Gavin이 언급 한 범위 문제와 같은 것을 매우 매끄러운 방식으로 처리하는 또 다른 그래픽 패키지입니다. 또한 적절한 범례를 자동으로 생성하는 작업을 처리하며 일반적으로 수동 조작이 적어 내 생각에 좀 더 세련된 느낌을줍니다.

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)

여기에 이미지 설명 입력


8
OP의 ggplot (melt (MyData), mapping = aes (fill = variable, x = value)) + geom_density (alpha = .5)
data.frame을

1
멋진 음모. "dat2"는 무엇입니까 ...? "melt"(명령을 찾을 수 없음)는 무엇입니까?
Erik Aronesty 2013

@ErikAronesty-이 시점에서 당신은 내 것만 큼 좋은 것 같아요, 2 년 전에 대답했습니다! dat내 환경에 이름이 지정된 다른 객체가 있다고 추측합니다. 내가 dat2제공하는 시뮬레이션 데이터는 광고 된대로 작동합니다. melt()명령은 패키지에서 제공됩니다 reshape2. 2011 년에는 reshape2로드 될 때 자동으로로드 ggplot2되었지만 더 이상 그렇지 않으므로 library(reshape2)별도로 수행해야 합니다.
Chase

21

y 축 제한을 처리하고 색상을 추가하며 원하는 수의 열에 대해 작동하는 기본 그래픽 버전 추가 :

데이터 세트가있는 경우 :

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

그런 다음 밀도를 플로팅하려면 :

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

다음을 제공합니다.

여기에 이미지 설명 입력


이 예가 마음에 들지만 NA 값을 포함하는 데이터 열이 있으면 작동하지 않습니다. 코드를 수정하는 방법을 잘 모르겠지만 이것은 유용 할 것입니다
daisy

1
@daisy이 줄 dens <- apply(myData, 2, density)을로 변경하면 dens <- apply(myData, 2, density, na.rm=TRUE)작동합니다.
Karolis Koncevičius

12

완전한 세트를 제공하기 위해 다음을 사용하는 Chase의 답변 버전이 있습니다 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"))

다음과 같은 플롯을 생성합니다. 여기에 이미지 설명 입력


새로 만들지 않고 data.frame: densityplot(~rnorm(100)+rnorm(100, 10, 5), plot.points=FALSE, ref=TRUE, auto.key = list(space = "right")). 또는 OP 데이터의 경우 densityplot(~Column1+Column2, data=myData).
Marek

6

그것이 내가 기본에서하는 방법입니다 (실제로 첫 번째 답변 주석에 언급되어 있지만 아직 주석을 달 수 없으므로 범례를 포함하여 여기에 전체 코드를 표시하겠습니다 ...)

먼저 밀도 플롯에서 y 축의 최대 값에 대한 정보를 얻어야합니다. 따라서 먼저 밀도를 별도로 계산해야합니다.

dta_A <- density(VarA, na.rm = TRUE)
dta_B <- density(VarB, na.rm = TRUE)

그런 다음 첫 번째 답변에 따라 플로팅하고 방금 얻은 y 축의 최소 및 최대 값을 정의하십시오. (최소값을 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")

그런 다음 오른쪽 상단 모서리에 범례를 추가하십시오.

legend("topright", c("VarA","VarB"), lty = c(1,1), col = c("blue","red"))

3

위의 격자 예제를 사용하여 멋진 기능을 만들었습니다. 용융 / 주조를 통해 모양을 변경하는 더 좋은 방법이있을 것입니다. (개선이 보이면 주석을 달거나 편집하십시오.)

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,...)
}

사용 예 :

multi.density.plot(list(BN1=bn1$V1,BN2=bn2$V1),main='BN1 vs BN2')

multi.density.plot(list(BN1=bn1$V1,BN2=bn2$V1))

2

ggjoy패키지 를 사용할 수 있습니다 . 다음 beta과 같은 세 가지 분포 가 있다고 가정 해 보겠습니다 .

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)

다음과 같이 세 가지 분포를 얻을 수 있습니다.

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

여기에 이미지 설명 입력


2

축 제한이 일치하지 않는 문제가있을 때마다 base그래픽 에서 올바른 도구 는를 사용하는 것 matplot입니다. 핵심은 fromto인수를 density.default. 약간 엉망이지만 스스로 굴리는 것은 상당히 간단합니다.

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

matplot 호출의 출력을 나타내는 플롯입니다.  하나는 빨간색이고 다른 하나는 검은 색인 두 개의 곡선이 관찰됩니다.  검은 색 곡선은 빨간색보다 높게 확장되고 빨간색 곡선은 "더 뭉툭한"것입니다.

원하는대로 종과 경적을 추가 ( matplot받아들이는 모든 표준 plot/ par인수, 예를 들어 lty, type, col, lwd, ...).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.