如何在用ggplot绘图时抑制警告

当把缺失值传递给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) 

在这里输入图像说明

如果我们用最后一个expression式来suppressWarnings警告,我们会得到一个有多less警告的摘要。 为了争辩,让我们说这是不可接受的(但确实是非常诚实和正确的)。 打印ggplot2对象时如何(完全)抑制警告?

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

  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) 

您需要在print()调用周围suppressWarnings() ggplot() ,而不是创buildggplot()对象:

 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> 

行为的原因是警告只在绘图时才会生成,而不是在创build绘图的对象时生成。 R会在交互式使用过程中自动打印,所以

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

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

 R> suppressWarnings(print(plt)) R> 

确实有效,因为suppressWarnings()可以捕获print()调用产生的警告。

在你的问题中,你提到报告写作,所以设置全球警报级别可能会更好:

 options(warn=-1) 

默认是:

 options(warn=0)