Я использую R для создания небольшого количества графики, которая будет сохранена в виде файлов PNG, обычно размером 50x50 пикселей, которые в конечном итоге будут использоваться в гораздо большем изображении в качестве значков или маркеров. Поскольку содержимое часто меняется, желательно, чтобы они создавались программно, а не вручную.
Поскольку содержание также простое — несколько символов текста и несколько чисел — функции grid
кажутся простым способом решить эту проблему. Я совсем не знаю grid
, так как обычно использую библиотеки более высокого уровня, такие как ggplot2
. MRE ниже излагает то, что я уже достиг.
Это генерирует выходные данные, но у меня возникают проблемы с привязкой размеров и масштабов viewport
и различных grobs
к окончательному файлу PNG. То, что я получаю, это изображение ниже, которое на первый взгляд хорошо, но это изображение размером 480x480 пикселей, большая часть которого не используется, а центральная графика занимает только треть ширины и высоты.
Это кажется логичным, учитывая размер области просмотра (=.3
), но если я увеличу область просмотра, то, по-видимому, мне придется увеличить текст и так далее. (Я знаю, как изменить параметры png()
, чтобы отрегулировать плотность, количество пикселей и так далее, но на данный момент проблема заключается в самом изображении.)
Вопрос сводится к тому, как лучше всего создать файл PNG или SVG достойного качества размером 50x50 пикселей из такой графики, созданной в R, либо с использованием grid
, либо каким-либо другим подходом.
library(grid)
grid.newpage()
png(bg = "transparent")
pushViewport(viewport(width=.3, height=.3, clip="off"))
grid.rect(gp=gpar(lty=0, fill="#008000"))
grid.text("15.5", x = unit(0.5, "npc"), y = unit(0.75, "npc"),
just = "center", hjust = NULL, vjust = NULL, rot = 0,
check.overlap = FALSE, default.units = "npc",
name = NULL, gp = gpar(fontsize=48), draw = TRUE, vp = NULL)
grid.text("13h 20m", x = unit(0.5, "npc"), y = unit(0.25, "npc"),
just = "center", hjust = NULL, vjust = NULL, rot = 0,
check.overlap = FALSE, default.units = "npc",
name = NULL, gp = gpar(fontsize=32), draw = TRUE, vp = NULL)
lg <- linesGrob(x = unit(c(0, 1), "npc"),
y = unit(c(0.5, 0.5), "npc"),
gp = gpar(lwd=2))
grid.draw(lg)
dev.off()
png('test.png', width = 50, height = 50, bg = "transparent")
, но вам придется настроить размеры того, что вы рисуете, чтобы они соответствовали этому устройству. - person alistaire   schedule 10.08.2019npc
позаботятся о большей части относительных размеров для вас, но вам нужно удалитьwidth
иheight
изviewport
, чтобы он использовал значенияnpc
по умолчанию (это то, что вам нужно), и уменьшитьfontsize
, что не может бытьnpc
(16
и12
выглядят примерно так). Обобщая, вы можете хотя бы начать с SVG вместо PNG, поскольку первые предназначены для хорошего масштабирования. - person alistaire   schedule 10.08.2019