График ggrough
в глубине души htmlwidget
, поэтому я не думаю, что типичный код сохранения изображения будет работать.
Как уже упоминалось, вы можете сохранить htmlwidgets
на диск через htmlwidgets::saveWidget(rough_chart_object, "rough_chart.html")
.Это создает HTML-файл с HTML-элементом Canvas, который рисуется с помощью встроенного JavaScript.Как вы заметили, webshot::webshot()
не может сделать снимок по какой-то причине, которую мне тоже еще предстоит выяснить.
Поскольку html-файл правильно отображается в Chrome, я написал этот подход RSelenium.Тем не менее, RSelenium может быть трудной для запуска со всеми взаимозависимостями, и изображение, созданное с помощью этого подхода, может потребовать последующей обработки.То есть, поскольку график не заполняет весь элемент canvas, изображение содержит много нежелательных пробелов.
Но я оставлю этот подход здесь, чтобы другие могли подумать.
library(dplyr)
library(ggplot2)
library(ggrough)
library(RSelenium)
library(htmlwidgets)
# make ggplot
count(mtcars, carb) %>%
ggplot(aes(carb, n)) +
geom_col() +
labs(title="Number of cars by carburator count") +
theme_grey(base_size = 16) -> gg_obj
# convert to rough chart
options <- list(
Background=list(roughness=8),
GeomCol=list(fill_style="zigzag", angle_noise=0.5, fill_weight=2))
rough_chart <- get_rough_chart(p = gg_obj, rough_user_options = options)
# save rough chart
saveWidget(rough_chart, "rough_chart.html")
# start selenium driver
rd <- remoteDriver(
remoteServerAddr = "localhost",
port = 4444L,
browserName = "chrome"
)
rd$open()
# navigate to saved rough chart file
rd$navigate(paste0("file:///", getwd(), "/rough_chart.html"))
# find canvas element and size
canvas_element <- rd$findElement("id", "canvas")
canvas_size <- canvas_element$getElementSize()
# zoom to chart size with padding
rd$setWindowSize(canvas_size$width + 2 * canvas_size$x,
canvas_size$height + 2 * canvas_size$y)
# save as png
rd$screenshot(file = "rough_chart.png")
# close chrome
rd$close()