Patrick Giraudoux
2019-Oct-20 16:02 UTC
[R] using a variable and a superscript in a legend
Thanks Bert and Peter, Yes Bert, I was aware of the legend() function syntax, and just quoting the legend argument within the function. However, Bert and Peter, I do not understand why it works with your absolutely reproducible examples and not in the slightly (not so slightly apparently) different context where I used it... densren=1.25 plot(1:100,1:100,type="n") legend(list(x=0,y=100),legend=c("Sans renard",bquote(.(densren) (ind./km)^2)),lty=c(1,2),col=c("black","red"),bty="n") densren=1.25 plot(1:100,1:100,type="n") legend(list(x=0,y=100),legend=c("Sans renard",bquote(.(densren) * " ind."/"km"^2)),lty=c(1,2),col=c("black","red"),bty="n" Probably because the result of bquote() is concatenated in a character vector, but how to deal with this ? Best, Patrick Le 20/10/2019 ? 16:42, Bert Gunter a ?crit?:> Assuming you are using base graphics, your syntax for adding the > legend appears to be wrong. > legend() is a separate function, not a parameter of plot.default afaics. > > The following works for me: > > > densren <- 1.25 > > plot(1:10) > > legend (x="center", legend =bquote(.(densren) (ind./km)^2)) > > See ?legend > > 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 Sun, Oct 20, 2019 at 5:30 AM Patrick Giraudoux > <patrick.giraudoux at univ-fcomte.fr > <mailto:patrick.giraudoux at univ-fcomte.fr>> wrote: > > Dear listers, > > I am trying to pass an expression inlcuding a variable and a > superpscript to a legend. What I want to obtain is e.g. with > densren = 1.25 > > 1.25 ind./km^2 > > I have tried many variants of the following: > > legend=bquote(.(densren) (ind./km)^2) > > but if not errors, do obtain > > 1.25 (ind./km^2) > > hence not what I want (no parenthesis, 2 in superscript...) > > Any idea about a correct syntax to get what I need ? > > Best, > > Patrick > > > ? ? ? ? [[alternative HTML version deleted]] > > ______________________________________________ > R-help at r-project.org <mailto:R-help at 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. >[[alternative HTML version deleted]]
The legend must be "an expression vector." c("Sans renard",bquote(.(densren) (ind./km)^2)) is not because the first element is a character string. This works: plot(1:100,1:100,type="n") legend(list(x=0,y=100),legend=c(expression("Sans renard"),bquote(.(densren) (ind./km)^2)),lty=c(1,2),col=c("black","red"),bty="n") Cheers, Bert 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 Sun, Oct 20, 2019 at 9:02 AM Patrick Giraudoux < patrick.giraudoux at univ-fcomte.fr> wrote:> Thanks Bert and Peter, > > Yes Bert, I was aware of the legend() function syntax, and just quoting > the legend argument within the function. > > However, Bert and Peter, I do not understand why it works with your > absolutely reproducible examples and not in the slightly (not so slightly > apparently) different context where I used it... > > densren=1.25 > plot(1:100,1:100,type="n") > legend(list(x=0,y=100),legend=c("Sans renard",bquote(.(densren) > (ind./km)^2)),lty=c(1,2),col=c("black","red"),bty="n") > > densren=1.25 > plot(1:100,1:100,type="n") > legend(list(x=0,y=100),legend=c("Sans renard",bquote(.(densren) * " > ind."/"km"^2)),lty=c(1,2),col=c("black","red"),bty="n" > > Probably because the result of bquote() is concatenated in a character > vector, but how to deal with this ? > > Best, > > Patrick > > > > Le 20/10/2019 ? 16:42, Bert Gunter a ?crit : > > Assuming you are using base graphics, your syntax for adding the legend > appears to be wrong. > legend() is a separate function, not a parameter of plot.default afaics. > > The following works for me: > > > densren <- 1.25 > > plot(1:10) > > legend (x="center", legend =bquote(.(densren) (ind./km)^2)) > > See ?legend > > 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 Sun, Oct 20, 2019 at 5:30 AM Patrick Giraudoux < > patrick.giraudoux at univ-fcomte.fr> wrote: > >> Dear listers, >> >> I am trying to pass an expression inlcuding a variable and a >> superpscript to a legend. What I want to obtain is e.g. with densren >> 1.25 >> >> 1.25 ind./km^2 >> >> I have tried many variants of the following: >> >> legend=bquote(.(densren) (ind./km)^2) >> >> but if not errors, do obtain >> >> 1.25 (ind./km^2) >> >> hence not what I want (no parenthesis, 2 in superscript...) >> >> Any idea about a correct syntax to get what I need ? >> >> Best, >> >> Patrick >> >> >> [[alternative HTML version deleted]] >> >> ______________________________________________ >> R-help at 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. >> > >[[alternative HTML version deleted]]
Patrick Giraudoux
2019-Oct-20 17:15 UTC
[R] using a variable and a superscript in a legend
Great !? You have helped to solve a problem on which I was sweating (sporadically, however) since months... Thanks, Best, Le 20/10/2019 ? 18:29, Bert Gunter a ?crit?:> The legend must be "an expression vector." > c("Sans renard",bquote(.(densren) (ind./km)^2))?? is not because the > first element is a character string. > > This works: > > plot(1:100,1:100,type="n") > ? ?legend(list(x=0,y=100),legend=c(expression("Sans > renard"),bquote(.(densren) > (ind./km)^2)),lty=c(1,2),col=c("black","red"),bty="n") > > Cheers, > Bert > > > 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 Sun, Oct 20, 2019 at 9:02 AM Patrick Giraudoux > <patrick.giraudoux at univ-fcomte.fr > <mailto:patrick.giraudoux at univ-fcomte.fr>> wrote: > > Thanks Bert and Peter, > > Yes Bert, I was aware of the legend() function syntax, and just > quoting the legend argument within the function. > > However, Bert and Peter, I do not understand why it works with > your absolutely reproducible examples and not in the slightly (not > so slightly apparently) different context where I used it... > > densren=1.25 > plot(1:100,1:100,type="n") > legend(list(x=0,y=100),legend=c("Sans renard",bquote(.(densren) > (ind./km)^2)),lty=c(1,2),col=c("black","red"),bty="n") > > densren=1.25 > plot(1:100,1:100,type="n") > legend(list(x=0,y=100),legend=c("Sans renard",bquote(.(densren) * > " ind."/"km"^2)),lty=c(1,2),col=c("black","red"),bty="n" > > Probably because the result of bquote() is concatenated in a > character vector, but how to deal with this ? > > Best, > > Patrick > > > > Le 20/10/2019 ? 16:42, Bert Gunter a ?crit?: >> Assuming you are using base graphics, your syntax for adding the >> legend appears to be wrong. >> legend() is a separate function, not a parameter of plot.default >> afaics. >> >> The following works for me: >> >> > densren <- 1.25 >> > plot(1:10) >> > legend (x="center", legend =bquote(.(densren) (ind./km)^2)) >> >> See ?legend >> >> 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 Sun, Oct 20, 2019 at 5:30 AM Patrick Giraudoux >> <patrick.giraudoux at univ-fcomte.fr >> <mailto:patrick.giraudoux at univ-fcomte.fr>> wrote: >> >> Dear listers, >> >> I am trying to pass an expression inlcuding a variable and a >> superpscript to a legend. What I want to obtain is e.g. with >> densren = 1.25 >> >> 1.25 ind./km^2 >> >> I have tried many variants of the following: >> >> legend=bquote(.(densren) (ind./km)^2) >> >> but if not errors, do obtain >> >> 1.25 (ind./km^2) >> >> hence not what I want (no parenthesis, 2 in superscript...) >> >> Any idea about a correct syntax to get what I need ? >> >> Best, >> >> Patrick >> >> >> ? ? ? ? [[alternative HTML version deleted]] >> >> ______________________________________________ >> R-help at r-project.org <mailto:R-help at 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. >> >[[alternative HTML version deleted]]
It's tricky, but I think what you want is legend(list(x=0,y=100), legend=as.expression(list( "Sans renard", bquote(.(densren) * " ind."/"km"^2) )), lty=c(1,2),col=c("black","red"),bty="n") Generally, if you want a vector of unevaluated expressions, you need an object of mode "expression", but you cannot create it directly with expression() because then the bquote() is left unevaluated:> expression("Sans renard",bquote(.(densren) * " ind."/"km"^2))expression("Sans renard", bquote(.(densren) * " ind."/"km"^2)) Putting the bquote on the outside _looks_ like it might work:> bquote(expression("Sans renard",.(densren) * " ind."/"km"^2))expression("Sans renard", 1.25 * " ind."/"km"^2) but that is not an "expression" object, but a call to expression() (!). Try it and see. Evaluating the call does actually work (notice that the printed value is exactly the same, but the object is not):> eval(bquote(expression("Sans renard",.(densren) * " ind."/"km"^2)))expression("Sans renard", 1.25 * " ind."/"km"^2) but I think I prefer the as.expression(list(....)) construction. An alternative tack is this:> e <- expression(0,0) > e[[1]] <- "sans renard" > e[[2]] <- bquote(.(densren) * " ind."/"km"^2) > plot(1:100,1:100,type="n") > legend(list(x=0,y=100),legend=e, lty=c(1,2),col=c("black","red"),bty="n")> On 20 Oct 2019, at 18:02 , Patrick Giraudoux <patrick.giraudoux at univ-fcomte.fr> wrote: > > Thanks Bert and Peter, > > Yes Bert, I was aware of the legend() function syntax, and just quoting the legend argument within the function. > > However, Bert and Peter, I do not understand why it works with your absolutely reproducible examples and not in the slightly (not so slightly apparently) different context where I used it... > > densren=1.25 > plot(1:100,1:100,type="n") > legend(list(x=0,y=100),legend=c("Sans renard",bquote(.(densren) (ind./km)^2)),lty=c(1,2),col=c("black","red"),bty="n") > > densren=1.25 > plot(1:100,1:100,type="n") > legend(list(x=0,y=100),legend=c("Sans renard",bquote(.(densren) * " ind."/"km"^2)),lty=c(1,2),col=c("black","red"),bty="n" > > Probably because the result of bquote() is concatenated in a character vector, but how to deal with this ? > > Best, > > Patrick > > > > Le 20/10/2019 ? 16:42, Bert Gunter a ?crit : >> Assuming you are using base graphics, your syntax for adding the legend appears to be wrong. >> legend() is a separate function, not a parameter of plot.default afaics. >> >> The following works for me: >> >> > densren <- 1.25 >> > plot(1:10) >> > legend (x="center", legend =bquote(.(densren) (ind./km)^2)) >> >> See ?legend >> >> 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 Sun, Oct 20, 2019 at 5:30 AM Patrick Giraudoux <patrick.giraudoux at univ-fcomte.fr> wrote: >> Dear listers, >> >> I am trying to pass an expression inlcuding a variable and a >> superpscript to a legend. What I want to obtain is e.g. with densren = 1.25 >> >> 1.25 ind./km^2 >> >> I have tried many variants of the following: >> >> legend=bquote(.(densren) (ind./km)^2) >> >> but if not errors, do obtain >> >> 1.25 (ind./km^2) >> >> hence not what I want (no parenthesis, 2 in superscript...) >> >> Any idea about a correct syntax to get what I need ? >> >> Best, >> >> Patrick >> >> >> [[alternative HTML version deleted]] >> >> ______________________________________________ >> R-help at 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. > >-- Peter Dalgaard, Professor, Center for Statistics, Copenhagen Business School Solbjerg Plads 3, 2000 Frederiksberg, Denmark Phone: (+45)38153501 Office: A 4.23 Email: pd.mes at cbs.dk Priv: PDalgd at gmail.com
Patrick Giraudoux
2019-Oct-20 18:01 UTC
[R] using a variable and a superscript in a legend
Now, we have two solutions working. This is great since I did not find any example of the kind searching r-help archives and google... Thanks ! Le 20/10/2019 ? 19:31, Peter Dalgaard a ?crit?:> It's tricky, but I think what you want is > > legend(list(x=0,y=100), > legend=as.expression(list( > "Sans renard", > bquote(.(densren) * " ind."/"km"^2) > )), > lty=c(1,2),col=c("black","red"),bty="n") > > Generally, if you want a vector of unevaluated expressions, you need an object of mode "expression", but you cannot create it directly with expression() because then the bquote() is left unevaluated: > >> expression("Sans renard",bquote(.(densren) * " ind."/"km"^2)) > expression("Sans renard", bquote(.(densren) * " ind."/"km"^2)) > > Putting the bquote on the outside _looks_ like it might work: > >> bquote(expression("Sans renard",.(densren) * " ind."/"km"^2)) > expression("Sans renard", 1.25 * " ind."/"km"^2) > > but that is not an "expression" object, but a call to expression() (!). Try it and see. > > Evaluating the call does actually work (notice that the printed value is exactly the same, but the object is not): > >> eval(bquote(expression("Sans renard",.(densren) * " ind."/"km"^2))) > expression("Sans renard", 1.25 * " ind."/"km"^2) > > but I think I prefer the as.expression(list(....)) construction. > > An alternative tack is this: > >> e <- expression(0,0) >> e[[1]] <- "sans renard" >> e[[2]] <- bquote(.(densren) * " ind."/"km"^2) >> plot(1:100,1:100,type="n") >> legend(list(x=0,y=100),legend=e, lty=c(1,2),col=c("black","red"),bty="n") > > >> On 20 Oct 2019, at 18:02 , Patrick Giraudoux <patrick.giraudoux at univ-fcomte.fr> wrote: >> >> Thanks Bert and Peter, >> >> Yes Bert, I was aware of the legend() function syntax, and just quoting the legend argument within the function. >> >> However, Bert and Peter, I do not understand why it works with your absolutely reproducible examples and not in the slightly (not so slightly apparently) different context where I used it... >> >> densren=1.25 >> plot(1:100,1:100,type="n") >> legend(list(x=0,y=100),legend=c("Sans renard",bquote(.(densren) (ind./km)^2)),lty=c(1,2),col=c("black","red"),bty="n") >> >> densren=1.25 >> plot(1:100,1:100,type="n") >> legend(list(x=0,y=100),legend=c("Sans renard",bquote(.(densren) * " ind."/"km"^2)),lty=c(1,2),col=c("black","red"),bty="n" >> >> Probably because the result of bquote() is concatenated in a character vector, but how to deal with this ? >> >> Best, >> >> Patrick >> >> >> >> Le 20/10/2019 ? 16:42, Bert Gunter a ?crit : >>> Assuming you are using base graphics, your syntax for adding the legend appears to be wrong. >>> legend() is a separate function, not a parameter of plot.default afaics. >>> >>> The following works for me: >>> >>>> densren <- 1.25 >>>> plot(1:10) >>>> legend (x="center", legend =bquote(.(densren) (ind./km)^2)) >>> See ?legend >>> >>> 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 Sun, Oct 20, 2019 at 5:30 AM Patrick Giraudoux <patrick.giraudoux at univ-fcomte.fr> wrote: >>> Dear listers, >>> >>> I am trying to pass an expression inlcuding a variable and a >>> superpscript to a legend. What I want to obtain is e.g. with densren = 1.25 >>> >>> 1.25 ind./km^2 >>> >>> I have tried many variants of the following: >>> >>> legend=bquote(.(densren) (ind./km)^2) >>> >>> but if not errors, do obtain >>> >>> 1.25 (ind./km^2) >>> >>> hence not what I want (no parenthesis, 2 in superscript...) >>> >>> Any idea about a correct syntax to get what I need ? >>> >>> Best, >>> >>> Patrick >>> >>> >>> [[alternative HTML version deleted]] >>> >>> ______________________________________________ >>> R-help at 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. >>