在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)
- 垂直线所覆盖的范围与 for 完全相同
segments()
。
code = 3
告诉函数在线的两端画箭头。
angle
是箭头的轴和形成箭头的线之间的角度。90 度角通向一条水平线。
这个解决方案显然更简单,因为它将三个函数调用替换为一个。我看到的唯一缺点是误差线(length
参数)的宽度以英寸为单位,因此当绘制绘图的大小改变时它可能会改变。在 的情况下segments()
,误差线的宽度是根据水平坐标给出的。