Что контролирует кажущийся буфер в strwidth? - PullRequest
3 голосов
/ 07 мая 2020

Я пытаюсь обернуть текстовые метки в прямоугольник.

Вот простой график с метками:

x = mtcars$wt
y = mtcars$mpg
l = rownames(mtcars)

plot(x, y)
text(x, y, l, adj = .5) # i.e., the default

enter image description here

Я могу успешно использовать strwidth и strheight для выполнения sh упаковки следующим образом:

delx = strwidth(l, cex = par('cex'))
dely = strheight(l, cex = par('cex'))

rect(x - .5*delx, y - .5*dely, x + .5*delx, y + .5*dely)

enter image description here

Обратите внимание на " пробелы »пробелов слева и справа от каждой метки. На данный момент это нормально, но это приводит к проблемам при попытке учесть adj на графике:

adj = c(0, .5)
plot(x, y)
text(x, y, l, adj = adj)
rect(
  x - adj[1L]*delx, y - adj[2L]*dely, 
  x + (1-adj[1L])*delx, y + (1-adj[2L])*dely
)

enter image description here

Поле хорошо отрегулирован по направлению, но, похоже, это точное преобразование, мне нужно дополнительно учесть все, что создает ширину «буфера».

Что это? Я еще ничего не видел в? Par или? Strwidth.

1 Ответ

1 голос
/ 08 мая 2020

Буфера внутренней ширины нет. Просто нужно вычислить 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

Коробки подходят идеально; на самом деле они слишком близки к тексту, поэтому мы должны добавить поле, чтобы сделать их более читаемыми:

michael_plot(margin = 1)

enter image description here

Но, что важно, мы можем безопасно перемещать их с помощью adj, удерживая их по центру:

michael_plot(margin = 1, adj = c(0, 0.5))

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...