使用 heatmap() 作为 ggsave() 的绘图输入时出错

Sha*_*hin 3 r heatmap ggplot2

我想将 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(),因此该错误会中断下载/保存过程。

我很感激你的帮助

Sti*_*ibu 5

的语法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)

因此,传递p2ggsave()将不起作用,因为它实际上并不包含情节。

但是仍然可以使用图形设备将基本图存储在文件中。

例如,您可以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)