[R] Question about 'text' (add lm summary to a plot)

Gabor Grothendieck ggrothendieck at gmail.com
Thu Jul 21 23:15:30 CEST 2005


Use bquote instead of expression, e.g.

trees.lm <- lm(Volume ~ Girth, trees)
trees.sm <- summary(trees.lm)
trees.co <- round(trees.sm$coefficients,2)
trees.rsq <- round(trees.sm$r.squared,2)

plot(Volume ~ Girth, trees)

text(10,60, bquote(Intercept : .(trees.co[1,1])%+-%.(trees.co[1,2])), pos = 4)
text(10,57, bquote(Slope : .(trees.co[2,1])%+-%.(trees.co[2,2])), pos = 4)
text(10,54,bquote(R^2 : .(trees.rsq)), pos = 4)


On 7/21/05, Dan Bolser <dmb at mrc-dunn.cam.ac.uk> wrote:
> On Thu, 21 Jul 2005, Christoph Buser wrote:
> 
> >Dear Dan
> >
> >I can only help you with your third problem, expression and
> >paste. You can use:
> >
> >plot(1:5,1:5, type = "n")
> >text(2,4,expression(paste("Slope : ", 3.45%+-%0.34, sep = "")), pos = 4)
> >text(2,3.8,expression(paste("Intercept : ", -10.43%+-%1.42)), pos = 4)
> >text(2,3.6,expression(paste(R^2,": ", "0.78", sep = "")), pos = 4)
> >
> 
> Cheers for this.
> 
> I was trying to get it to work, but the problem is that I need to replace
> the values above with variables, from the following code...
> 
> 
> dat.lm <- lm(dat$AVG_CH_PAIRS ~ dat$CHAINS)
> dat.lm.sum <- summary(dat.lm)
> 
> my.slope.1 <- round(dat.lm.sum$coefficients[2],2)
> my.slope.2 <- round(dat.lm.sum$coefficients[4],2)
> 
> my.inter.1 <- round(dat.lm.sum$coefficients[1],2)
> my.inter.2 <- round(dat.lm.sum$coefficients[3],2)
> 
> my.Rsqua.1 <- round(dat.lm.sum$r.squared,2)
> 
> 
> Anything I try results in either the words 'paste("Slope:", my.slope.1,
> %+-%my.slope.2,sep="")' being written to the plot, or just
> 'my.slope.1+-my.slope2' (where the +- is correctly written).
> 
> I want to script it up and write all three lines to the plot with
> 'sep="\n"', rather than deciding three different heights.
> 
> 
> >I do not have an elegant solution for the alignment.
> 
> Thanks very much for what you gave, its a good start for me to figure out
> how I am supposed to be telling R what to do!
> 
> Any way to just get fixed width fonts with text? (for the alignment
> problem)
> 
> 
> Cheers,
> Dan.
> 
> >
> >Regards,
> >
> >Christoph Buser
> >
> >--------------------------------------------------------------
> >Christoph Buser <buser at stat.math.ethz.ch>
> >Seminar fuer Statistik, LEO C13
> >ETH (Federal Inst. Technology) 8092 Zurich      SWITZERLAND
> >phone: x-41-44-632-4673                fax: 632-1228
> >http://stat.ethz.ch/~buser/
> >--------------------------------------------------------------
> >
> >
> >Dan Bolser writes:
> > >
> > > I would like to annotate my plot with a little box containing the slope,
> > > intercept and R^2 of a lm on the data.
> > >
> > > I would like it to look like...
> > >
> > >  +----------------------------+
> > >  | Slope     :   3.45 +- 0.34 |
> > >  | Intercept : -10.43 +- 1.42 |
> > >  | R^2       :   0.78         |
> > >  +----------------------------+
> > >
> > > However I can't make anything this neat, and I can't find out how to
> > > combine this with symbols for R^2 / +- (plus minus).
> > >
> > > Below is my best attempt (which is franky quite pour). Can anyone
> > > improve on the below?
> > >
> > > Specifically,
> > >
> > > aligned text and numbers,
> > > aligned decimal places,
> > > symbol for R^2 in the text (expression(R^2) seems to fail with
> > > 'paste') and +-
> > >
> > >
> > >
> > > Cheers,
> > > Dan.
> > >
> > >
> > > dat.lm <- lm(dat$AVG_CH_PAIRS ~ dat$CHAINS)
> > >
> > > abline(coef(dat.lm),lty=2,lwd=1.5)
> > >
> > >
> > > dat.lm.sum <- summary(dat.lm)
> > > dat.lm.sum
> > >
> > > attributes(dat.lm.sum)
> > >
> > > my.text.1 <-
> > >   paste("Slope : ",     round(dat.lm.sum$coefficients[2],2),
> > >         "+/-",          round(dat.lm.sum$coefficients[4],2))
> > >
> > > my.text.2 <-
> > >   paste("Intercept : ", round(dat.lm.sum$coefficients[1],2),
> > >         "+/-",          round(dat.lm.sum$coefficients[3],2))
> > >
> > > my.text.3 <-
> > >   paste("R^2 : ",       round(dat.lm.sum$r.squared,2))
> > >
> > > my.text.1
> > > my.text.2
> > > my.text.3
> > >
> > >
> > > ## Add legend
> > > text(x=3,
> > >      y=300,
> > >      paste(my.text.1,
> > >            my.text.2,
> > >            my.text.3,
> > >            sep="\n"),
> > >      adj=c(0,0),
> > >      cex=1)
> > >
> > > ______________________________________________
> > > R-help at stat.math.ethz.ch mailing list
> > > https://stat.ethz.ch/mailman/listinfo/r-help
> > > PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html
> >
> 
> ______________________________________________
> R-help at stat.math.ethz.ch mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html
>




More information about the R-help mailing list