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)