2

我是 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 值,所以效果也不是很好。

恐怕我有很多东西要学,但我希望这里有人可以帮助我。

提前致谢,

马利斯

4

1 回答 1

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定义的点对的线段。如果这些参数是向量,则向量的每个分量都定义一个点对,这样线段将所有 的点 ( , ) 和 ( , )连接起来。x0y0x1y1x0[i]y0[i]x1[i]y1[i]i

  • segments()现在用于定义构成误差条的三个段中的每一个。首先,垂直部分,其中水平坐标与误差线相同,因此bp 可以用于此。垂直坐标由条形高度 ( lizards.matrix) 和误差大小( ) 计算得出lizards.error

  • 误差线的两条水平线的产生方式类似。在这里,您还需要定义线条的宽度,该宽度是根据相邻条形之间的距离计算得出的。条形的水平坐标存储在bp,因此条形之间的距离(或等效地,条形的宽度)可以从两个相邻坐标之间的差值中计算出来:bp[2,1]-bp[1,1]. (bp是一个矩阵,获取第-行第-列[i, j]的矩阵元素。)ij

编辑:正如 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(),误差线的宽度是根据水平坐标给出的。

于 2015-12-27T15:03:01.377 回答