在同一图中叠加两个或多个子集
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"))
使用这段代码,我可以看到我的数据的频率分布。
但是,我无法使用该代码做两件事:
将数据可视化为密度图
叠加男性的多层子集
我最接近的是使用此代码:
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 年且仅限纹身的数据。
我的问题有两个:
是否可以将男性数据(2007年和纹身)叠加在女性频率数据上?
如何将密度数据限制为仅 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")
我正在尝试在一张图中针对两种不同的处理方式可视化我的数据的 3 级子集。
我想可视化仅 1 年(2007 年)的年龄分布,仅针对一项(纹身),并且分别针对女性和男性。
我能够将我的数据集减少到只有女性,仅在 2007 年,并且仅用于纹身使用:
with(data[(data$sex=="F") & (data$yy=="2007") & (data$item=="tattoo"),], plot(age, xlab="Age of Females", ylab="Frequency"))
使用这段代码,我可以看到我的数据的频率分布。
但是,我无法使用该代码做两件事:
将数据可视化为密度图
叠加男性的多层子集
我最接近的是使用此代码:
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 年且仅限纹身的数据。
我的问题有两个:
是否可以将男性数据(2007年和纹身)叠加在女性频率数据上?
如何将密度数据限制为仅 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")