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

时间:2017-09-30 04:55:10

标签: r ggplot2 heatmap

我想在ggplot2 :: ggsave()中保存stats :: heatmap()的输出,但输出不是绘图,我收到错误。 这是代码:

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)

现在,当代码实际工作并将heatmap.png保存在R工​​作目录中时,它也会返回错误。

  

在图像中保存3.74 x 8.49   UseMethod(“grid.draw”)出错:   没有适用于'grid.draw'的方法应用于类“list”的对象

我认为这是因为heatmap()的输出不是情节,而是一个列表。

由于我在Shiny中使用ggsave()作为 downloadHandler() 的一部分,因此错误会中断下载/保存过程。

感谢您的帮助

2 个答案:

答案 0 :(得分:3)

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, ...)

要存储的绘图必须作为第二个参数传递。为此,您必须能够将绘图分配给变量。这可以通过ggplot()

创建的图来完成
p <- ggplot(data = iris, aes(x = Sepal.Length, y = Sepal.Width)) + geom_point()
class(p)
## [1] "gg"     "ggplot"

这段代码没有显示任何情节,但实际上已经在p中存储了一个情节。您只需运行pprint(p)即可进行呈现。

基础绘图功能不同。他们直接创建一个情节作为副作用。因此,即使将输出分配给变量,此代码也会显示该图:

p2 <- heatmap(x = cor(iris[,-5])  , col = col, symm = TRUE)

p2现在是list,而不是情节:

p2
## $rowInd
## [1] 2 1 3 4
## 
## $colInd
## [1] 2 1 3 4
##  
## $Rowv
## NULL
## 
## $Colv
## NULL

因此,将p2传递给ggsave()将无效,因为它实际上并不包含该情节。

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

例如,您可以创建一个png - 这样的文件:

png(filename = "heatmap.png")
heatmap(x = cor(iris[,-5])  , col = col, symm = TRUE)
dev.off()

还有其他设备可以类似地使用,例如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()
    }
  )

答案 1 :(得分:0)

只是为了完成@Stibu的全面答案,为了让png()与Shiny :: downloadHandler()一起工作:

{img="/path/photo1.jpg" alt="I am Photo Title"}
{img="/path/photo2.jpg" alt="I am Photo Title 2"}