我尝试格式化在基本图形系统中创建的回归曲线的标签。基本上,此标签从变量中提取斜率,截距和r平方值。一个例子如下:
plot(rnorm(10), type = "n", xlim = c(0, 100), ylim = c(0, 100))
text(x = 0, y = 100, adj = c(0, NA), bquote(paste(y == .(a) * x + .(b), ", R"^2 == .(r2))), cex = 0.7)
然而,这产生了一个看起来不太聪明的标签:
y = 1.159019x+-1.537708, R<sup>2</sup>=0.7924927
我想要的是将数字四舍五入到小数点后第二位,即
y = 1.16x-1.54, R<sup>2</sup>=0.79
我已在text()
和bquote()
的两个帮助文档中查找过,但没有找到太多有用的信息。
我还尝试使用参数.(a)
将.(b)
,.(r2)
和format()
打包在nsmall = 2
中,但它不起作用。
有人可以帮我这个吗?非常感谢提前!
PS。我认为我的问题中有一个隐藏的任务。在上面的示例中,b
为负数。我知道我可能会在我的表达式中忽略"+"
运算符,只使用b
的负号来加入我的等式。但是,如果我事先不知道b
的标志怎么办?是否有一种巧妙的方法来形成标签而不用if()
检查这个标签然后写两个略有不同版本的text()
?再次感谢!
答案 0 :(得分:5)
要指定位数,请使用round(a, digits=2)
。但是,您也可以使用sprintf
来处理等式中的位数和+或 - :e.q。 %+ 3.2f,其中%
强制等式中的+或 - 符号,3.2f
控制数字位数,因此这解决了您的问题。我在sprintf
here找到了上标问题的解决方案:“B2是UTF-8字符的十六进制代码= ^ 2而\ U是一个控制该字符的控制序列。”
# data and regression
set.seed(1)
y = 1:10+rnorm(10)
x = 1:10
fit = lm(y~x)
b = coef(fit)[1]
a = coef(fit)[2]
r2 = summary(fit)$r.squared
# plot data and regression
plot(x, y)
abline(fit, col=2)
# add text to plot with legend() for convenient placement
legend('topleft', title='option 1', legend=sprintf("y = %3.2fx %+3.2f, R\UB2 = %3.2f", a, b, r2), bty='n', cex=0.7)
# if you prefer a pretty space between plus/minus and b:
if( b<0) {my_sign = ' - '; b = -b} else { my_sign= ' + '}
legend('bottomright', title='option 2', legend=sprintf("y = %3.2f x %s %3.2f, R\UB2 = %3.2f", a, my_sign, b, r2), bty='n', cex=0.7)