rasterImageAdj {Ecfun} | R Documentation |
rasterImage adjusting to zero distortion
Description
Call rasterImage
to plot image
from (xleft, ybottom)
to either
xright
or ytop
, shrinking one
toward the center to avoid distortion.
angle
specifies a rotation around the midpoint
((xleft+xright)/2
, (ybottom+ytop)/2
).
This is different from rasterImage
,
which rotates around (xleft, ybottom)
.
NOTE: The code may change in the future. The visual image with rotation looks a little off in the examples below, but the code seems correct. If you find an example where this is obviously off, please report to the maintainer – especially if you find a fix for this.
Usage
rasterImageAdj(image, xleft=par('usr')[1],
ybottom=par('usr')[3], xright=par('usr')[2],
ytop=par('usr')[4], angle = 0, interpolate = TRUE,
xsub=NULL, ysub=NULL, ...)
Arguments
image |
a |
xleft |
a vector (or scalar) of left x positions. |
ybottom |
a vector (or scalar) of bottom y positions. |
xright |
a vector (or scalar) of right x positions. |
ytop |
a vector (or scalar) of top y positions. |
angle |
angle of rotation in degrees, anti-clockwise
about the centroid of NOTE: |
interpolate |
a logical vector (or scalar) indicating whether to apply linear interpolation to the image when drawing. |
xsub , ysub |
subscripts to subset |
... |
graphical parameters (see |
Details
1. imagePixels
= number of (x, y) pixels in
image
. Do this using
dim(as.raster(image))[2:1]
, because the
first dimension of image
can be either x or
y depending on class(image)
. For example
link[EBImage]{Image}
returns dim
with
x first then y and an optional third dimension for
color. A simple 3-dimensional array is assumed by
rasterImage
to have the y dimension
first. as.raster
puts all these in a
standard format with y first, then x.
2. imageUnits <- c(x=xright-xleft, ytop-ybottom)
3. xyinches
= (x, y) units per inch in the
current plot, obtained from xyinch
.
4. Compute pixel density (pixels per inch) in both
x and y dimension: pixelsPerInch <-
imagePixels * xyinches / imageUnits
.
5. Compute imageUnitsAdj
solving 4 for
imageUnits
and replacing pixelsPerInch
by the max pixel density: imageUnitsAdj <-
imagePixels * xyinches / max(pixelsPerInch)
.
6. (dX, dY) = imageUnitsAdj/2
= half of the
(width, height) in plotting units.
7. cntr = (xleft, ybottom) + (dX, dY)
.
xleft0 = cntr[1]+sin((angle-90)*pi/180)*dX*sqrt(2)
;
ybottom0= cntr[2]-cos((angle-90)*pi/180)*dY*sqrt(2)
;
(xright0, ytop0)
= (upper right without rotation about lower left)
xright0 = xleft0+imageUnitsAdj[2]
ytop0 = ybottom0+imageUnitsAdj[2]
8. rasterImage(image, xleft0, ybottom0,
xright0, ytop0, angle, interpolate, ...)
Value
a named vector giving the values of xleft
,
ybottom
, xright
, and ytop
passed to rasterImage
.
(rasterImage
returns NULL
,
at least for some inputs.) This shows the adjustment,
shrinking toward the center and rotating as desired.
Author(s)
Spencer Graves
See Also
Examples
# something to plot
logo.jpg <- file.path(R.home('doc'), 'html', 'logo.jpg')
if(require(jpeg)){
##
## 1. Shrink as required
##
Rlogo <- try(readJPEG(logo.jpg))
if(inherits(Rlogo, 'array')){
all.equal(dim(Rlogo), c(76, 100, 3))
plot(1:2)
# default
rasterImageAdj(Rlogo)
plot(1:2, type='n', asp=0.75)
# Tall and thin
rasterImage(Rlogo, 1, 1, 1.2, 2)
# Fix
rasterImageAdj(Rlogo, 1.2, 1, 1.4, 2)
# short and wide
rasterImage(Rlogo, 1.4, 1, 2, 1.2)
# Fix
rasterImage(Rlogo, 1.4, 1.2, 2, 1.4)
##
## 2. rotate
##
# 2.1. angle=90: rasterImage left of rasterImageAdj
plot(0:1, 0:1, type='n', asp=1)
rasterImageAdj(Rlogo, .5, .5, 1, 1, 90)
rasterImage(Rlogo, .5, .5, 1, 1, 90)
# 2.2. angle=180: rasterImage left and below
plot(0:1, 0:1, type='n', asp=1)
rasterImageAdj(Rlogo, .5, .5, 1, 1, 180)
rasterImage(Rlogo, .5, .5, 1, 1, 180)
# 2.3. angle=270: rasterImage below
plot(0:1, 0:1, type='n', asp=1)
rasterImageAdj(Rlogo, .5, .5, 1, 1, 270)
rasterImage(Rlogo, .5, .5, 1, 1, 270)
##
## 3. subset
##
dim(Rlogo)
# 76 100 3
Rraster <- as.raster(Rlogo)
dim(Rraster)
# 76 100:
# x=1:100, left to right
# y=1:76, top to bottom
rasterImageAdj(Rlogo, 0, 0, .5, .5, xsub=40:94)
}
}