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

From: Greg Snow <Greg.Snow_at_imail.org>
Date: Wed, 09 Jun 2010 14:21:24 -0600

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
> PLEASE do read the posting guide http://www.R-project.org/posting-
> guide.html
> and provide commented, minimal, self-contained, reproducible code.
______________________________________________ R-help_at_r-project.org mailing list 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.
Received on Wed 09 Jun 2010 - 20:24:17 GMT

Archive maintained by Robert King, hosted by the discipline of statistics at the University of Newcastle, Australia.
Archive generated by hypermail 2.2.0, at Wed 09 Jun 2010 - 20:40:30 GMT.

Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-help. Please read the posting guide before posting to the list.

list of date sections of archive