R ggplot:删除图例中的NA因子级别

R ggplot:删除图例中的NA因子级别,r,ggplot2,R,Ggplot2,如何从图例中省略因子的NA级别 从nycflights13数据库中,我创建了一个名为tot_delay的新连续变量,然后创建了一个名为delay_class的4级因子。打印时,我过滤掉NA值,但它们仍显示在图例中。这是我的密码: library(nycflights13); library(ggplot2) flights$tot_delay = flights$dep_delay + flights$arr_delay flights$delay_class <- cut(fligh

如何从图例中省略因子的
NA
级别

nycflights13
数据库中,我创建了一个名为
tot_delay
的新连续变量,然后创建了一个名为
delay_class
的4级因子。打印时,我过滤掉
NA
值,但它们仍显示在图例中。这是我的密码:

library(nycflights13); library(ggplot2)

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")
库(nycflights13);图书馆(GG2)
航班$tot_延误=航班$dep_延误+航班$arr_延误
航班延误$班次%
ggplot()+
几何图形条(映射=aes(x=载波,填充=延迟等级),位置=“填充”)

您有一个数据点,其中
delay\u class
NA
,但
tot\u delay
不是。这一点没有被你的过滤器捕捉到。将代码更改为:

filter(flights, !is.na(delay_class)) %>% 
  ggplot() +
  geom_bar(mapping = aes(x = carrier, fill = delay_class), position = "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) )
更新:正如@gatsky的回答所指出的,所有离散尺度也包括
na.translate
参数。这一特征自那时起就实际存在;我只是在发布我的答案时没有意识到这一点。为了完整性,它在原始问题中的用法如下

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

我喜欢上面@Artem的方法,也就是说,弄清为什么你的df中有NA。然而,有时你知道有NA,你只是想排除它们。在这种情况下,只需使用“na.omit”即可:

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

父示例并不能很好地说明问题(当然,应该跟踪并消除意外的
NA
值),但这是Google上的最高结果,因此应该注意的是,现在在
scale\u XXX\u XXX
中有一个选项,通过设置
NA.translate=F
来防止NA级别显示在图例中。例如:

# default    
ggplot(data = data.frame(x = c(1,2,NA), y = c(1,1,NA), a = c("A","B",NA)),
           aes(x, y, colour = a)) + geom_point(size = 4)


这适用于ggplot2 3.1.0。

Ah!这么简单。我应该先按delay_类进行筛选。由于有一个额外的点,很难在图表上看到NA,尽管它显示在图例上。我投票支持覆盖图例的
scale\u fill\u manual()。这可能会导致一些观察结果被过滤掉,人们希望保留这些观察结果。@RichPauloo——上面引用的问题是“我怎么能轻易地从图例中省略NA值?”如果您(无论出于何种原因)很难找到导致问题的一个或多个变量,那么使用“NA.omit”将是一种权宜之计。然而,正如我在回答中提到的,我总是鼓励人们找出为什么他们有NA。所以,这里有一个问题要问你(因为我在发布之前检查了我的代码)。如果使用“na.omit(flights)”与“filter(flights,!is.na(tot_delay))”相比,flights文件中的文件/案例/行有什么区别?区别在于如果使用不同的数据集,使用na.omit()可能会意外丢失数据。dplyr方法更健壮。
# with na.translate = F    
ggplot(data = data.frame(x = c(1,2,NA), y = c(1,1,NA), a = c("A","B",NA)),
           aes(x, y, colour = a)) + geom_point(size = 4) + 
           scale_colour_discrete(na.translate = F)