我试图在一张图中可视化我的数据的3级子集,用于两种不同的治疗方法。
我想想象年龄分布仅1年(2007年),只有一个项目(纹身),女性和男性分开。
我能够将我的数据集减少到只有女性,仅在2007年,并且仅用于纹身: p>
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。
更新:对于频率直方图,我试图用每个箱子中相邻的女性和男性的条形图来显示数据。
答案 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")
顺畅的替代方案是使用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")
答案 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")
如果您想重叠直方图,可以使用:
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)
如果你想并排获得直方图,它在基数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")