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

Ric*_*loo 10 r ggplot2

这是一个密谋问题.

在nycflights13数据库中,我创建了一个名为tot_delay的新连续变量,然后创建了一个名为delay_class的4个级别的因子.当我绘制时,我会过滤掉NA值,但它们仍会出现在图例中.

Pesky NA传奇价值.....

如何轻松省略图例中的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")
Run Code Online (Sandbox Code Playgroud)

Art*_*lov 16

你有一个数据点的地方delay_classNA,但tot_delay并非如此.您的过滤器未捕获此点.将代码更改为:

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

诀窍:

在此输入图像描述

或者,如果您绝对必须拥有该额外点,则可以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) )
Run Code Online (Sandbox Code Playgroud)


gat*_*sky 12

上级示例不能很好地说明问题(当然,NA应该跟踪并消除意外的值),但这是Google上的最佳结果,因此应注意,现在可以选择scale_XXX_XXX 防止NA水平通过设置在图例中显示na.translate = F。例如:

# 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)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

# 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)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

这适用于ggplot2 3.1.0。