2017-08-23 42 views
1

2つの異なる処理のために、私のデータの3レベルのサブセットを1つの図で視覚化しようとしています。2つ以上のサブセットを同じプロットに重畳する

年齢の分布を1年(2007年)、1つのアイテム(入れ墨)のみ、女性と男性を別々に視覚化したいと考えています。

私は2007年に、唯一の女性に自分のデータセットを削減することができるよ、とだけ使用して入れ墨のために:

with(data[(data$sex=="F") & (data$yy=="2007") & (data$item=="tattoo"),], plot(age, xlab="Age of Females", ylab="Frequency")) 

をこのコードでは、私は私のデータの頻度分布を見ることができています。 3 tier subset

しかし、私は2つのことを行うために、そのコードを使用して、できないのです:

  1. は男性

  2. のために複数の階層サブセットを重ね合わ密度プロット

  3. としてデータを視覚化

私が一番近かったのは、このコードを使用したことです:

library(sm) 
sm.density.compare(age, sex, xlab="Age (years)") 
legend(50,0.12, c("Female","Male"), col=c("red", "green"), pch=c(16,16), title="Sex", box.lty=0) 

それはこの数字を与える: Density plot

しかし、このコードで、私は2007年だけでタトゥーに制限するデータを取得することができません。

私の質問は2倍です:

  1. は、女性の周波数データに(2007年および入れ墨のための)男性のデータを重畳することが可能ですか?

  2. どのようにして密度データを2007年とタトゥーに制限できますか?

私は利用可能なデータのサブセットをhereとしました。

更新:周波数ヒストグラムでは、私は各ビンのお互いに隣接する女性と男性のバーでデータを視覚化しようとしています。

+0

によってggplot2とeasyGgplot2パッケージを使用することです。 'lines(density(your_second_data_subset))' –

答えて

2

標準Rで

を次のようにあなたが行うことができますプロット
with(data[(data$sex=="F") & (data$yy=="2007") & (data$item=="tattoo"),], plot(density(age))) 
with(data[(data$sex=="M") & (data$yy=="2007") & (data$item=="tattoo"),], lines(density(age), col = "red")) 
segments(50,0.1,52,0.1, col = "black") 
text(52,0.1, pos = 4, labels = "Female") 
segments(50,0.09,52,0.09, col = "red") 
text(52,0.09, pos = 4, labels = "Male") 

enter image description here

滑らかな代替案は、密度プロット使用 `プロット(密度(your_data_subset))を`取得するkassambara

library(devtools) 
install_github("kassambara/easyGgplot2") 
library(easyGgplot2) 
library(ggplot2) 
my.subset <- data[(data$yy=="2007") & (data$item=="tattoo"),] 
ggplot2.histogram(data=my.subset, xName='age',binwidth = 2, 
        groupName='sex', legendPosition="top", 
        alpha=0.5, position="identity") 

enter image description here

+0

あなたが提案した最初の行を実行しようとすると、次のようなエラーが表示されます:density.default(age)の引数: 'x'は数字でなければなりません –

+1

このようにデータを読み込みます 'data < - read.delim .txt "、header = TRUE、as.is = TRUE)' –

+0

それは問題を解決しました!私の質問のパート2に対するあなたの答えが働いた。私の質問のパート1(周波数プロット)について何か提案がありますか? –

0

プロットする前に、2007年までにデータをサブセット化し、タトゥーすることをお勧めします。

date <- c(rep(2006-07-15,7),rep(2007-07-15,14)) 
yy <- c(rep(2006,7), rep(2007,14)) 
sex <- c(rep("F",4),"M", "M",rep("F",4),rep("M",4),rep("F",3),rep("M",4)) 
item <- c(rep("piercing",8), rep("tattoo",5), "jewel",rep("tattoo",7)) 
age <- c(rep(22,8), rep(25,3), rep(34,2), 41, 37,rep(28,2), rep(31,3), 39) 

df <- data.frame(date,yy,sex,item,age) 
df2 <- subset(df, df$yy == 2007 & df$item == "tattoo") 


d <- density(df2$age[df2$sex=='F']) 
plot(d, main="Density", xlab="Age", col="red") 
lines(density(df2$age[df2$sex=='M']), col="blue") 

legend("topright", legend=c("Female","Male"), col=c("red","blue"), lty=c(1,1), title="Sex") 

enter image description here

あなたの代わりにヒストグラムプロットをオーバーレイしたい場合は、この使用することができます:あなたが側でヒストグラム側を取得したい場合は

hist(df2$age[df2$sex=='F'], col=rgb(1,0,0,0.5), main="Histogram", xlab="Age") 
hist(df2$age[df2$sex=='M'], col=rgb(0,0,1,0.5), add=T) 

enter image description here

を、ベースRではやや複雑です。ここではいくつかのコードは次のとおりです。

breaks <- pretty(range(c(df2$age[df2$sex=='F'], df2$age[df2$sex=='M'])), n=10) 
h1 <- hist(df2$age[df2$sex=='F'], breaks=breaks, plot=F)$counts 
h2 <- hist(df2$age[df2$sex=='M'], breaks=breaks, plot=F)$counts 
new_h <- rbind(h1,h2) 
colnames(new_h) <- paste(breaks[-length(breaks)], breaks[-1], sep="-") 

barplot(new_h, beside=TRUE, main="Histogram", xlab="Age") 

enter image description here

+0

私はコードを40歳に制限することなく実行する方法を理解するのに苦労しています。ここでやったよ。私が行ったようにデータを制限することなくコードを実行しようとすると、数値ではない「x」という引数についてエラーが発生します。また、ヒストグラムについては、お互いの上にではなく、お互いに隣接するビンをプロットすることは可能ですか? –

+0

サンプルデータを使用しました(40歳までの制限なし)。データフレームの年齢が数値であることを確認する必要があります。はい、それを横にすることは可能です。私はそのコードを表示するために私の応答を編集します。 – user108363

+0

あなたの応答を編集して、それを表示していただきありがとうございます。私はあまりにも試してみましょう! –

1

使用density秒以上の密度プロット

を追加するには、密度プロットと linesを取得するために
plot(density(data[data$sex=="F" & data$yy=="2007" & data$item=="tattoo" ,]), col="red") 
lines(density(data[data$sex=="M" & data$yy=="2007" & data$item=="tattoo" ,]), col="green") 
関連する問題