在r plot文本中指定小数位?

时间:2014-03-31 17:03:49

标签: r plot label 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)

然而,这产生了一个看起来不太聪明的标签:

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()?再次感谢!

1 个答案:

答案 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)

display equation on plot