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

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")) 通过这段代码,我可以看到我

我试图将我的数据的三级子集可视化为两种不同处理的一个图形

我只想想象一下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年和纹身

  • 我已经提供了我的一部分数据


    更新:对于频率柱状图,我正在尝试可视化数据,每个箱子的女性和男性栏彼此相邻。

    我建议在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")