如何在R中的条形图中叠加回归线?

时间:2017-09-09 08:21:31

标签: r

所以我想在R中的条形图中叠加回归线。类似于Rosindell等人的附图。但是,当我尝试使用我的数据执行此操作时,该行不会延伸条形图的整个长度。

对于一个可重复的例子,我做了一个虚拟代码:

x = 20:1 
y = 1:20

barplot(x, y, space = 0)
lines(x, y, col = 'red')

如何让线条横跨整个条形图箱?

PS:该线不需要是非线性的。我只想在条形图上添加一条直线

谢谢。

Rindell et al. 2011 My sample plot

2 个答案:

答案 0 :(得分:1)

查看帮助页?barplot:第二个参数是width - optional vector of bar widths,而不是y坐标。以下代码可以满足您的需求,但我不相信它是一种通用的解决方案。

barplot(y[x], space = 0)
lines(x, y, col = 'red')

enter image description here

修改
一种可能更好的方法是使用barplot的返回值。

bp <- barplot(y[x], space = 0)
lines(c(bp), y[x], col = 'red')

答案 1 :(得分:1)

更通用的解决方案可能是依赖barplot()生成的x值。这样,您就可以处理只有计数(而不是x和y值)的场景。我指的是像这样的变量,你的&#34; x&#34;是分类的(确切地说,x轴值对应于y的名称)。

p.x <- c(8,12,14,9,5,3,2)
x <- sample(c("A","B","C","D","E","F","G"), 
            prob = p.x/sum(p.x),
            replace = TRUE, 
            size = 200)
y <- table(x)
y
#  A  B  C  D  E  F  G 
# 27 52 46 36 21 11  7 

当您使用barplot()时,您可以收集变量中的条形的x位置(在本例中为plot.dim)并用于指导您的行

plot.dim <- barplot(y)
lines(plot.dim, y, col = "red", lwd = 2)

结果 enter image description here

现在,回到您的数据。即使你同时拥有x和y,在条形图中你只显示你的y变量,而x则用于y的标签。

x <- 20:1 
y <- as.integer(22 - 1 * sample(seq(0.7, 1.3, length.out = length(x))) * x)

names(y) <- x
y <- y[order(as.numeric(names(y)))]

让我们再次绘制您的y值。收集xpos变量中的条形图位置。

xpos <- barplot(y, las = 2)

请注意,第一个条形图(x = 1)的位置不是1.同样,最后一个条形图位于23.5(而不是20)。

xpos[1]
# x=1 is indeed at 0.7
xpos[length(xpos)]
# x=20 is indeed at 23.5

进行回归(例如,使用lm())。计算第一个和最后一个x(y标签)的预测y值。

lm.fit <- lm(y~as.numeric(names(y)))
y.init <- lm.fit$coefficients[2] * as.numeric(names(y))[1] + lm.fit$coefficients[1]
y.end <- lm.fit$coefficients[2] * as.numeric(names(y))[(length(y))] + lm.fit$coefficients[1]

您现在可以使用segments()覆盖一行,但请记住根据xpos中存储的内容设置您的x值。

segments(xpos[1], y.init, xpos[length(xpos)], y.end, lwd = 2, col = "red")

enter image description here