Как сохранить график ggplot в виде фрагмента кода HTML - PullRequest
0 голосов
/ 09 мая 2018

Я создаю html-документ, создавая различные объекты с функциями ggplotly() и htmltools, такими как h3() и html(). Затем я отправляю их в виде списка на htmltools::save_html(), чтобы создать HTML-файл.

Я бы хотел добавить диаграммы ggplot непосредственно в виде изображений, а не прикреплять все сюжетные колокольчики и свистки. В конце я создам автономный html-файл (без зависимостей), и сюжетная линия сделает этот файл слишком большим.

Есть ли какая-то функция, которая преобразует объект ggplot в какой-то объект html-типа? Или мне нужно сохранить ggplot как файл .png, а затем прочитать файл .png в какой-то объект, который я добавляю в список в функции save_html ()?

Мой код R выглядит примерно так:

library("tidyverse")
library("plotly")
library("htmltools")

HTMLOut <- "c:/Users/MrMagoo/My.html")
df <- data.frame(x=1:25, y=c(1:25*1:25))

g7 <- ggplot(df,aes(x=x, y=y)) + geom_point()
p7 <- ggplotly(g7)  # I would like to use something other than ggplotly here. Just capturing the ggplot as an image would be fine.

# create other objects to add to the html file
t7 <- h2(id="graph7", "Title for graph #7")
d7 <- p("description of graph 7")

save_html(list(t7, p7, d7), HTMLOut)
# of course, the real code has many more objects in that list – more graphs, text, tables, etc.

Я хотел бы заменить объект plotly (p7) чем-то, что просто представляет g7 таким образом, чтобы не вызвать ошибку в функции save_html.

Я надеялся найти функцию, которая могла бы напрямую Base64 кодировать объект ggplot, но, похоже, мне сначала нужно вывести объект 'ggplot' в виде файла .png (или SVG на каждый тенг) L, ниже), затем base64-закодировать его. Я надеялся, что есть более прямой путь, но я могу в конечном итоге сделать это, как в https://stackoverflow.com/a/33410766/3799203, заканчивая его

g7img <- "<img src=\"data:image/png;base64,(base64encode string)\""
g7img <- htmltools::html(g7img)

Ответы [ 3 ]

0 голосов
/ 09 мая 2018

Я думаю, что вы хотите, может быть близко к одному из следующих:

  1. Похоже, вы создаете отчет в формате HTML, но еще не отметили RMarkdown . Он поставляется с Base64 кодировать . При создании отчета RMarkdown pandoc автоматически преобразует любые графики в элемент HTML внутри документа, поэтому отчет является автономным.

  2. Сюжеты SVG. Это менее вероятно, чем вы хотели бы, но графики SVG основаны на языке разметки и могут быть легко переносимы. Укажите расширение .svg при использовании ggsave(), и вы должны получить изображение SVG. Обратите внимание, что SVG является реализацией графика как есть, поэтому, если он может быть огромным по размеру файла, если у вас есть тысячи форм и линий.

0 голосов
/ 15 мая 2018

Я закончил тем, что сгенерировал временный файл изображения, а затем закодировал его в base64 в функции, которую я назвал encodeGraphic() (заимствуя код из сообщения LukeA ):

library(ggplot2)
library(RCurl)
library(htmltools)
encodeGraphic <- function(g) {
  png(tf1 <- tempfile(fileext = ".png"))  # Get an unused filename in the session's temporary directory, and open that file for .png structured output.
  print(g)  # Output a graphic to the file
  dev.off()  # Close the file.
  txt <- RCurl::base64Encode(readBin(tf1, "raw", file.info(tf1)[1, "size"]), "txt")  # Convert the graphic image to a base 64 encoded string.
  myImage <- htmltools::HTML(sprintf('<img src="data:image/png;base64,%s">', txt))  # Save the image as a markdown-friendly html object.
  return(myImage)
}

HTMLOut <- "~/TEST.html"   # Say where to save the html file.
g <- ggplot(mtcars, aes(x=gear,y=mpg,group=factor(am),color=factor(am))) + geom_line()  # Create some ggplot graph object
hg <- encodeGraphic(g)  # run the function that base64 encodes the graph
forHTML <- list(h1("My header"), p("Lead-in text about the graph"), hg)
save_html(forHTML, HTMLOut)  # output it to the html file.
0 голосов
/ 09 мая 2018

Если вы хотите сохранить график как динамический plotly график, вы можете использовать htmlwidgets::saveWidget. Это создаст отдельный HTML-файл.

Вот минимальный пример:

library(tidyverse);
library(plotly);
library(htmlwidgets);

df <- data.frame(x = 1:25, y = c(1:25 * 1:25))
gg <- ggplot(df,aes(x = x, y = y)) + geom_point()

# Save ggplotly as widget in file test.html
saveWidget(ggplotly(gg), file = "test.html");
...