2017-08-03 80 views
2

這是一個繪製問題。ggplot:刪除NA因子水平在傳說

從nycflights13數據庫,我創建了一個名爲tot_delay一個新的連續變量,然後創建了一個名爲delay_class有4個級別的因素。當我繪製時,我會過濾出NA值,但它們仍然出現在圖例中。

Pesky NA legend value.....

我怎麼能輕易忽略NA從圖例值?這裏是我的代碼:

library(nycflights13) 

flights$tot_delay = flights$dep_delay + flights$arr_delay 
flights$delay_class <- cut(flights$tot_delay,         
          c(min(flights$tot_delay, na.rm = TRUE), 0, 20 , 120, 
          max(flights$tot_delay, na.rm = TRUE)), 
          labels = c("none", "short","medium","long"))  

filter(flights, !is.na(tot_delay)) %>% 
    ggplot() + 
    geom_bar(mapping = aes(x = carrier, fill = delay_class), position = "fill") 

回答

5

你有一個數據點delay_classNA,但tot_delay不是。這一點不被你的過濾器捕獲。你的代碼更改爲:

filter(flights, !is.na(delay_class)) %>% 
    ggplot() + 
    geom_bar(mapping = aes(x = carrier, fill = delay_class), position = "fill") 

的伎倆:

enter image description here

另外,如果你絕對必須有額外的點,你可以重寫fill傳說如下:

filter(flights, !is.na(tot_delay)) %>% 
    ggplot() + 
    geom_bar(mapping = aes(x = carrier, fill = delay_class), position = "fill") + 
    scale_fill_manual(breaks = c("none","short","medium","long"), 
        values = scales::hue_pal()(4)) 
+0

啊!很簡單。我應該通過delay_class過濾開始。由於還有一點,圖表本身很難看到NA,儘管它在圖例上顯示。你有我的投票'''scale_fill_manual()'''覆蓋圖例的方法。 –

2

我喜歡@阿爾喬姆的上述方法,即,漸漸的,爲什麼有NA在您的DF底部。不過,有時你知道有NA的,只是想和你將它們排除在外。在這種情況下,只需使用'na.omit'即可使用:

na.omit(flights) %>% ggplot() + 
geom_bar(mapping = aes(x = carrier, fill = delay_class), position = "fill") 
+0

我更喜歡這個解決方案,因爲它比我少了一行代碼。謝謝! –