如何将 ggrough 图表保存为 .png
How to save ggrough chart as .png
假设我正在使用 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 window 中呈现,我也不知道如何将其另存为 .png。
我应该怎么做才能将 ggrough
图保存为 .png?
ggrough
情节是 htmlwidget
的核心,所以我认为典型的图像保存代码不会起作用。
如前所述,您可以通过 htmlwidgets::saveWidget(rough_chart_object, "rough_chart.html")
将 htmlwidgets
保存到磁盘。这将创建一个 html 文件,其中包含一个 html canvas 元素,该元素是通过嵌入的 javascript 在其上绘制的。正如您所注意到的,webshot::webshot()
由于某种原因无法捕获图像,我也尚未弄清楚。
因为 html 文件在 Chrome 中正确呈现,所以我写了这个 RSelenium 方法。然而,RSelenium 可能很难获得 运行 所有 inter-dependencies,并且通过这种方法创建的图像可能需要 post-processing。也就是说,因为情节没有填满整个canvas元素,图像包含很多不需要的白色space.
不过我会把这个方法留在这里让其他人去思考。
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()
假设我正在使用 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 window 中呈现,我也不知道如何将其另存为 .png。
我应该怎么做才能将 ggrough
图保存为 .png?
ggrough
情节是 htmlwidget
的核心,所以我认为典型的图像保存代码不会起作用。
如前所述,您可以通过 htmlwidgets::saveWidget(rough_chart_object, "rough_chart.html")
将 htmlwidgets
保存到磁盘。这将创建一个 html 文件,其中包含一个 html canvas 元素,该元素是通过嵌入的 javascript 在其上绘制的。正如您所注意到的,webshot::webshot()
由于某种原因无法捕获图像,我也尚未弄清楚。
因为 html 文件在 Chrome 中正确呈现,所以我写了这个 RSelenium 方法。然而,RSelenium 可能很难获得 运行 所有 inter-dependencies,并且通过这种方法创建的图像可能需要 post-processing。也就是说,因为情节没有填满整个canvas元素,图像包含很多不需要的白色space.
不过我会把这个方法留在这里让其他人去思考。
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()