将频率转换为hist()中的百分比会改变数据的分布

时间:2017-01-18 05:37:08

标签: r plot histogram frequency-distribution

我试图将下面的数据绘制成直方图,其中雌性(f)标准长度数据(sl)由男性(m)标准长度数据(sl)覆盖,频率显示为比例样本中的个人总数;

   habitat     location sex    sl
1       river        bargo   f 45.75
2       river        bargo   f 38.53
3       river        bargo   m 38.80
4       river        bargo   m 38.04
5       river        bargo   f 43.12
6       river        bargo   f 37.44
7       river        bargo   f 38.87
8       river        bargo   f 41.80
9       river        bargo   f 41.94
10      river        bargo   m 41.86
11      river        bargo   m 45.74
12      river        bargo   f 46.38
13      river        bargo   f 33.32
14      river        bargo   f 28.94
15      river        bargo   f 26.81
16      river        bargo   f 32.72
17      river        bargo   f 28.86
18      river        bargo   f 26.37
19      river        bargo   f 27.66
20      river        bargo   f 28.24
21      river        bargo   f 26.07
22      river        bargo   f 36.18
23      river        bargo   f 38.37
24      river        bargo   f 38.31
25      river        bargo   f 45.47
26      river        bargo   f 41.08
27      river        bargo   f 41.53
28      river        bargo   f 48.23
29      river        bargo   f 45.31
30      river        bargo   f 48.93
31      river        bargo   f 36.13
32      river        bargo   f 38.24
33      river        bargo   f 38.93
34      river        bargo   f 36.20
35      river        bargo   f 33.95
36      river        bargo   f 34.04
37      river        bargo   f 33.31
38      river        bargo   f 32.96
39      river        bargo   f 39.64
40      river        bargo   f 31.61
41      river        bargo   f 34.72
42      river        bargo   f 35.09
43      river        bargo   f 33.48
44      river        bargo   f 31.93
45      river        bargo   f 31.74
46      river        bargo   f 32.95
47      river        bargo   f 35.03
48      river        bargo   m 31.35

使用以下代码: 1)对数据进行子集化,我将子集函数用于两个因子,因为bargo是我数据集中的11个组之一;

    males.bar<-subset(mydata, mydata$location=="bargo" & mydata$sex=="m", select="sl")

    males.bar.sl<-as.numeric(males.bar$sl)

    females.bar<-subset(mydata,mydata$location=="bargo" & mydata$sex=="f", select="sl")

    female.bar.sl<-as.numeric(females.bar$sl)

最初我尝试使用以下代码绘制它们以生成直方图本身并使布局正确。 males.bar.slfemales.bar.sl是使用上述子集调用从我提供的示例数据中提取的子集化数据。

par(mar=c(.5,1,1.5,.5), mgp=c(1.25,.75,0))
hist(males.bar.sl, axes=F, col=rgb(1, 0, 0, 0.5), xlim=c(18,60), ylim=c(0,17), breaks=seq(18,60,by=1), main=NULL, xlab=NULL, ylab=NULL, freq=F)
hist(female.bar.sl, axes=F, col=rgb(0, 0, 1, 0.2),  breaks=seq(18,60,by=1), add=T, freq=F)
title("Bargo River", line=-2)
box()
axis(1, at=seq(20,60,by=5), labels=F, tck=.02, padj = -1)
axis(2, at=seq(0,17,by=2), labels=F, tck=.02, padj=1)

轴是单独绘制的,因为我想自定义刻度线和标签。 结果图应如下所示: bargo frequency histogram plot 然后我环顾四周,看看如何将频率转换为y轴上的百分比,并确定最简单的方法就是这个: Use hist() function in R to get percentages as opposed to raw frequencies

所以我尝试将其合并到上面显示的代码中,如下所示:

par(mar=c(.5,2.25,1.5,.5), mgp=c(1.25,.75,0))
hist((males.bar.sl$counts/(males.bar.sl$counts+females.bar.sl$counts)*100), axes=F, col=rgb(1, 0, 0, 0.5), xlim=c(18,60), ylim=c(0,17), breaks=seq(18,60,by=1), main=NULL, xlab=NULL, ylab="Frequency", Freq=T)
hist((females.bar.sl$counts/(males.bar.sl$counts+females.bar.sl$counts)*100), axes=F, col=rgb(0, 0, 1, 0.2),  breaks=seq(18,60,by=1), add=T, Freq=T)
title("Bargo River", line=-2)
box()
axis(1, at=seq(20,60,by=5), labels=F, tck=.02, padj = -1)
axis(2, at=seq(0,17,by=2), labels=T, tck=.02, padj=1) 

然而,结果相当奇怪,你可以在这里看到:bargo histogram with data converted to percentage

我知道y轴上的刻度标签是相同的,但是如果我没有弄错的话,那应该没关系;无论y轴范围如何,条形应至少显示相同的分布和相对高度。

知道为什么这些条形似乎已“折叠”成四个条形,而不是第一个图形中的10条左右?另外,请记住,这些单独的直方图将绘制为多面板图形的一部分。如果可能的话,我还想打印样本大小和垂直线,表明男性和女性数据的平均值。

我期待您的回复。

问候,

丹尼尔

0 个答案:

没有答案