在同一图中叠加两个或多个子集

时间:2017-08-23 17:08:50

标签: r plot subset frequency density-plot

我试图在一张图中可视化我的数据的3级子集,用于两种不同的治疗方法。

我想想象年龄分布仅1年(2007年),只有一个项目(纹身),女性和男性分开。

我能够将我的数据集减少到只有女性,仅在2007年,并且仅用于纹身:

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

使用此代码,我可以看到数据的频率分布。 3 tier subset

但是,我无法使用该代码做两件事:

  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年,只能使用纹身。

    我的问题有两个:

    1. 是否可以在女性频率数据上叠加男性数据(2007年和纹身)?

    2. 如何将密度数据限制为仅2007和纹身?

    3. 我已经提供了我的数据的子集here

      更新:对于频率直方图,我试图用每个箱子中相邻的女性和男性的条形图来显示数据。

3 个答案:

答案 0 :(得分: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

顺畅的替代方案是使用ggplot2和 kassambara

的easyGgplot2包
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

答案 1 :(得分: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")

答案 2 :(得分: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