ela*_*rry 2 plot label r decimalformat
我试图格式化在基本图形系统中创建的回归曲线的标签.基本上,此标签从变量中提取斜率,截距和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)
Run Code Online (Sandbox Code Playgroud)
但是,这会产生一个看起来不太聪明的标签:
y = 1.159019x+-1.537708, R<sup>2</sup>=0.7924927
Run Code Online (Sandbox Code Playgroud)
我想要的是将数字四舍五入到小数点后第二位,即
y = 1.16x-1.54, R<sup>2</sup>=0.79
Run Code Online (Sandbox Code Playgroud)
我已经在两个帮助文档中查找了text(),bquote()但没有找到太多有用的信息.
我也曾尝试来包装.(a),.(b)并.(r2)在format()与参数nsmall = 2,但没有奏效.
有人可以帮我这个吗?提前谢谢了!
PS.我认为我的问题中有一个隐藏的任务.在上面的例子中,b是否定的.我知道我可能会"+"在我的表达式中忽略运算符,只是使用负号b来加入我的等式.但是,如果我不知道b事先的迹象怎么办?是否有一种巧妙的方法来形成标签,而不是用a来检查它,if()然后写两个非常不同的版本text()?再次感谢!
要指定位数,请使用round(a, digits=2).但是,您也可以使用sprintf等式中的数字和+或 - 来处理:eq%+ 3.2f,其中%强制等式中的+或 - 符号并3.2f控制数字的位数,因此这解决了两者你的问题.我在sprintf 这里找到了上标问题的解决方案:"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)
Run Code Online (Sandbox Code Playgroud)
