如何将插图(子图)添加到R图的"顶部"?

R_U*_*ser 14 plot r insets

我希望在一个绘图中有一个插图,它占绘图区域(图形所在区域)宽度和高度的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)

# add inset
par(fig = c(.75, 1, .75, 1), mar=c(0,0,0,0), new=TRUE)
plot(d0_inset, col=2) # inset bottomright
Run Code Online (Sandbox Code Playgroud)

这使得插入物处于绝对顶部并且还使用了25%的设备宽度.如何将其更改为图形所在区域的坐标和宽度?

Vin*_*ynd 14

您可以使用它par("usr")来获取绘图的限制,在用户坐标中,并grconvert[XY]在使用之前将它们转换为规范化设备坐标(NDC,介于0和1之间)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()
Run Code Online (Sandbox Code Playgroud)

正确的插图

  • 很好的例子.我会注意到可以添加`rect(u [2],u [4],(u [1] + u [2])/ 2,(u [3] + u [4])/ 2,col = "white")`在第二个'par`命令之前用白色填充插入区域(并绘制黑色边框,无需"box"). (2认同)

Gre*_*now 9

查看subplotTeachingDemos包中的函数.它可能使你想要做的更容易.

这是一个例子:

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) )
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


Joh*_*eth 5

用于par("plt")找出绘图区域的面积(似乎类似于 vincents 的答案)。奇怪的是: fig 设置了插图的绘图区域的大小。因此,如果显示轴,插图的大小将大于您的 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
Run Code Online (Sandbox Code Playgroud)