Как сохранить диаграмму ggrough как .png - PullRequest
0 голосов
/ 29 июня 2019

Скажите, что я использую пакет R ggrough (https://xvrdm.github.io/ggrough/). У меня есть этот код (взят с этой веб-страницы):

library(ggplot2)
library(ggrough)
count(mtcars, carb) %>%
    ggplot(aes(carb, n)) +
    geom_col() + 
    labs(title="Number of cars by carburator count") + 
    theme_grey(base_size = 16) -> p 
options <- list(
    Background=list(roughness=8),
    GeomCol=list(fill_style="zigzag", angle_noise=0.5, fill_weight=2))

Затем я могу создать диаграмму (Я использую RStudio):

get_rough_chart(p, options)

Однако, какой код я могу использовать, чтобы сохранить его как файл .png? Я пытаюсь:

png("ggrough.png")
get_rough_chart(p, options)
dev.off()

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

x11()
get_rough_chart(p, options)

Но это тоже не сработает (и даже если он действительно рендерится в окне x11, я не знаю, как сохранить его как .png.

Что мне делатьсделать, чтобы сохранить ggrough график как .png?

1 Ответ

1 голос
/ 01 июля 2019

График 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()

plot need help

...