Подтвердить что ты не робот

Поместите рамку вокруг заголовка в общей диаграмме R

У меня есть оформленный сюжет с названием. Мне было интересно, есть ли быстрый и простой способ поставить рамку вокруг (основного) названия сюжета.

Кадр должен иметь ту же ширину, что и рамка вокруг графика. Есть ли способ отрегулировать высоту кадра?

Я хотел бы придерживаться общей функции построения графика.

# Some example data
x <- rnorm(10)
y <- rnorm(10)

# Plot data and add title
plot(x,y, 
     xlab = "",
     ylab = "",
     frame = TRUE
     )
title( main = "This should be framed")

Большое спасибо и приятные выходные для всех!

4b9b3361

Ответ 1

Одна из возможностей - использовать rect.

Сначала используйте par("usr"), чтобы получить "крайности пользовательских координат области построения".

Поскольку вы хотите, чтобы "кадр должен иметь ту же ширину, что и рамка вокруг графика", позиции x являются простыми: используйте первое и второе значения "пользовательских координат" как xleft и xright.

Нижнее и верхнее положения rect требуют некоторой дополнительной работы. Позиция y title "по умолчанию имеет вертикальное центрирование в (внешнем) краю 3" (?title). Используйте par("mai"), чтобы получить поля в дюймах. Вычислите среднюю точку верхнего поля y, разделив марж 3 на 2 (par("mai")[3] / 2). Определите высоту кадра, например. 0,5, что соответствует полпути между центром заголовка и границей области фигуры и области графика соответственно.

Чтобы преобразовать из дюймов в пользовательские координаты, используйте grconvertY. То есть мы умножаем значение в дюймах на diff(grconvertY(y = 0:1, from = "inches", to = "user")) (см., Например, здесь). Затем это значение добавляется к верхней пользовательской координате y (coord[4]).

coord <- par("usr")
y_mid <- par("mai")[3] / 2
height <- 0.5
conv <- diff(grconvertY(y = 0:1, from = "inches", to = "user"))

rect(xleft = coord[1],
     xright = coord[2],
     ybottom = coord[4] + (y_mid * (1 - height) * conv),
     ytop = coord[4] + (y_mid * (1 + height) * conv),
     xpd = TRUE)

введите описание изображения здесь

Ответ 2

Графическая система grid имеет гораздо лучшие возможности для обработки единиц, поэтому у меня возникнет соблазн использовать пакет gridBase для перехода на графическую систему, в которой форму прямоугольника и положение можно более точно назвать. Вот как это выглядит:

library(grid)
library(gridBase)

## Standard idiom for setting your frame of reference to be that of the base R plot frame
lapply(baseViewports(), pushViewport)
## Draw a rectangle centered 2 lines above frame and 1.5 lines of text in height
grid.rect(y = unit(1,"npc") + unit(2, "lines"), 
          height = unit(1.5, "lines"), just = "center")

введите описание изображения здесь

В отличие от решения основанного на Хенрике R, это не потребует, чтобы вы играли вручную для каждого сюжета, экспериментируя, пока не получите правильные координаты y прямоугольника.