2015-03-13 211 views
2

当您使用ggplot2绘图时,它会警告您是否自动删除错误。
我希望能够禁用该特定警告或将na.rm的默认设置设为真正的系统范围,但这不可能AFAIK。ggplot2关于错误的警告,我不能使用`na.rm = T`禁用

我知道我可以通过为每个geom指定na.rm=T来禁用它。但是,当ggplot生成我没有明确指定的更多geom时,这会失败。在下面的例子中,我会使用我的原始数据获得每个图的三个警告(当我面向它时,有10个警告,所以你可以看到这在knitr报告中变得烦人)。 我可以用na.rm=T来抑制两个警告,但关于geom_segment的第三个警告我不能。顺便说一句,它也发生在mtcars中,所以我以此为例。

警告消息:含有缺失值(geom_segment) 删除23行。

ggplot(data=mtcars, aes(x = disp, y = wt)) + 
    geom_linerange(stat = "summary", fun.data = "median_hilow", colour = "#aec05d", na.rm=T) + 
    geom_pointrange(stat = "summary", fun.data = "mean_cl_boot", colour = "#6c92b2", na.rm=T) 

直到我想出解决办法,我可以使用warning=FALSE对违规块,但我真的不喜欢的是,由于它可能会抑制我关心的警告。我也可以在数据集上使用na.omit,但是要弄清楚我将在图中使用哪些变量,这有很多工作和语法。

+0

您可以忽略“suppressWarnings(expr)”的警告。如果你想不再收到任何警告,你可以做“选项(warn = -1)” – 2015-03-13 11:33:54

+2

例如,定义'print.ggplot < - function(x,newpage = is.null(vp),vp = NULL,。 ..)suppressWarnings(ggplot2 ::: print.ggplot(x,newpage,vp,...))',但是这可能仍然会抑制你关心的警告。 AFAIK没有可靠的方法来抑制特定的警告,因为必须考虑本地化。事实上,这个具体的警告,你应该仔细考虑,如果你的情节是明智的。读者不知道间隔是否未被画出或者如此之小以至于不可见。 – Roland 2015-03-13 12:07:47

+0

@Roland&Nemo:我知道我可以禁止所有警告,但我宁愿以编程方式省略错误。我的真实情节是明智的和可解释的,这只是一个玩具的例子。 – Ruben 2015-03-13 12:51:52

回答

2

我想避免这种情况的唯一方法不是使用stat_summary,而是自己计算汇总统计。对于你的例子来说这没有问题,但我承认这通常不是一个令人满意的解决方案。

# load dplyr package used to calculate summary 
require(dplyr) 
# calculate summary statistics 
df <- mtcars %>% group_by(disp) %>% do(mean_cl_boot(.$wt)) 
# use geom_point and geom_segment with na.rm=TRUE 
ggplot(data=mtcars, aes(x = disp, y = wt)) + 
    geom_linerange(stat = "summary", fun.data = "median_hilow", colour = "#aec05d") + 
    geom_point(data = df, aes(x = disp, y = y), colour = "#6c92b2") + 
    geom_segment(data = df, aes(x = disp, xend = disp, y = ymin, yend = ymax), colour = "#6c92b2", na.rm=TRUE) 

或者,您可以编写自己的mean_cl_boot版本。如果yminymaxNA只是将它们设置为值y

# your summary function 
my_mean_cl_boot <- function(x, ...){ 
    res <- mean_cl_boot(x, ...) 
    res[is.na(res$ymin), "ymin"] <- res[is.na(res$ymin), "y"] 
    res[is.na(res$ymax), "ymax"] <- res[is.na(res$ymax), "y"] 
    na.omit(res) 
} 
# plotting command 
ggplot(data=mtcars, aes(x = disp, y = wt)) + 
    geom_linerange(stat = "summary", fun.data = "median_hilow", colour = "#aec05d", na.rm=T) + 
    geom_pointrange(stat = "summary", fun.data = "my_mean_cl_boot", colour = "#6c92b2", na.rm=T) 
+0

谢谢。这第一个解决方案不是很令人满意,第二个解决方案可能是正确的/预期的方式,但有点麻烦。 – Ruben 2015-03-13 17:40:57