# [R] [External] add equation and rsqared to plot

PIKAL Petr petr@p|k@| @end|ng |rom prechez@@cz
Fri Apr 8 16:41:59 CEST 2022

```Hallo David

Fair enough. Thanks for your explanation, which told me what should be done. It works perfectly for my example but I am still confused how to get expressions given to atop (or other functions) be evaluated and help page does not enlighten me, so I am still puzzled.

When I borrow example from help,

plot(1:10, type="n", xlab="", ylab="", main = "plot math & numbers")
theta <- 1.23 ; mtext(bquote(hat(theta) == .(theta)), line= .25)
for(i in 2:9)
text(i, i+1, substitute(list(xi, eta) == group("(",list(x,y),")"),
list(x = i, y = i+1)))

#this is OK
ex1 <- expression("      first: {f * minute}(x) " == {f * minute}(x))
ex2 <- expression("               second: {f * second}(x) "        == {f * second}(x))
text(1, 9.6, ex1, adj=0)
text(1, 9.0, ex2, adj=0)

#and this is not
text(2, 8, expression(atop(ex1, ex2)))
text(2, 7, substitute( atop(ex1, ex2), list(ex1=ex1,ex2=ex2)))

#and this works
text(2, 6, expression(atop(1,2)))

I tried to use eval when calling atop, but it did not work either. Therefore some hint in help page could be quite handy.

Best regards
Petr Pikal

S pozdravem | Best Regards
RNDr. Petr PIKAL
Vedoucí Výzkumu a vývoje | Research Manager
PRECHEZA a.s.
nábř. Dr. Edvarda Beneše 1170/24 | 750 02 Přerov | Czech Republic
Tel: +420 581 252 256 | GSM: +420 724 008 364
petr.pikal using precheza.cz | www.precheza.cz

Osobní údaje: Informace o zpracování a ochraně osobních údajů obchodních partnerů PRECHEZA a.s. jsou zveřejněny na: https://www.precheza.cz/zasady-ochrany-osobnich-udaju/ | Information about processing and protection of business partner’s personal data are available on website: https://www.precheza.cz/en/personal-data-protection-principles/
Důvěrnost: Tento e-mail a jakékoliv k němu připojené dokumenty jsou důvěrné a podléhají tomuto právně závaznému prohlášení o vyloučení odpovědnosti: https://www.precheza.cz/01-dovetek/ | This email and any documents attached to it may be confidential and are subject to the legally binding disclaimer: https://www.precheza.cz/en/01-disclaimer/

-----Original Message-----
From: David Winsemius <dwinsemius using comcast.net>
Sent: Thursday, April 7, 2022 12:04 AM
To: PIKAL Petr <petr.pikal using precheza.cz>; Richard M. Heiberger <rmh using temple.edu>
Cc: r-help using r-project.org
Subject: Re: [R] [External] add equation and rsqared to plot

On 4/6/22 14:36, PIKAL Petr wrote:
> Hallo David
>
> Thanks for your answer. atop itself somehow cannot use expression made by substitute  although those expressions itself are correct. I asked this question after roughly two hours of unsuccessful atempts.
>
> The second substitute or bquote solves the problem. Maybe this could propagate to help page, because although atop works smoothly with simple expressions, expressions with substitute are treated in a wrong way (at least by my opinion).

It's not a problem with `atop`. It's a problem with your understanding of how R expressions and plotmath functions work. The argument(s) to `expression` are not evaluated. So `atop` was given two expressions `eq` and `req` and they in turn were not evaluated .... just taken as text values inside atop. Using either `substitute` (with a second argument
list) or bquote (with its special dot function) forces evaluation by getting from the R symbol table those expressions which you had assigned as values of the symbols `eq` and `req`.

The plotmath functions (not just atop but also `paste`, `frac`, `over` and all the rest on the ?plotmath pafge),  are designed to be "like"
`expression` in not evaluating their arguments unless a "special value"
like a Greek letter name or a defined %<op>% is found. Those functions are handled with a different parser than regular R functions. So they are not designed to go out to the R symbol table (which is where even locally defined object names are kept) to find values.

Hope this helps;

David.

--

David.

>
> Thanks again.
>
> Best regards.
> Petr
>
>
> ________________________________________
> Od: David Winsemius <dwinsemius using comcast.net>
> Odesláno: 6. dubna 2022 23:20
> Komu: PIKAL Petr; Richard M. Heiberger
> Kopie: r-help using r-project.org
> Předmět: Re: [R] [External] add equation and rsqared to plot
>
> Try this:
>
>
> lm_eqn = function(m) {
>       l <- list(a = format(coef(m)[1], digits = 4),
>                 b = format(abs(coef(m)[2]), digits = 4),
>                 r2 = format(summary(m)\$r.squared, digits = 3),
>                 r2adj = format(summary(m)\$adj.r.squared, digits = 3));
>       if (coef(m)[2] >= 0)  {
>           eq <- substitute(italic(y) == a + b %.% italic(x), l)
>       } else {
>           eq <- substitute(italic(y) == a - b %.% italic(x),l)
>
>       }
>       req <- substitute(italic(r)^2~"="~r2* ","~~italic(adj.r)^2~"="~r2adj,l)
>       a_regs <- substitute( atop(eq, req), list(eq=eq,req=req)) }
>
> --
>
> David.
>
> On 4/6/22 13:47, PIKAL Petr wrote:
>> Hallo Richard.
>>
>> Did you try the example? I Used atop but with the syntax I made, the
>> result is
>>
>> eq
>> req
>>
>> but not the equations.
>>
>> I send the picture, but I am not sure if it will go through.
>>
>> Best regards
>> Petr
>>
>> ________________________________________
>> Od: Richard M. Heiberger <rmh using temple.edu>
>> Odesláno: 6. dubna 2022 22:36
>> Komu: PIKAL Petr
>> Kopie: r-help using r-project.org
>> Předmět: Re: [External] [R] add equation and rsqared to plot
>>
>> I think you are looking for atop(a,b) See ? plotmath
>>
>>> On Apr 06, 2022, at 15:58, PIKAL Petr <petr.pikal using precheza.cz> wrote:
>>>
>>> Dear all
>>>
>>>
>>> I want to add equation and rsquared values to plot and I am lost in correct expression form. I want to have 2 lines, one with equation and one with r squared values.
>>>
>>>
>>> Here is what I made.
>>>
>>> # function to extract values from lm fit.
>>>
>>>
>>> lm_eqn = function(m) {
>>>    l <- list(a = format(coef(m)[1], digits = 4),
>>>        b = format(abs(coef(m)[2]), digits = 4),
>>>        r2 = format(summary(m)\$r.squared, digits = 3),
>>>        r2adj = format(summary(m)\$adj.r.squared, digits = 3));
>>>    if (coef(m)[2] >= 0)  {
>>>      eq <- substitute(italic(y) == a + b %.% italic(x), l)
>>>    } else {
>>>      eq <- substitute(italic(y) == a - b %.% italic(x),l)
>>>
>>>    }
>>>    req <- substitute(italic(r)^2~"="~r2* ","~~italic(adj.r)^2~"="~r2adj,l)
>>>    expression(atop(eq, req))
>>> }
>>>
>>>
>>> #Example
>>>
>>> x <- 1:10
>>> y <- x*5 +rnorm(10)
>>> plot(x,y)
>>> fit <- lm(y~x)
>>> text(4,40, lm_eqn(fit))
>>>
>>>
>>> I know that both eq and req are correct expressions and when the last line in function is either eq or req, the example gives correct result.
>>>
>>>
>>> But how to get both expressions one above the other is mystery.
>>>
>>> Please help.
>>>
>>>
>>> Best regards.
>>>
>>> Petr
>>>
>>>
>>>
>>> Osobn   daje: Informace o zpracov n  a ochran  osobn ch  daj
>>> obchodn ch partner  PRECHEZA a.s. jsou zve ejn ny na:
>>> https://nam10.safelinks.protection.outlook.com/?url=https%3A%2F%2Fww
>>> w.precheza.cz%2Fzasady-ochrany-osobnich-udaju%2F&data=04%7C01%7C
>>> rmh%40temple.edu%7C3b28fb8737e146a9ee3208da1807da2e%7C716e81efb52244
>>> 738e3110bd02ccf6e5%7C0%7C0%7C637848719391803553%7CUnknown%7CTWFpbGZs
>>> b3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%
>>> 3D%7C3000&sdata=MBtbONfsiMExWy0uorZMR1DglZindxErRMsooTztfUo%3D&a
>>> mp;reserved=0 | Information about processing and protection of
>>> business partner's personal data are available on website:
>>> https://nam10.safelinks.protection.outlook.com/?url=https%3A%2F%2Fww
>>> w.precheza.cz%2Fen%2Fpersonal-data-protection-principles%2F&data
>>> =04%7C01%7Crmh%40temple.edu%7C3b28fb8737e146a9ee3208da1807da2e%7C716
>>> e81efb52244738e3110bd02ccf6e5%7C0%7C0%7C637848719391803553%7CUnknown
>>> %7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiL
>>> CJXVCI6Mn0%3D%7C3000&sdata=2YDPoejYRlphL6h%2FWFmEEyR44KdmH2GDC9r
>>> dLhFn4aU%3D&reserved=0
>>> D v rnost: Tento e-mail a jak koliv k n mu p ipojen  dokumenty jsou
>>> d v rn  a podl haj  tomuto pr vn  z vazn mu prohl en  o vylou en
>>> odpov dnosti:
>>> https://nam10.safelinks.protection.outlook.com/?url=https%3A%2F%2Fww
>>> w.precheza.cz%2F01-dovetek%2F&data=04%7C01%7Crmh%40temple.edu%7C
>>> 3b28fb8737e146a9ee3208da1807da2e%7C716e81efb52244738e3110bd02ccf6e5%
>>> 7C0%7C0%7C637848719391803553%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjA
>>> wMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000&sdata
>>> =z7TNZSbfNXlB%2FZt0ekl8P1kTu1l0eBFVoLvewSSdQDg%3D&reserved=0 |
>>> This email and any documents attached to it may be confidential and
>>> are subject to the legally binding disclaimer:
>>> https://nam10.safelinks.protection.outlook.com/?url=https%3A%2F%2Fww
>>> w.precheza.cz%2Fen%2F01-disclaimer%2F&data=04%7C01%7Crmh%40templ
>>> e.edu%7C3b28fb8737e146a9ee3208da1807da2e%7C716e81efb52244738e3110bd0
>>> 2ccf6e5%7C0%7C0%7C637848719391803553%7CUnknown%7CTWFpbGZsb3d8eyJWIjo
>>> iMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000&a
>>> mp;sdata=RCUE7DJbn54MvhWX4bqiNtPzoJLl7NK9tieMlFpe2rg%3D&reserved
>>> =0
>>>
>>>
>>>         [[alternative HTML version deleted]]
>>>
>>> ______________________________________________
>>> R-help using r-project.org mailing list -- To UNSUBSCRIBE and more, see
>>> https://stat.ethz.ch/mailman/listinfo/r-help
>>> PLEASE do read the posting guide
>>> http://www.R-project.org/posting-guide.html
>>> and provide commented, minimal, self-contained, reproducible code.
>> Osobní údaje: Informace o zpracování a ochraně osobních údajů
>> obchodních partnerů PRECHEZA a.s. jsou zveřejněny na:
>> https://www.precheza.cz/zasady-ochrany-osobnich-udaju/ | Information
>> about processing and protection of business partner’s personal data
>> are available on website:
>> https://www.precheza.cz/en/personal-data-protection-principles/
>> Důvěrnost: Tento e-mail a jakékoliv k němu připojené dokumenty jsou
>> důvěrné a podléhají tomuto právně závaznému prohláąení o vyloučení
>> odpovědnosti: https://www.precheza.cz/01-dovetek/ | This email and
>> any documents attached to it may be confidential and are subject to
>> the legally binding disclaimer:
>> https://www.precheza.cz/en/01-disclaimer/
>>
>>
>> ______________________________________________
>> R-help using r-project.org mailing list -- To UNSUBSCRIBE and more, see
>> https://stat.ethz.ch/mailman/listinfo/r-help
>> PLEASE do read the posting guide
>> http://www.R-project.org/posting-guide.html
>> and provide commented, minimal, self-contained, reproducible code.
```

More information about the R-help mailing list