2015-03-13 210 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