# [R] Draw text with a box surround in plot.

Greg Snow Greg.Snow at imail.org
Wed Jun 9 22:21:24 CEST 2010

```If you cannot set the aspect ratio to 1 for the entire plot (Peter's solution), then you may consider using either subplot or my.symbols (TeachingDemos package) to create an asp=1 region within the plot that you can use to plot the rotated rectangle.

The other option is to do a little more matrix arithmetic to transform from the current coordinate system to one with aspect ratio of 1, do the rotation, then transform back to your current coordinate system.

Or maybe use grid graphics where you can rotate whole viewports.

--
Gregory (Greg) L. Snow Ph.D.
Statistical Data Center
Intermountain Healthcare
greg.snow at imail.org
801.408.8111

> -----Original Message-----
> From: r-help-bounces at r-project.org [mailto:r-help-bounces at r-
> project.org] On Behalf Of guox at ucalgary.ca
> Sent: Wednesday, June 09, 2010 10:14 AM
> To: Jim Lemon; r-help at r-project.org
> Subject: Re: [R] Draw text with a box surround in plot.
>
> Rectangle R centered at (x,y) with width 2w and height 2h is given by
>
> x1=x-w
> y1=y-h
> x2=x+w
> y2=y-h
> x3=x+w
> y3=y+h
> x4=x-w
> y4=y+h
> polygon(c(x1,x2,x3,x4),c(y1,y2,y3,y4))
>
> Rotating a point (u,v) at (0,0) by theta degree is given by matrix
> [cos(theta),-sin(theta)
>  sin(theta),cos(theta)]
> so we have a new point (u*cos(theta)-
> v*sin(theta),u*sin(theta)+v*cos(theta)).
>
> Hence rotated R by theta at (x,y) is given by
>
> x.rotated = c(x + (x1-x)*cos(theta)-(y1-y)*sin(theta),
>               x + (x2-x)*cos(theta)-(y2-y)*sin(theta),
>               x + (x3-x)*cos(theta)-(y3-y)*sin(theta),
>               x + (x4-x)*cos(theta)-(y4-y)*sin(theta))
> y.rotated = c(y + (x1-x)*sin(theta)+(y1-y)*cos(theta),
>               y + (x2-x)*sin(theta)+(y2-y)*cos(theta),
>               y + (x3-x)*sin(theta)+(y3-y)*cos(theta),
>               y + (x4-x)*sin(theta)+(y4-y)*cos(theta))
>
> polygon(x.rotated,y.rotated)
>
> But it turns out to be a parallelogram with angles not equal to 90,
> not a rectangle. See R code below.
>
> Any way to improve this so that the rotated rectangle looks like a
> rectangle? Thanks,
>
> -james
>
>
> plot(1:10,1:10,xlim=c(1,20),ylim=c(1,40),type="n", main = "Rotated
> rectangle looks like a   ")
> ## a rect at (10,20) with w = 3 and h = 2
> x = 10
> y = 20
> w = 3
> h = 2
> x1=x-w
> y1=y-h
> x2=x+w
> y2=y-h
> x3=x+w
> y3=y+h
> x4=x-w
> y4=y+h
> polygon(c(x1,x2,x3,x4),c(y1,y2,y3,y4),border="blue")
>
> ##Rotate it at (10,10) by 45 degree
> theta = 45/180*pi
> x.rotated = c(10 + (x1-10)*cos(theta)-(y1-20)*sin(theta),
>               10 + (x2-10)*cos(theta)-(y2-20)*sin(theta),
>               10 + (x3-10)*cos(theta)-(y3-20)*sin(theta),
>               10 + (x4-10)*cos(theta)-(y4-20)*sin(theta))
> y.rotated = c(20 + (x1-10)*sin(theta)+(y1-20)*cos(theta),
>               20 + (x2-10)*sin(theta)+(y2-20)*cos(theta),
>               20 + (x3-10)*sin(theta)+(y3-20)*cos(theta),
>               20 + (x4-10)*sin(theta)+(y4-20)*cos(theta))
>
> polygon(x.rotated,y.rotated,border="red")
>
>
> > On 06/04/2010 01:21 AM, guox at ucalgary.ca wrote:
> >> boxed.labels draw text with box well.
> >> But, the box cannot be shadowed and srt = 45 seems not to work:
> >> text is rotated but the box does not.
> >> polygon.shadow can rotate and shadow but have to calculate its
> >> dimensions,
> >> based on the text length and size.
> >> Do you have any other way to draw text with rotated and shadowed
> box?
> >
> > The srt argument was intended to allow the user to rotate the text in
> 90
> > degree increments, and the box just changes shape to fit whatever is
> in
> > it. The underlying function that draws the box (rect) doesn't have a
> > rotation argument. It would be possible to write a special function
> > using polygon, just do the calculations for box size and then rotate
> the
> > text with srt= and the polygon by transforming the coordinates of the
> > vertices, as long as the default justification (center) is used. I
> can't
> > do this right at the moment, but if you are really stuck I might be
> able
> > to do it in the near future.
> >
> > Jim
> >
> >
> >
>
> ______________________________________________
> R-help at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help