我想在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()
的一部分,因此错误会中断下载/保存过程。
感谢您的帮助
答案 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
中存储了一个情节。您只需运行p
或print(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"}