web-dev-qa-db-ja.com

Rで密度プロットを重ねる方法は?

同じデバイスに2つの密度プロットをRでオーバーレイしたいのですが、どうすればよいですか? Webを検索しましたが、明らかな解決策は見つかりませんでした(私はRが初めてです)。

私の考えは、テキストファイル(列)からデータを読み取り、使用することです

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

この精神で何か...

前もって感謝します

73
pasta

2番目のものにはlinesを使用します。

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

ただし、最初のプロットの制限が適切であることを確認してください。

82
cbeleites

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)

enter image description here

42
Chase

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

与えるもの:

enter image description here

16

完全なセットを提供するために、以下にlatticeを使用したChaseの回答のバージョンを示します。

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

次のようなプロットが生成されます。 enter image description here

12
joran

上記の格子の例を使用して、気の利いた関数を作成しました。おそらく、メルト/キャストを介した形状変更でこれを行うより良い方法があります。 (改善が見られたらコメントまたは編集してください。)

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

それは私がベースでそれを行う方法です(実際には最初の回答のコメントで言及されていますが、ここでは完全なコードを表示します(まだコメントできないため、凡例を含む)...)

最初に、密度プロットから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
R. Prost

軸制限の不一致の問題があるときはいつでも、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))

enter image description here

必要に応じてベルとホイッスルを追加します(matplotはすべての標準plot/par引数を受け入れます。たとえば、ltytypecollwd、...)。

2
MichaelChirico