如何使用ggplot绘制时抑制警告

时间:2012-11-08 09:52:42

标签: r ggplot2

当将缺失值传递给ggplot时,它非常友好并警告我们它们存在。这在交互式会话中是可以接受的,但是在编写报表时,输出不会出现警告,特别是如果有很多警告。下面的示例中缺少一个标签,会产生警告。

library(ggplot2)
library(reshape2)
mydf <- data.frame(
  species = sample(c("A", "B"), 100, replace = TRUE), 
  lvl = factor(sample(1:3, 100, replace = TRUE))
)
labs <- melt(with(mydf, table(species, lvl)))
names(labs) <- c("species", "lvl", "value")
labs[3, "value"] <- NA
ggplot(mydf, aes(x = species)) + 
   stat_bin() + 
   geom_text(data = labs, aes(x = species, y = value, label = value, vjust = -0.5)) +
   facet_wrap(~ lvl)

enter image description here

如果我们将suppressWarnings包裹在最后一个表达式周围,我们会得到有多少警告的摘要。为了论证,让我们说这是不可接受的(但确实非常诚实和正确)。打印ggplot2对象时如何(完全)抑制警告?

3 个答案:

答案 0 :(得分:43)

您需要在suppressWarnings()电话周围print(),而不是创建ggplot()对象:

R> suppressWarnings(print(
+ ggplot(mydf, aes(x = species)) + 
+    stat_bin() + 
+    geom_text(data = labs, aes(x = species, y = value, 
+                               label = value, vjust = -0.5)) +
+    facet_wrap(~ lvl)))
R> 

将最终绘图分配给对象然后print()

可能更容易
plt <- ggplot(mydf, aes(x = species)) + 
   stat_bin() + 
   geom_text(data = labs, aes(x = species, y = value,
                              label = value, vjust = -0.5)) +
   facet_wrap(~ lvl)


R> suppressWarnings(print(plt))
R> 

行为的原因是警告仅在实际绘制绘图时生成,而不是在创建表示绘图的对象时生成。 R将在交互式使用期间自动打印,因此

R> suppressWarnings(plt)
Warning message:
Removed 1 rows containing missing values (geom_text).

不起作用,因为实际上您正在调用print(suppressWarnings(plt)),而

R> suppressWarnings(print(plt))
R>

确实有效,因为suppressWarnings()可以捕获print()来电引起的警告。

答案 1 :(得分:42)

更有针对性的逐个绘图方法是将na.rm=TRUE添加到您的绘图调用中。 E.g:

  ggplot(mydf, aes(x = species)) + 
      stat_bin() + 
      geom_text(data = labs, aes(x = species, y = value, 
                                 label = value, vjust = -0.5), na.rm=TRUE) +
      facet_wrap(~ lvl)

答案 2 :(得分:22)

在您的问题中,您提到报告撰写,因此最好设置全局警告级别:

options(warn=-1)

默认为:

options(warn=0)