[R] [External] add equation and rsqared to plot
PIKAL Petr
petr@p|k@| @end|ng |rom prechez@@cz
Mon Apr 25 15:21:38 CEST 2022
Thanks to all who responded. Now I started a bit to understand what is behind my miserable effort to put some text into graph in required way.
Best regards.
Petr
> -----Original Message-----
> From: Bert Gunter <bgunter.4567 using gmail.com>
> Sent: Friday, April 8, 2022 7:33 PM
> To: Bill Dunlap <williamwdunlap using gmail.com>
> Cc: PIKAL Petr <petr.pikal using precheza.cz>; r-help using r-project.org
> Subject: Re: [R] [External] add equation and rsqared to plot
>
> Thanks, Bill.
>
> This is a subtlety I certainly did not understand.
>
>
> Bert
>
> On Fri, Apr 8, 2022 at 10:08 AM Bill Dunlap <williamwdunlap using gmail.com>
> wrote:
> >
> > plotmath also accepts names and calls, which it treats as though they were
> single-element expressions. That is why quote() generally works.
> quote("string") or quote(123) does not invoke plotmath, as quote returns a
> literal string or number when given such a thing.
> >
> > plot(0:1,0:1,type="n")
> > text(.2, .6, expression(phi^epsilon))
> > text(.2, .4, quote(phi^epsilon))
> > text(.7, .6, expression(1234567890123456)) text(.7, .4,
> > quote(1234567890123456))
> >
> > -Bill
> >
> > On Fri, Apr 8, 2022 at 9:49 AM Bert Gunter <bgunter.4567 using gmail.com>
> wrote:
> >>
> >> 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))
> >> > 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%7C
> >> > >>> 01%7C
> >> > >>>
> rmh%40temple.edu%7C3b28fb8737e146a9ee3208da1807da2e%7C716e81ef
> b
> >> > >>> 52244
> >> > >>>
> 738e3110bd02ccf6e5%7C0%7C0%7C637848719391803553%7CUnknown%7
> CTWF
> >> > >>> pbGZs
> >> > >>>
> b3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI
> >> > >>> 6Mn0%
> >> > >>>
> 3D%7C3000&sdata=MBtbONfsiMExWy0uorZMR1DglZindxErRMsooTztf
> Uo
> >> > >>> %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%7C3b28fb8737e146a9ee3208da1807da2
> e%
> >> > >>> 7C716
> >> > >>>
> e81efb52244738e3110bd02ccf6e5%7C0%7C0%7C637848719391803553%7C
> Un
> >> > >>> known
> >> > >>>
> %7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1h
> >> > >>> aWwiL
> >> > >>>
> CJXVCI6Mn0%3D%7C3000&sdata=2YDPoejYRlphL6h%2FWFmEEyR44Kd
> mH2
> >> > >>> GDC9r
> >> > >>> 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.e
> >> > >>> du%7C
> >> > >>>
> 3b28fb8737e146a9ee3208da1807da2e%7C716e81efb52244738e3110bd02c
> c
> >> > >>> f6e5%
> >> > >>>
> 7C0%7C0%7C637848719391803553%7CUnknown%7CTWFpbGZsb3d8eyJWIj
> oiMC
> >> > >>> 4wLjA
> >> > >>>
> 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%40
> >> > >>> templ
> >> > >>>
> e.edu%7C3b28fb8737e146a9ee3208da1807da2e%7C716e81efb52244738e3
> 1
> >> > >>> 10bd0
> >> > >>>
> 2ccf6e5%7C0%7C0%7C637848719391803553%7CUnknown%7CTWFpbGZsb3
> d8ey
> >> > >>> JWIjo
> >> > >>>
> iMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3
> >> > >>> 000&a
> >> > >>>
> mp;sdata=RCUE7DJbn54MvhWX4bqiNtPzoJLl7NK9tieMlFpe2rg%3D&res
> >> > >>> erved
> >> > >>> =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.
> >> > ______________________________________________
> >> > 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.
> >>
> >> ______________________________________________
> >> 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