我试图将下面的数据绘制成直方图,其中雌性(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.sl
和females.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)
轴是单独绘制的,因为我想自定义刻度线和标签。
结果图应如下所示:
然后我环顾四周,看看如何将频率转换为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)
然而,结果相当奇怪,你可以在这里看到:
我知道y轴上的刻度标签是相同的,但是如果我没有弄错的话,那应该没关系;无论y轴范围如何,条形应至少显示相同的分布和相对高度。
知道为什么这些条形似乎已“折叠”成四个条形,而不是第一个图形中的10条左右?另外,请记住,这些单独的直方图将绘制为多面板图形的一部分。如果可能的话,我还想打印样本大小和垂直线,表明男性和女性数据的平均值。
我期待您的回复。
问候,
丹尼尔