2016-03-28 13 views
4

私はxの年の日(誕生日を表す)を表すデータセットを持っており、この密度グラフを作成したいと考えています。 さらに、いくつかのグループ情報(男の子や女の子)があるので、私はggplot2の機能を使って密度プロットを作成したいと考えています。ggplot2循環データの密度

最初は十分に簡単:

require(ggplot2); require(dplyr) 
bdays <- data.frame(gender = sample(c('M', 'F'), 100, replace = T), bday = sample(1:365, 100, replace = T)) 
bdays %>% ggplot(aes(x = bday)) + geom_density(aes(color = factor(gender))) 

しかし、これは、エッジ効果の貧弱な推定を与えます。 私は、365 + 1 = 1となるように循環座標を使用できるという事実を適用したい.12月31日の1日後は1月1日である。 circularパッケージはこの機能を提供していますが、stat_function()呼び出しを使用して実装することは成功していません。私は極性を捜しているわけではない - 私はファセットを使用することができるようにしたいので、私は、aes呼び出しをggplot2を使用するため それはまた、明確化のために、私はgeom_densityのように見える何かをしたいなど、

特に便利ですこの図は、Circular density plot using ggplot2に示されているようなプロットです。

+0

これは、[本当にきちんとした例](HTTPです.com/q/13887365/2572423)、これは有用であり、これを濃度ではなく円形のヒートマップとして表示しようとします。 – JasonAizkalns

答えて

7

エッジエフェクトを削除するには、データの3つのコピーをスタックし、密度の見積もりを作成してから、データの中央コピーの密度のみを表示します。これは、あるエッジから他のエッジへの密度関数の連続性を保証します。

元のプロットと新しいバージョンを比較した例を以下に示します。私はadjustパラメータを使用して、2つのプロット間で同じ帯域幅を設定しました。また、あなたがそれらを1に追加したい場合は、環状のバージョンでは、あなたが密度を再正規化する必要があります。注://のstackoverflow:

set.seed(105) 
bdays <- data.frame(gender = sample(c('M', 'F'), 100, replace = T), bday = sample(1:365, 100, replace = T)) 

# Stack three copies of the data, with adjusted values of bday 
bdays = bind_rows(bdays, bdays, bdays) 
bdays$bday = bdays$bday + rep(c(0,365,365*2),each=100) 

# Function to adjust bandwidth of density plot 
# Source: http://stackoverflow.com/a/24986121/496488 
bw = function(b,x) b/bw.nrd0(x) 

# New "circularized" version of plot 
bdays %>% ggplot(aes(x = bday)) + 
    geom_density(aes(color = factor(gender)), adjust=bw(10, bdays$bday[1:100])) + 
    coord_cartesian(xlim=c(365, 365+365+1), expand=0) + 
    scale_x_continuous(breaks=seq(366+89, 366+365, 90), labels=seq(366+89, 366+365, 90)-365) + 
    scale_y_continuous(limits=c(0,0.0016)) 
    ggtitle("Circularized") 

# Original plot 
ggplot(bdays[1:100,], aes(x = bday)) + 
    geom_density(aes(color = factor(gender)), adjust=bw(30, bdays$bday[1:100])) + 
    scale_x_continuous(breaks=seq(90,360,90), expand=c(0,0)) + 
    ggtitle("Not Circularized") 

enter image description here

+0

私の問題を解決します - ほぼ直感的には簡単です。 – mbarete