可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I'd like to have an inset within a plot that makes up 25% of the width and height of the plotting area (area where the graphs are).
I tried:
# datasets
d0 <- data.frame(x = rnorm(150, sd=5), y = rnorm(150, sd=5))
d0_inset <- data.frame(x = rnorm(1500, sd=5), y = rnorm(1500, sd=5))
# ranges
xlim <- range(d0$x)
ylim <- range(d0$y)
# plot
plot(d0)
# add inset
par(fig = c(.75, 1, .75, 1), mar=c(0,0,0,0), new=TRUE)
plot(d0_inset, col=2) # inset bottomright
This puts the inset to absolute topright and also uses 25% of the device-width. How can I change it to the coordinates and width of the area where the graphs are?
回答1:
Look at the subplot
function in the TeachingDemos package. It may make what you are trying to do easier.
Here is an example:
d0 <- data.frame(x = rnorm(150, sd=5), y = rnorm(150, sd=5))
d0_inset <- data.frame(x = rnorm(1500, sd=5), y = rnorm(1500, sd=5))
plot(d0)
subplot(
plot(d0_inset, col=2, pch='.', mgp=c(1,0.4,0),
xlab='', ylab='', cex.axis=0.5),
x=grconvertX(c(0.75,1), from='npc'),
y=grconvertY(c(0,0.25), from='npc'),
type='fig', pars=list( mar=c(1.5,1.5,0,0)+0.1) )
回答2:
You can use par("usr")
to get the limits of the plot,
in user coordinates, and grconvert[XY]
to convert them
to normalized device coordinates (NDC, between 0 and 1),
before using them with par(fig=...)
.
plot(d0)
u <- par("usr")
v <- c(
grconvertX(u[1:2], "user", "ndc"),
grconvertY(u[3:4], "user", "ndc")
)
v <- c( (v[1]+v[2])/2, v[2], (v[3]+v[4])/2, v[4] )
par( fig=v, new=TRUE, mar=c(0,0,0,0) )
plot(d0_inset, axes=FALSE, xlab="", ylab="")
box()
回答3:
use par("plt")
to find out the area of the plotting region (seems to be similar to vincents answer).
Strangely: fig sets the size of the plotting area of the inset. So, if show the axis, the size of the inset will be larger than your 25%.
# datasets
d0 <- data.frame(x = rnorm(150, sd=5), y = rnorm(150, sd=5))
d0_inset <- data.frame(x = rnorm(1500, sd=5), y = rnorm(1500, sd=5))
# ranges
xlim <- range(d0$x)
ylim <- range(d0$y)
# plot
plot(d0)
# calculate position of inset
plotdim <- par("plt")
xleft = plotdim[2] - (plotdim[2] - plotdim[1]) * 0.25
xright = plotdim[2] #
ybottom = plotdim[4] - (plotdim[4] - plotdim[3]) * 0.25 #
ytop = plotdim[4] #
# set position for inset
par(
fig = c(xleft, xright, ybottom, ytop)
, mar=c(0,0,0,0)
, new=TRUE
)
# add inset
plot(d0_inset, col=2) # inset bottomright
回答4:
For me worked the example from the oce library:
http://finzi.psych.upenn.edu/library/oce/html/plotInset.html
See the example:
library(oce)
## power law in linear and log form
x <- 1:10
y <- x^2
plot(x, y, log='xy',type='l')
plotInset(3, 1, 10, 8,
expr=plot(x,y,type='l',cex.axis=3/4,mgp=c(3/2,1/2,0)),
mar=c(2.5,2.5,1,1))
## CTD data with location
data(ctd)
plot(ctd, which="TS")
plotInset(29.9, 2.7, 31, 10,
expr=plot(ctd, which='map',
coastline="coastlineWorld",
span=5000, mar=NULL, cex.axis=3/4))