Как захватить вывод html как png в R

Я использую интерактивный вывод, созданный пакетом networkD3 в R. Я знаю, как сохранить вывод в виде html-страницы, но мне также нужно сохранить «статическую» версию диаграммы в виде файла .png.

Код выглядит следующим образом:

# Load package
library(networkD3)

# Create fake data
src <- c("A", "A", "A", "A", "B", "B", "C", "C", "D")
target <- c("B", "C", "D", "J", "E", "F", "G", "H", "I")
networkData <- data.frame(src, target)

# Plot
simpleNetwork(networkData)

Я могу сохранить вывод, нажав «Экспорт», а затем «Сохранить как изображение». Однако я предпочитаю использовать некоторые команды в своем коде для сохранения изображения.


person Lenka Vraná    schedule 28.01.2016    source источник
comment
Это в полнофункциональном веб-браузере или в окне RStudio? Потому что если это веб-браузер, то пакет RSelenium сделает это за вас...   -  person Spacedman    schedule 28.01.2016
comment
Это в окне просмотра RStudio. И я также хотел бы в конечном итоге запустить это из Jupyter Notebook.   -  person Lenka Vraná    schedule 28.01.2016
comment
Вы можете найти это обсуждение полезным. github.com/ramnathv/htmlwidgets/issues/95   -  person Jean V. Adams    schedule 28.01.2016
comment
@JeanV.Adams Я нашел эту функцию благодаря вам. И я смог настроить его так, чтобы он делал именно то, что мне было нужно. Еще раз спасибо!   -  person Lenka Vraná    schedule 31.01.2016
comment
@LenkaVraná, есть ли шанс, что вы могли бы написать это как ответ для тех из нас, кто менее разбирается в PhantomJS?   -  person BLT    schedule 20.10.2016
comment
@BLT Я добавил свое решение в качестве ответа. Однако вам все равно придется справиться с PhantomJS.   -  person Lenka Vraná    schedule 27.10.2016


Ответы (2)


просто обновление возможных решений. Существует пакет под названием webshot (автор W. Chang и др.), который выполняет рендеринг и делает скриншоты html-страниц.

например использование:

webshot::webshot("file.html")

И чтобы получить файл html, вы можете проверить htmlwidgets::saveWidget Р. Вайдьянатана и др.


полностью воспроизводимый пример (сохраняет simpleNetwork.png в вашем текущем рабочем каталоге)

library(networkD3)

src <- c("A", "A", "A", "A", "B", "B", "C", "C", "D")
target <- c("B", "C", "D", "J", "E", "F", "G", "H", "I")
networkData <- data.frame(src, target)

sn <- simpleNetwork(networkData)
saveNetwork(sn, "sn.html")

library(webshot)
webshot("sn.html", "simpleNetwork.png")

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

person chinsoon12    schedule 26.01.2018

Я использовал функцию с этой страницы https://github.com/hafen/trelliscope/blob/master/R/thumb.R и попытался упростить его.

Вам необходимо установить PhantomJS с http://phantomjs.org/download.html и указать путь в переменные окружения.

Функция выглядит так (параметр p — виджет html, thumbName — имя нового файла .png):

library(htmlwidgets)

widgetThumbnail <- function(p, thumbName, width = 1024, height = 768) {
  phantom <- findPhantom()

  success <- FALSE
  if(phantom == "") {
    message("** phantomjs dependency could not be found - thumbnail cannot be generated (run phantomInstall() for details)")
  } else {
    res <- try({
      ff <- paste0(thumbName, ".html")
      ffjs <- paste0(thumbName, ".js")

      # don't want any padding
      p$sizingPolicy$padding <- 0
      suppressMessages(saveWidget(p, ff, selfcontained = FALSE))

      js <- paste0("var page = require('webpage').create();
                    page.viewportSize = { width: ", width,", height: ", height," };
                    page.clipRect = { top: 0, left: 0, width: ", width,", height: ", height," };
                    page.open('", ff, "', function(status) {
                    console.log(\"Status: \" + status);
                    if(status === \"success\") {
                    page.render('", thumbName, ".png');
                    }
                    phantom.exit();
                    });")
      cat(js, file = ffjs)
      system2(phantom, ffjs)
    })
    if(!inherits(res, "try-error")) {
      success <- TRUE
    }
    if(!file.exists(paste0(thumbName, ".png"))) {
      success <- FALSE
    }
  }

  if(!success) {
    message("** could not create htmlwidget thumbnail... creating an empty thumbnail...")
  }
}

#' Get instructions on how to install phantomjs
#' @export
phantomInstall <- function() {
  message("Please visit this page to install phantomjs on your system: http://phantomjs.org/download.html")
}

# similar to webshot
findPhantom <- function() {

  phantom <- Sys.which("phantomjs")

  if(Sys.which("phantomjs") == "") {
    if(identical(.Platform$OS.type, "windows")) {
      phantom <- Sys.which(file.path(Sys.getenv("APPDATA"), "npm", "phantomjs.cmd"))
    }
  }

  phantom

}

Он создает файл .js, который берет ваш html-виджет, захватывает экран и сохраняет файлы .js, .html и .png в активный каталог:

# Load package
library(networkD3)

# Create fake data
src <- c("A", "A", "A", "A", "B", "B", "C", "C", "D")
target <- c("B", "C", "D", "J", "E", "F", "G", "H", "I")
networkData <- data.frame(src, target)

# Plot
plot = simpleNetwork(networkData)

# Save html as png
widgetThumbnail(p = plot, thumbName = "plot", height = 500)
person Lenka Vraná    schedule 27.10.2016