538-й вывод ggplot: оправдание изображения Grob в графике R-сетки
Я пытаюсь написать небольшую служебную функцию, которая будет комментировать мои сюжеты в стиле Рувима Фишера-Баума с красивым небольшим логотипом и URL-адресом внизу - например:
Я понял, как загрузить файл postscript в R; это оправдывает изображение внизу сюжета, которое сводит меня с ума. Я не могу получить pictureGrob
влево оправдать; в лучшем случае я могу расположить его по центру с левой стороны моего графика, но половина моего изображения обрезается, как этот воспроизводимый пример ниже:
Возиться с width
настройка может примерно приблизить то, что я пытаюсь достичь, ограничивая буфер вокруг pictureGrob
Но я думаю, что я действительно хочу выровнять само изображение внутри своего окна просмотра ИЛИ сделать окно просмотра полностью прилегающим к изображению. [Пол Меррелл делает нечто подобное на с. 162 таблицы сетки, но это, кажется, зависит от stringWidth
вспомогательная функция, у которой нет партнера для картинок (?)]
Я задал похожий вопрос о таблицах gridextra, но, как отмечает Баптист, "Обоснование всегда довольно неудобно для работы в сетке".
Любая помощь приветствуется; указатель на любое концептуальное обсуждение того, что происходит с обоснованием в сетке, будет впечатляющим.
Воспроизводимый код (обратите внимание, что grImport
требует установки ghostscript):
require(grImport)
require(ggplot2)
require(gridExtra)
#nb: you also need ghostscript installed on your machine.
#I had a hell of a time getting ghostscript to work properly.
#From the bowels of a R mailing list, I found this helpful tip
#from Paul Murrell himself:
#https://www.mail-archive.com/r-help@r-project.org/msg203180.html
#YMMV, THIS WORKED ON MY MACHINE:
#gswin <- shortPathName("C:/Program Files/gs/gs9.15/bin/gswin64c.exe")
#Sys.setenv(R_GSCMD = gswin)
#get a fun little moon
PostScriptTrace(
file=file.path(system.file(package = "RGraphics"), "extra", "comic_moon.ps"),
outfilename="comic_moon.xml")
moon <- readPicture("comic_moon.xml")
annotate_me <- function(
plot_to_annotate,
some_picture,
bg_color="gray30"
) {
#make a gTree
foo <- gTree(
children=gList(
rectGrob(gp=gpar(fill=bg_color)),
pictureGrob(
picture=some_picture,
x=0, y=0.5,
#width=?
)
)
)
final <- arrangeGrob(
plot_to_annotate, foo,
nrow=2, heights=c(19,1)
)
return(final)
}
annotate_me(
plot_to_annotate=qplot(mpg, data=mtcars),
some_picture=moon
)
1 ответ
Я считаю, что widthDetails не реализовано для pictureGrobs, поэтому оправдание делает случайные вещи.
Вот один из подходов: определите ширину вашего объекта и поместите его на ширину х = 0,5.
require(grImport)
hourglass <- new("Picture",
paths= list(new("PictureFill",
x=c(0, 1, 0, 1),
y=c(0, 0, 1, 1))),
summary= new("PictureSummary",
numPaths=1,
xscale=c(0, 1),
yscale=c(0, 1)))
g1 <- pictureGrob(hourglass, use.gc=FALSE,x=unit(1,"line"),
width=unit(2,"line"), gp=gpar(fill="red"))
library(ggplot2)
library(gtable)
library(dplyr)
p <- qplot(1,1)
g <- ggplotGrob(p)
grid.newpage()
g %>%
gtable_add_rows(unit(2,"lines")) %>%
gtable_add_grob(rectGrob(gp=gpar(fill="grey")), name="border",
t=nrow(g)+1,l=1,r=ncol(g)) %>%
gtable_add_grob(g1, t=nrow(g)+1,l=1,r=ncol(g)) %>%
gtable_add_grob(textGrob("text here", x=1, hjust=1, gp=gpar(col="white")),
name = "text", t=nrow(g)+1,l=1,r=ncol(g)) %>%
grid.draw