所以我想在R中的条形图中叠加回归线。类似于Rosindell等人的附图。但是,当我尝试使用我的数据执行此操作时,该行不会延伸条形图的整个长度。
对于一个可重复的例子,我做了一个虚拟代码:
x = 20:1
y = 1:20
barplot(x, y, space = 0)
lines(x, y, col = 'red')
如何让线条横跨整个条形图箱?
PS:该线不需要是非线性的。我只想在条形图上添加一条直线
谢谢。
答案 0 :(得分:1)
查看帮助页?barplot
:第二个参数是width - optional vector of bar widths
,而不是y
坐标。以下代码可以满足您的需求,但我不相信它是一种通用的解决方案。
barplot(y[x], space = 0)
lines(x, y, col = 'red')
修改强>
一种可能更好的方法是使用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)
现在,回到您的数据。即使你同时拥有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")