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

Superimposing two or more subsets in same plot

我正在尝试在一张图中针对两种不同的处理方式可视化我的数据的 3 级子集。

我想可视化仅 1 年(2007 年)的年龄分布,仅针对一项(纹身),并且分别针对女性和男性。

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

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

使用这段代码,我可以看到我的数据的频率分布。

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

  1. 将数据可视化为密度图

  2. 叠加男性的多层子集

我最接近的是使用此代码:

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)

它给出了这个数字:

但是,使用此代码,我无法获取仅限于 2007 年且仅限纹身的数据。

我的问题有两个:

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

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

我已经提供了一部分数据 here

更新:对于频率直方图,我试图用每个箱子彼此相邻的女性和男性条形图来可视化数据。

我建议在绘制之前将 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")

如果你想覆盖直方图,你可以使用这个:

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)

如果你想并排获得直方图,在 base 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")

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

使用标准 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")

一个平滑的替代方法是使用 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")