错误条形图基数R.

时间:2015-12-27 14:26:52

标签: r charts errorbar

我是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

1 个答案:

答案 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)

enter image description here

代码的工作原理如下:

  • 我利用了这样一个事实:barplot()返回一个包含条形水平坐标的矩阵。因此,我将barplot()的输出存储在变量bp中供以后使用。另请注意,我更改了ylim()的范围,以确保错误栏的图中有足够的空间。

  • 然后我定义lizards.error,其中包含绘图中每个条形的错误。其结构遵循lizards.matrix的结构。所以lizards.error[1, 1]包含高度为“lizards.matrix [1,1]”的栏的错误。

  • 然后使用函数segments()绘制误差线。与基数R中的许多绘图函数一样,此函数会为现有绘图添加一些内容。它的四个相关参数是x0 y0x1y1,它们定义了连接(x0y0定义的点对的线段)和(x1y1)。如果这些参数是向量,则向量的每个分量定义一个点对,使得线段连接点(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)

enter image description here

  • 垂直线所涵盖的范围与segments()完全相同。
  • code = 3告诉函数在该行的两端绘制箭头。
  • angle是箭头的轴与形成箭头的线之间的角度。 90度的角度导致水平线。

这个解决方案显然更简单,因为它将三个函数调用替换为一个。我看到的唯一缺点是误差条的宽度(length参数)以英寸为单位,这样当渲染绘图的大小发生变化时,它可能会发生变化。在segments()的情况下,误差线的宽度以水平坐标表示。