Добавить подтекст в окно просмотра

Я хотел бы добавить подтекст (textGrob) к grid Viewport -- возможно ли это?

Я понял, как добавить подтекст к одной диаграмме:

require(ggplot2) 
require(gridExtra)

# make the data
timeSeries <- data.frame(date = seq(as.Date("2001-01-01"), as.Date("2012-01-01"), by = "mon"), 
                     value = 1:133 + rnorm(133, 0, 10)
                     )


# make the ggplots
gpLine <- ggplot(timeSeries, aes(x = date, y = value)) +
                geom_line()

gpBar <- ggplot(timeSeries, aes(x = date, y = value)) +
                geom_bar(stat = 'identity')

# ggplot + subtext
grid.arrange(gpBar, sub = textGrob("why is this at the bottom?"))

... И я могу склеить две диаграммы, используя grid Viewport

# two plots, one view
vplayout <- function(x,y) viewport(layout.pos.row = x, layout.pos.col = y)

pushViewport(viewport(layout = grid.layout(3,1)))
print(gpLine, vp = vplayout(1:2, 1))
print(gpBar, vp = vplayout(3, 1))

... но я не могу понять, как добавить текст в нижнюю часть полученного окна просмотра.

Grid настолько завершен, я уверен, что должен быть способ, но он скрыт от меня.


person ricardo    schedule 02.05.2013    source источник


Ответы (3)


Вы очень близки:

popViewport() # brings you to the top viewport for the whole plotting area
grid.text("Hello Vicar", x = unit(0.5, "npc"), y = unit(0.25, "npc"))

После всех ваших команд выше.

person Bryan Hanson    schedule 02.05.2013
comment
+1, спасибо - текст теперь в середине сюжета. Я могу быть совершенно глупым, но как мне заставить его идти ко дну, как это делает grid.arrange с вызовом sub? - person ricardo; 02.05.2013
comment
Просто отрегулируйте значения x и y. x = y = 0,5 — мертвая точка во всей области построения. - person Bryan Hanson; 02.05.2013
comment
upViewport вообще лучше, чем pop - person baptiste; 02.05.2013
comment
большое спасибо, принято. На данный момент я использую +labs(x = ), чтобы сделать пустую строку внизу, чтобы поместить текстовый файл - это лучший способ? - person ricardo; 02.05.2013
comment
Это зависит от того, собираетесь ли вы делать это часто, нужно ли это автоматизировать? Я думаю, что более формальный способ сделать это — нажимать окна просмотра по мере необходимости. Во-первых, окно просмотра, представляющее собой всю область построения, затем окно просмотра, занимающее 90% высоты первого, с дополнительным пространством внизу. Сделайте свой график vplayout в этом втором окне просмотра, переместитесь вверх и нарисуйте дополнительные 10% пространства. Если вы сделаете vignette("grid"), вы получите документ, который поможет вам начать работу. В сетке есть несколько очень красивых виньеток. - person Bryan Hanson; 03.05.2013
comment
Я бы добавил, что ваш метод +labs() будет работать только с ggplot2, который предварительно вычисляет все пространство, необходимое для вашего графика, перед построением графика. ggplot2 использует графику сетки, но можно использовать базовые команды графики сетки для рисования вещей без ggplot2. Повеселись. - person Bryan Hanson; 03.05.2013
comment
@ricardo я в замешательстве: если вы все время хотели текст внизу, что не так с grid.arrange() и дополнительным аргументом? - person baptiste; 04.05.2013
comment
@baptiste мое понимание моих вариантов неоднородно - мое обучение было очень специфичным для решения проблем. Мое намерение состоит в том, чтобы иметь страницу с линейной диаграммой, занимающей 2/3, гистограммой 1/3 и текстовым маркером внизу. [Это] (ricardianambivalence.com/2013/05/03/house-prices -slow) — это готовый продукт. и да, я автоматизирую это. - person ricardo; 04.05.2013

Может быть, я что-то упускаю, так как я просто сделал бы следующее:

grid.arrange(gpLine, gpBar, heights = c(2/3, 1/3), 
     bottom = textGrob("this is my signature", x=1, hjust=1, vjust=0))

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

Редактирование (23.07.2015): вместо v›=2.0.0 для gridExtra аргумент был изменен с sub на bottom для согласованности.

person baptiste    schedule 04.05.2013
comment
спасибо за ваше редактирование о замене sub на bottom. бился головой о стену, пытаясь следовать другим решениям, которые рекомендовали sub. - person ecoe; 17.12.2015

В текущей версии ggplot2 использование gridExtra::grid.arrange не требуется:

p <- ggplot(...) + labs(caption = 'text at the bottom')

делает свое дело.

person ricardo    schedule 02.03.2018