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

Bert Gunter bgunter@4567 @end|ng |rom gm@||@com
Fri Apr 8 18:49:14 CEST 2022

```Yes, I also find it somewhat confusing. Perhaps this will help. I
apologize beforehand if I have misunderstood and you already know all
this.

The key is to realize that plotmath works with **expressions**,
unevaluated forms that include special plotmath keywords, like 'atop',
and symbols. So...

## simple example with plotmath used in plot's title

## This will produce an error, as 'atop' is not an R function:
plot(1,1, main = atop(x,y))

## to make this work, we need an expression on the rhs of 'main =' . A
simple way to do this is to use quote():

plot(1,1,main = quote(atop(x,y)))

## Note that this produce 'x' above 'y' **without quoting x and y**.
That's because
## this is an expression that plotmath parses and evaluates according
to its own rules,
## shown in ?plotmath

## Now suppose we have:
x <- 'first line'
y <- 'second line'

## and we want to display these quoted strings instead of 'x' and 'y'
in the title

## Then this will *not* work -- it gives the same result as before:
plot(1,1,main = quote(atop(x,y)))

## So what is needed here is R's 'computing on the language"
capability to substitute
## the quoted strings for x and y in the expression. Here are two
simple ways to do this:

## First using substitute()

plot(1,1, main = substitute(atop(x,y), list (x =x, y = y)))

## Second, using bquote()

plot(1,1, main = bquote(atop(.(x), .(y))))

## More complicated expressions can be built up using plotmath's rules.
## But you need to be careful about distinguishing plotmath expressions and
## ordinary R expressions. For example:

x <- pi/4  ## a number

## WRONG -- will display as written. bquote() is the same as quote() here.
plot(1,1, main = bquote(sin(pi/4) == round(x,2)))

## WRONG -- will substitute value of x rounded to session default
## in previous. This is a mistake in using bquote
plot(1,1, main = bquote(sin(pi/4) == round(.(x), 2)))

## RIGHT -- use of bquote
plot(1,1, main = bquote(sin(pi/4) == .(round(x,2))))
## or -- using substitute
plot(1,1, main = substitute(sin(pi/4) == x, list(x = round(x,2))))

Hope this is helpful and, again, apologies if I have misunderstood.

Bert Gunter

"The trouble with having an open mind is that people keep coming along
and sticking things into it."
-- Opus (aka Berkeley Breathed in his "Bloom County" comic strip )

On Fri, Apr 8, 2022 at 7:42 AM PIKAL Petr <petr.pikal using precheza.cz> wrote:
>
> 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))
>
> #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),
> >       if (coef(m)[2] >= 0)  {
> >           eq <- substitute(italic(y) == a + b %.% italic(x), l)
> >       } else {
> >           eq <- substitute(italic(y) == a - b %.% italic(x),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),
> >>>    if (coef(m)[2] >= 0)  {
> >>>      eq <- substitute(italic(y) == a + b %.% italic(x), l)
> >>>    } else {
> >>>      eq <- substitute(italic(y) == a - b %.% italic(x),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.
> >>>
> >>>
> >>>
> >>> 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:
> >>> 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:
> >>> 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:
> >>> 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:
> >>> 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
> >>> 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:
> >> 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