我是R的新手。对于作业,我必须创建一个带有基本R中的误差条的分组条形图(因此不允许使用包),格子和ggplot2。对于基础R图,我编写了一些数据,我试图生成一个简单的条形图:
San_Diego <- c(65,20,74)
Rosarito <- c(34,35,23)
La_Paz <- c(21,71,28)
Mating_strategy <- c("Ultradominant","Dominant","Sneaker")
col <- c("darkorange1","skyblue3","gold2")
lizards <- data.frame(row.names=Mating_strategy, San_Diego,
Rosarito, La_Paz)
lizards.matrix <- as.matrix(lizards)
barplot(lizards.matrix,
beside=T,
col=col,
ylim=c(0,80),
xlab="Site",ylab="Frequency",
legend.text=row.names(lizards.matrix),
args.legend=list(x="top",bty="n"),
las=1,
cex.axis=1.2)
但现在我不得不尝试在我的图表中添加错误栏。我尝试按照这里所描述的那样做(http://sickel.net/blogg/?p=1284)但我并不真正理解他们在做什么,当我尝试它时,它产生了一个完全不同的,无法使用的图形。我也在网上找到了这个解决方案(http://imgur.com/126hJSI)但是我不明白我应该在哪里得到我的数据的ucl和lcl值,所以这样做也没那么好。
我担心我有很多需要学习但我希望有人可以帮助我。
提前致谢,
Marlies
答案 0 :(得分:1)
关注http://sickel.net/blogg/?p=1284后,我在条形图中添加了错误条,如下所示。
首先,我运行定义样本数据的代码(即直到定义lizard.matrix
的行的所有内容。之后,可以通过以下代码创建绘图:
# create bar plot
bp <- barplot(lizards.matrix,
beside=T,
col=col,
ylim=c(0,100),
xlab="Site",ylab="Frequency",
legend.text=row.names(lizards.matrix),
args.legend=list(x="top",bty="n"),
las=1,
cex.axis=1.2)
# create matrix of errors
lizards.error = matrix(c(10, 5, 12, 10, 8, 6, 12, 28, 3), ncol = 3)
# add vertical part of error bars
segments(bp, lizards.matrix - lizards.error, bp, lizards.matrix + lizards.error)
# horizontal parts of error bars
ew <- (bp[2,1]-bp[1,1])/4
segments(bp - ew, lizards.matrix - lizards.error, bp + ew, lizards.matrix - lizards.error)
segments(bp - ew, lizards.matrix + lizards.error, bp + ew, lizards.matrix + lizards.error)
代码的工作原理如下:
我利用了这样一个事实:barplot()
返回一个包含条形水平坐标的矩阵。因此,我将barplot()
的输出存储在变量bp
中供以后使用。另请注意,我更改了ylim()
的范围,以确保错误栏的图中有足够的空间。
然后我定义lizards.error
,其中包含绘图中每个条形的错误。其结构遵循lizards.matrix
的结构。所以lizards.error[1, 1]
包含高度为“lizards.matrix [1,1]”的栏的错误。
然后使用函数segments()
绘制误差线。与基数R中的许多绘图函数一样,此函数会为现有绘图添加一些内容。它的四个相关参数是x0
y0
,x1
,y1
,它们定义了连接(x0
,y0
定义的点对的线段)和(x1
,y1
)。如果这些参数是向量,则向量的每个分量定义一个点对,使得线段连接点(x0[i]
,y0[i]
)和(x1[i]
,y1[i]
)适用于所有i
。
segments()
现在用于定义组成错误栏的三个段中的每一个。首先,垂直部分,其中水平坐标与误差条相同,因此可以使用bp
。垂直坐标是根据条形高度(lizards.matrix
)和误差大小(lizards.error
)计算的。
错误条的两条水平线类似地生成。在这里,您还需要定义线条的宽度,这是根据相邻条形之间的距离计算出来的。条形的水平坐标存储在bp
中,因此条形之间的距离(或等效地,条形的宽度)可以根据两个相邻坐标之间的差异来计算:bp[2,1]-bp[1,1]
。 (bp
是一个矩阵,[i, j]
获取i
行和j
列中的矩阵元素。)
编辑:正如rawr指出的那样,使用arrows()
的一次调用而不是三次调用segments()
,可以获得类似的结果:
arrows(bp, lizards.matrix - lizards.error, bp, lizards.matrix + lizards.error,
code = 3, angle = 90, length = 0.15)
segments()
完全相同。code = 3
告诉函数在该行的两端绘制箭头。angle
是箭头的轴与形成箭头的线之间的角度。 90度的角度导致水平线。这个解决方案显然更简单,因为它将三个函数调用替换为一个。我看到的唯一缺点是误差条的宽度(length
参数)以英寸为单位,这样当渲染绘图的大小发生变化时,它可能会发生变化。在segments()
的情况下,误差线的宽度以水平坐标表示。