Rで密度プロットをオーバーレイする方法は?


82

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

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

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

またはこの精神の何か。


以下のためにggplot2家族、パッケージ「今そこにあるggridgesこれを行うことができます」。
梁張

回答:


96

lines2番目のものに使用します:

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

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


9
+1 2つの密度の範囲が異なり、2番目の曲線がプロットの制限内に収まらない場合は、もう少し複雑なものが必要になることがあります。次に、プロットする前に密度を計算し、2つの密度推定オブジェクトを含むオブジェクトであるwhereとareylimを使用して適切な計算を行うことができます。の呼び出しでこれを使用します。range(dens1$y, dens2$y)dens1dens2ylimplot()
Gavin Simpson

2
また、2つの線を区別することもできます。ここでは、線幅(lwd)、線種(lty)、または線の色(col)を設定すると便利です。その時点で、legend()
nullglob 2011

@Gavin OPがファイルから読み取っている場合、データを読み取り(sapply、lapply)、すべてのデータセットの範囲を見つけ、デフォルトの範囲をすべての最大範囲に設定してからプロットする複雑な関数を作成します(行)密度。
ローマLuštrik

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のdata.frameは、最初に長い形式に溶融する必要があります。ggplot (melt (MyData), mapping = aes (fill = variable, x = value)) + geom_density (alpha = .5)
cbeleitesはSXに不満を持っています2011

1
素敵なプロット。「dat2」とは...?「溶ける」とは何ですか(コマンドが見つかりません)?
Erik Aronesty 2013

@ ErikAronesty-あなたはこの時点で私のものと同じくらい良いと思います、私は2年前にこれに答えました!私datは自分の環境に別のオブジェクトという名前が付けられていると推測しdat2ます...私が提供するシミュレートされたデータは宣伝どおりに機能します。melt()コマンドは、パッケージから来ていますreshape2。2011年にreshape2は、が読み込まれると自動的に読み込まれましたggplot2が、現在はそうではないため、library(reshape2)個別に行う必要があります。
2013

23

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)と、機能するはずです。
KarolisKoncevič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.framedensityplot(~rnorm(100)+rnorm(100, 10, 5), plot.points=FALSE, ref=TRUE, auto.key = list(space = "right"))。またはOPデータの場合densityplot(~Column1+Column2, data=myData)
マレク2011

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ような3つの異なる分布があるとしましょう。

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)

次のように3つの異なる分布を取得できます。

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への呼び出しの出力を示すプロット。 2つの曲線が観察されます。1つは赤、もう1つは黒です。 黒の曲線は赤よりも高く伸びていますが、赤の曲線は「太い」曲線です。

必要に応じて添えものを追加します(matplot受け入れ、すべての標準plot/par引数、例えばltytypecollwd、...)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.