Добавить цитату в сноске за пределами области графика в R?

Я хотел бы добавить цитату в сноске к моему графику трехпанельной сетки фасетов, созданному в R. Это сноска, указывающая на источник данных. В идеале я бы хотел, чтобы он был ниже и вне всех трех осей - желательно в нижнем левом углу.

Я использую ggplot2, а также ggsave(). Это означает, что я не могу использовать решения на основе grid.text(), потому что они используются только в окне x11() и не могут быть добавлены к объекту ggplot.

Использование вместо этого png() ...code... dev.off() не представляется возможным, потому что мне нужны параметры изменения размера ggsave, и я считаю, что эта команда обеспечивает более качественные и четкие отпечатки (которые также намного быстрее, потому что я не печатаю на экран).

Вот мой базовый код:

p1 <- ggplot(data, aes(date, value))
    facet_grid(variable ~ .) + geom_point(aes(y =value), size=1) + 
    theme_bw() +
        opts(title=mytitle)
print(p1)
ggsave("FILE.png",width=mywidth, height=myheight, p1, dpi=90)

Я пробовал:

p1 <- ggplot(data, aes(date, value))
    facet_grid(variable ~ .) + geom_point(aes(y =value), size=1) + 
    theme_bw() +
        opts(title=mytitle)
print(p1)
grid.text(unit(0.1,"npc"),0.025,label = "Data courtesy of Me")
grid.gedit("GRID.text", gp=gpar(fontsize=7))
ggsave("FILE.png",width=mywidth, height=myheight, p1, dpi=90)

Это правильно помещает сноску в нижний левый угол дисплея x11 (), внешний по отношению к графикам, но, к сожалению, поскольку он не применяется к объекту p1, он не сохраняется командой ggsave.

Я также пробовал:

p1 <- ggplot(data, aes(date, value))
    facet_grid(variable ~ .) + geom_point(aes(y =value), size=1) + 
    theme_bw() +
    opts(title=mytitle) +
annotate("text", label = "Footnote", x = 0, y = 10, size = 5, colour = "black") +
print(p1)
ggsave("FILE.png",width=mywidth, height=myheight, p1, dpi=90)

Это успешно печатается с использованием ggsave, однако имеет следующие проблемы:

  • Это повторяется 3 раза в каждой из 3 граней, а не 1 раз.
  • Он содержится внутри сюжетов, а не вне их.
  • Текст сложно разместить --- похоже, используются блоки сюжета (моя ось x - это дата, поэтому 0 указывает на 1970 год).
  • Размер текста не меняется, несмотря на мой параметр размера.

Пара ссылок по теме, когда я исследовал это ...


person Mittenchops    schedule 17.04.2012    source источник


Ответы (3)


library(gridExtra)
library(grid)
library(ggplot2)

g <- grid.arrange(qplot(1:10, 1:10, colour=1:10) + labs(caption="ggplot2 caption"), 
              bottom = textGrob("grid caption", x = 1, 
                                hjust = 1, gp = gpar(fontface = 3L, fontsize = 9)))
ggsave("plot.pdf", g)

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

Изменить: обратите внимание, что это решение несколько дополняет недавний аргумент заголовка, добавленный в ggplot2, поскольку textGrob здесь может быть выровнен относительно всей фигуры, а не только панели графика.

person baptiste    schedule 17.04.2012
comment
Этот подход не работает для gridExtra_0.8.1 и ggplot2_0.9.3.1 с сообщением об ошибке Error in switch(ct, ggplot = ggplotGrob(grobs[[ii.table]]), trellis = latticeGrob(grobs[[ii.table]]), : EXPR must be a length 1 vector - person russellpierce; 07.03.2013
comment
поэтому вам следует обновить gridExtra до текущей версии - person baptiste; 07.03.2013
comment
Фантастическая практическая статья, основанная на этом вопросе: bigdata-analyst.com/ - person Tom; 25.08.2014
comment
Похоже, это не работает в версии gridExtra 2.0.0 - аргумент sub = больше не поддерживается, а arrangeGrob() возвращает TableGrob, а не объект, унаследованный от ggplot. - person Tom; 20.07.2015
comment
@Tom Версия ggplot2 для разработчиков теперь позволяет ggsave сохранять объект из arrangeGrob(). См. фиксацию. - person BeingQuisitive; 02.08.2015
comment
Учитывая переписывание gridExtra автором пакета (тем же автором этого ответа), предоставленное решение больше невозможно с самым последним пакетом gridExtra. Вы можете сделать что-то вроде этого: grid.arrange (g, ncol = 1, bottom = footnote) - person yokota; 03.01.2016
comment
@ user2434624 ваш комментарий меня озадачивает: я редактировал ответ в июле прошлого года - person baptiste; 03.01.2016
comment
Я считаю, что приведенный ниже ответ с labs(caption = ...) ответом является самым простым и наиболее естественным решением ggplot2. - person Nicholas G Reich; 22.07.2020

ggplot2 теперь имеет эту возможность изначально без необходимости в дополнительных пакетах. ... + labs(caption = "footnote", ...)

library(ggplot2) 
ggplot(diamonds, aes(carat, price, color = clarity)) + 
  geom_point() + 
  labs(title = "Diamonds are forever...", 
       subtitle = "Carat weight by Price", 
       caption = "H. Wickham. ggplot2: Elegant Graphics for Data Analysis Springer-Verlag New York, 2009.")

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

person Brandon Bertelsen    schedule 16.02.2017

Дополнение к ответу Брэндона Бертельсена: если вы хотите, чтобы подпись была в левом углу, добавьте

theme(plot.caption = element_text(hjust = 0))
person MartineJ    schedule 04.04.2018