R에서 밀도 플롯을 오버레이하는 방법은 무엇입니까?
R을 사용하여 동일한 장치에 2 개의 밀도 플롯을 오버레이하고 싶습니다. 어떻게 할 수 있습니까? 나는 웹을 검색했지만 확실한 해결책을 찾지 못했습니다 (저는 R을 처음 접했습니다).
내 아이디어는 텍스트 파일 (열)에서 데이터를 읽고
plot(density(MyData$Column1))
plot(density(MyData$Column2), add=T)
이 정신으로 뭔가 ...
미리 감사드립니다
lines
두 번째 사용 :
plot(density(MyData$Column1))
lines(density(MyData$Column2))
그러나 첫 번째 플롯의 한계가 적합한 지 확인하십시오.
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)
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))
다음을 제공합니다.
완전한 세트를 제공하기 위해 다음을 사용하는 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"))
다음과 같은 플롯을 생성합니다.
위의 격자 예제를 사용하여 멋진 기능을 만들었습니다. 용융 / 주조를 통해 모양을 변경하는 더 좋은 방법이있을 것입니다. (개선이 보이면 주석을 달거나 편집하십시오.)
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))
그것이 내가 기본에서하는 방법입니다 (실제로 첫 번째 답변 주석에 언급되어 있지만 아직 주석을 달 수 없으므로 범례를 포함하여 여기에 전체 코드를 표시하겠습니다 ...)
먼저 밀도 플롯에서 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"))
축 제한이 일치하지 않는 문제가있을 때마다 base
그래픽 에서 올바른 도구 는를 사용하는 것 matplot
입니다. 핵심은 from
및 to
인수를 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
받아들이는 모든 표준 plot
/ par
인수, 예를 들어 lty
, type
, col
, lwd
, ...).
참고 URL : https://stackoverflow.com/questions/6939136/how-to-overlay-density-plots-in-r
'Nice programing' 카테고리의 다른 글
튜플에 값을 추가하는 방법? (0) | 2020.10.23 |
---|---|
엔티티 프레임 워크가 조인을 남겼습니다. (0) | 2020.10.23 |
자바 하우투 ArrayList 푸시, 팝, 시프트 및 시프트 해제 (0) | 2020.10.23 |
iOS를 통해 애니메이션 GIF를 만들고 내보내시겠습니까? (0) | 2020.10.23 |
ManyRelatedManager 개체는 반복 할 수 없습니다. (0) | 2020.10.23 |