R 在同一绘图中叠加两个或多个子集
我试图将我的数据的三级子集可视化为两种不同处理的一个图形 我只想想象一下1岁(2007年)、一个项目(纹身)以及女性和男性的年龄分布 我能够将我的数据集缩减为仅限女性,仅限2007年,并且仅限纹身使用:R 在同一绘图中叠加两个或多个子集,r,plot,subset,frequency,density-plot,R,Plot,Subset,Frequency,Density Plot,我试图将我的数据的三级子集可视化为两种不同处理的一个图形 我只想想象一下1岁(2007年)、一个项目(纹身)以及女性和男性的年龄分布 我能够将我的数据集缩减为仅限女性,仅限2007年,并且仅限纹身使用: with(data[(data$sex=="F") & (data$yy=="2007") & (data$item=="tattoo"),], plot(age, xlab="Age of Females", ylab="Frequency")) 通过这段代码,我可以看到我
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年之前对数据进行子集设置,并在绘图之前进行纹身
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")
如果要并排获取直方图,则以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")
中断使用密度
获得密度图,使用行
添加第二个或更多密度图
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")
一个平滑的替代方案是使用kassambara的ggplot2和EasyGplot2包
库(devtools)
安装github(“kassambara/easyGgplot2”)
库(EasyGplot2)
图书馆(GG2)
my.subset要获得密度图,请使用绘图(密度(您的数据\u子集))
。如果要添加额外的密度图,请使用行
,例如:行(密度(你的第二行数据子集))
当我尝试运行你建议的第一行时,我得到的错误是:密度错误。默认值(年龄):参数“x”必须是数字以这种方式读取数据解决问题的数据!你对我问题第二部分的回答有效。你对我问题的第一部分(频率图)有什么建议吗?我建议了一个基于ggplot2的替代方案。希望这会有用。我还在学习如何使用ggplot函数。但是,这对我来说是一个很好的起点。非常感谢。我正在努力理解如何运行我的代码,而不必像您在这里所做的那样将代码限制在40年前。当我尝试在不限制数据的情况下运行代码时,我得到一个错误,参数“x”不是数字。此外,对于柱状图,是否可以绘制相邻的垃圾箱,而不是相互重叠的垃圾箱?我使用了样本数据(因此不限制40岁)。您应该检查数据框中的年龄是否为数字。是的,可以把它们放在旁边。我将编辑我的回复以显示该代码。感谢您编辑您的回复以显示该代码。我也会试试看!
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")
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")