Как добавить врезку (подплот) в «верхний край» графика R?

Я хотел бы иметь вставку внутри графика, которая составляет 25% ширины и высоты области построения (области, где находятся графики).

Я старался:

# datasets
d0 
 Henrik11 июн. 2013 г., 12:18
Может работать сlayout() (например.,Вот) в комбинации сxpd=TRUE может работать
 R_User11 июн. 2013 г., 12:39
Была команда, которая сообщает вам размер области печати.

Ответы на вопрос(4)

http://finzi.psych.upenn.edu/library/oce/html/plotInset.html

Смотрите пример:

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))

использованиеpar("plt") выяснить площадь заговора области (похоже на ответ Винсента). Странно: рис задает размер области построения вставки. Таким образом, если показать ось, размер вставки будет больше, чем ваши 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
Решение Вопроса

subplot функция в пакете TeachingDemos. Это может сделать то, что вы пытаетесь сделать проще.

Вот пример:

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) )

 R_User12 июн. 2013 г., 08:53
Даже сsubplot Очень сложно контролировать размер вставки:The rectangle defined by x, y, size, vadj, and hadj will be used as the plotting area of the new plot. Any tick marks, axis labels, main and sub titles will be outside of this rectangle.
 Greg Snow13 июн. 2013 г., 17:40
@ Свен, мне никогда не удавалосьsplit.screen играть хорошо, поэтому я не использовал его в течение многих лет. Смешивание различных инструментов для работы с графикой требует определенной осторожности.
 R_User13 июн. 2013 г., 10:39
Если вы используетеsplit.screen() чтобы иметь более одного графика, кажется, что в субплоте используется значение / с, сложенное из всех графиков. Таким образом, вам нужно настроить координаты в.grconvertX()
 R_User14 июн. 2013 г., 08:11
split.screen() это хорошо, но это может занять некоторое время, чтобы выяснить причины странного поведения. Вот почему я разместил подсказку выше. Другой совет будет: использоватьpar() перед переключением экранов.
 Greg Snow12 июн. 2013 г., 17:54
@ Свен, если вы установитеtype='fig' вместо по умолчанию'plt' тогда все метки, галочки и т. д. будут находиться внутри указанного прямоугольника.
 Greg Snow12 июн. 2013 г., 19:02
@Sven, я добавил пример, используяsubplot выше. Это предполагает, что вы хотели, чтобы оно было в правом нижнем углу, как в вашем комментарии (легко изменить на другие углы), и что вы хотели, чтобы оно занимало 1/4 линейного пространства (1/16 от площади, также легко изменить).

Ты можешь использовать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()

 Andy Barbour03 мар. 2014 г., 00:26
Хороший пример. Я хотел бы отметить, что можно добавитьrect(u[2], u[4], (u[1]+u[2])/2, (u[3]+u[4])/2, col="white") до второгоpar команда, чтобы заполнить область вставки белым (и нарисовать черную рамку, устраняя необходимостьbox).

Ваш ответ на вопрос