1

编辑:根据下面的评论,我决定更加明确。所以这是我正在处理的数据的一个例子。

> example_data
   A     B        outcome
1  2.31  1.47       Y
2  2.14  1.32       N
3  3.49  1.00       Y
4  2.12  0.62       Y
5  0.47  0.55       N
6  3.36  0.50       N
7  3.50  0.33       Y
8  1.97  0.39       Y
9  3.12  0.99       N
10 2.04  0.89       Y
11 2.78  0.36       Y
12 1.83  0.70       N
13 3.53  0.77       N
14 2.25  0.39       N
15 1.67  0.43       N
16 3.09  1.10       Y

所以,我有两个变量AB. 它们是较大变量的子组,因此可以在同一 y 轴上表示。我想按另一个outcome具有两个级别的变量对它们进行分组。

我执行以下操作

> dataset <- example_data
> attach(dataset)
> means1<- tapply(A,outcome,function(x) mean(x,na.rm=TRUE))
> means2<- tapply(B,outcome,function(x) mean(x,na.rm=TRUE))
> std.err1<- tapply(A,outcome,function(x)sd(x,na.rm=TRUE)/sqrt(length(na.omit(x))))
> std.err2<- tapply(B,outcome,function(x)sd(x,na.rm=TRUE)/sqrt(length(na.omit(x))))
> matrix_means<- matrix(c(means1,means2),byrow = TRUE)
> graph<- barplot(matrix_means, beside=TRUE, space=c(0.2,0,0.2,0), axes=FALSE, ann=FALSE, col=c("white","black","red","blue"),ylim=c(0,4), names=c("Outcome-N","Outcome-Y","Outcome-N","Outcome-Y"), xpd=FALSE)
> axis(2, cex.axis=1.5)

现在我还需要使用箭头函数在mean+sem每个组的平均值和平均值之间绘制 SEM 条。

我可以使用 SEM 获取 SEM tapply,但不知道如何将箭头放置在 4 个条上。

> arrows(graph, means1, graph, means1 + std.err1, graph, means2, graph, means2 + std.err2, code=3, angle=90, length=0.1)

这不会在图上放置任何箭头。

使用base图形而不是ggplot2,我该怎么做?有人可以帮忙吗?我所有的其他图表都是使用 中的GrapheR包完成的R,所以我也尝试使用基本图形来完成这个,这样它们在我的手稿中看起来都一样。

谢谢。

4

1 回答 1

0

RS 是正确的,如果您制作MCVE,我们会更容易理解您的问题并了解如何提供帮助。如果您的数据集非常大并且很难从中创建一个合理的子集,那么预加载的数据集可以派上用场。您可以通过运行获取可用内容的列表data(package="datasets")

在这种情况下,您的问题非常笼统,从您所写的内容来看,您已经完成了一半以上。graph您制作的对象包含相关的 x 值。使用平均值和 SEM 值,您已经知道箭头应该从哪里开始以及它们应该延伸多远,所以您所要做的就是将此信息arrow作为向量传递给函数,您就可以了。

由于您没有提供任何可使用的数据,我将使用mtcars数据集进行演示。

data(mtcars)

summ.df <- data.frame(
  mean=tapply(mtcars$hp, mtcars$cyl, mean),
  sd=tapply(mtcars$hp, mtcars$cyl, sd),
  n=tapply(mtcars$hp, mtcars$cyl, length))

summ.df$sem <- summ.df$sd/sqrt(summ.df$n)

par(mar=c(2.5, 2.5, 2, 1.5))
bplt <- barplot(summ.df$mean, col="white")
arrows(bplt, summ.df$mean+summ.df$sem, 
       bplt, summ.df$mean-summ.df$sem, 
       angle=90, code=3, xpd=NA, length=0.1)

带误差线的条形图 (1 SE)

回复更新
调用arrows是给您带来麻烦的原因。如果您阅读文档 ( ?arrows),您会看到前四个参数是箭头起点和终点的 x 和 y 坐标。对于每个箭头,开始和结束 x 值相同(它们完全垂直)并由 给出graph,而结束和开始 y 值分别由平均值 ± SEM 给出。

因此,您将通过调用获得正确的结果

arrows(graph, c(means1, means2) + c(std.err1, std.err2), 
       graph, c(means1, means2) - c(std.err1, std.err2), 
       code=3, angle=90, length=0.1)
于 2017-03-23T21:06:44.547 回答