Буфера внутренней ширины нет. Просто нужно вычислить strwidth
в контексте текущего устройства. Когда вы изменяете размер графического устройства после того, как ваш график нарисован, прямоугольники изменят размер, а текст - нет. Это приведет к тому, что видимое пространство вокруг вашего текста будет меняться в зависимости от размера окна.
Если вы внимательно указываете размеры вашего устройства перед рисованием графика и пересчитываете strwidth
для текста на этом устройстве, ваш код вокруг текста должны быть аккуратные рамки. Вы можете добавить фиксированное поле, не влияя на центрирование, и для этого не требуется информация, которая еще не доступна.
Вот функция для наглядности, которая позволяет полностью контролировать поля вокруг вашего текста:
michael_plot <- function(width = 9, height = 6, adj = c(0.5, 0.5), margin = 0)
{
dev.new(width = width, height = height, unit = "in", noRStudioGD = TRUE)
plot(x, y)
delx <- strwidth(l, cex = par('cex'))
xmarg <- strwidth("M", cex = par('cex')) * margin
dely <- strheight(l, cex = par('cex'))
ymarg <- strheight("M", cex = par('cex')) * margin / 2
text(x, y, l, adj = adj)
rect(x - adj[1] * delx - xmarg,
y - adj[2] * dely - ymarg,
x + (1 - adj[1]) * delx + xmarg,
y + (1 - adj[2]) * dely + ymarg)
}
Начиная со значения по умолчанию:
michael_plot()
![enter image description here](https://i.stack.imgur.com/r5cpd.png)
Коробки подходят идеально; на самом деле они слишком близки к тексту, поэтому мы должны добавить поле, чтобы сделать их более читаемыми:
michael_plot(margin = 1)
![enter image description here](https://i.stack.imgur.com/S4o90.png)
Но, что важно, мы можем безопасно перемещать их с помощью adj
, удерживая их по центру:
michael_plot(margin = 1, adj = c(0, 0.5))
![enter image description here](https://i.stack.imgur.com/loc9J.png)