我想将 stats::heatmap() 的输出保存在 ggplot2::ggsave() 中,但输出不是绘图,并且收到错误消息。这是代码:
data("iris")
col<- colorRampPalette(c("blue", "white", "red"))(20)
ggsave(filename = "heatmap.png", plot = heatmap(x = cor(iris[,-5]) , col = col, symm = TRUE),device = "png", dpi = 450)
Run Code Online (Sandbox Code Playgroud)
现在,虽然代码实际工作并将 保存heatmap.png在 R 工作目录中,但它也会返回错误。
在图像中保存 3.74 x 8.49 错误在 UseMethod("grid.draw") 中:没有适用于“grid.draw”的方法应用于“list”类的对象
我认为这是因为 的输出heatmap()不是情节而是一个列表。
由于我在 Shiny中将ggsave()用作 a 的一部分downloadHandler(),因此该错误会中断下载/保存过程。
我很感激你的帮助
的语法ggsave()是
ggsave(filename, plot = last_plot(), device = NULL, path = NULL,
scale = 1, width = NA, height = NA, units = c("in", "cm", "mm"),
dpi = 300, limitsize = TRUE, ...)
Run Code Online (Sandbox Code Playgroud)
要存储的图必须作为第二个参数传递。为此,您必须能够将绘图分配给变量。这可以通过创建的图来完成ggplot():
p <- ggplot(data = iris, aes(x = Sepal.Length, y = Sepal.Width)) + geom_point()
class(p)
## [1] "gg" "ggplot"
Run Code Online (Sandbox Code Playgroud)
这段代码没有显示任何绘图,但它实际上在p. 您可以通过运行p或来渲染它print(p)。
基本绘图功能不同。他们直接创建一个情节作为副作用。因此,即使将输出分配给变量,此代码也将显示绘图:
p2 <- heatmap(x = cor(iris[,-5]) , col = col, symm = TRUE)
Run Code Online (Sandbox Code Playgroud)
而p2现在是一个list,而不是一个情节:
p2
## $rowInd
## [1] 2 1 3 4
##
## $colInd
## [1] 2 1 3 4
##
## $Rowv
## NULL
##
## $Colv
## NULL
Run Code Online (Sandbox Code Playgroud)
因此,传递p2到ggsave()将不起作用,因为它实际上并不包含情节。
但是仍然可以使用图形设备将基本图存储在文件中。
例如,您可以png像这样创建一个-file:
png(filename = "heatmap.png")
heatmap(x = cor(iris[,-5]) , col = col, symm = TRUE)
dev.off()
Run Code Online (Sandbox Code Playgroud)
还有其他可以类似使用的设备,例如jpeg()、pdf()、 和tiff()。
您可以downloadHandler()按如下方式使用该设备:
output$downloadData <- downloadHandler(
filename = "heatmap.png",
content = function(file) {
png(filename = file)
col<- colorRampPalette(c("blue", "white", "red"))(20)
heatmap(x = cor(iris[,-5]) , col = col, symm = TRUE)
dev.off()
}
)
Run Code Online (Sandbox Code Playgroud)