【问题标题】:Save ggplot within a function在函数中保存 ggplot
【发布时间】:2011-08-12 01:05:37
【问题描述】:

我正在尝试使用图形设备在函数中保存 ggplot。但我发现代码会产生空图。下面是一个非常非常简单的例子。

library(ggplot2)
ff <- function(){
  jpeg("a.jpg")
  qplot(1:20, 1:20)
  dev.off()
}
ff()

如果我只运行函数的内容,一切都很好。我知道使用 ggsave() 会做我想做的事情,但我只是想知道为什么 jpeg() 加上 dev.off() 不起作用。我用不同版本的 R 试过这个,问题仍然存在。

【问题讨论】:

  • @gsk3 这个问题其实有细微的不同。在我看来,足以让它保持开放。您链接到的问题尝试显示图表。这个问题想保存一个ggplot。所以这种情况下的正确答案是使用ggsave,而链接问题中的正确答案是使用print(p)
  • @Andrie:不过,他们说他们知道 ggsave;这使得“为什么 jpeg() 加上 dev.off() 不起作用”的正确答案与链接的问题相同。你是对的,它有细微的不同,因此可能值得保留。
  • @gsk3 非常感谢。在问之前我应该​​投入更多。
  • 所以它重复的。

标签: r ggplot2


【解决方案1】:

您应该使用ggsave 而不是jpeg(); print(p); dev.off() 序列。 ggsave 是一个包装器,它可以完全按照您打算对函数执行的操作,但它提供了更多选项和多功能性。您可以明确指定输出的类型,例如jpg 或 pdf,否则它会根据您的文件扩展名猜测。

所以你的代码可能会变成这样:

p <- qplot(1:20, 1:20)
ggsave(filename="a.jpg", plot=p)

详情请见?ggsave


代码中的原始行为不起作用的原因确实是一个常见问题(在stackoverlflowR FAQs on CRAN 上)。您需要插入 print 语句来打印绘图。在交互式控制台中,打印在后台静默执行。

【讨论】:

  • 非常感谢!使用ggsave 确实更好。但我正在修改现有代码以用 ggplot 替换默认绘图系统,所以我更喜欢坚持jpeg(); print(p); dev.off() 序列。
  • 当我在循环中使用 ggsave 时,图像会失去颜色和图例
【解决方案2】:

这些图必须打印出来:

ff <- function(){
  jpeg("a.jpg")
  p <- qplot(1:20, 1:20)
  print(p)
  dev.off()
}
ff()

这是一个非常 common 的错误。

【讨论】:

  • 虽然你的回答是对的,但还是用ggsave函数保存图要好得多
  • @joran 非常感谢!我应该在询问之前进行更多调查。
猜你喜欢
  • 2014-05-09
  • 2022-11-18
  • 1970-01-01
  • 2015-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-24
  • 1970-01-01
相关资源
最近更新 更多