这是一个密谋问题.
在nycflights13数据库中,我创建了一个名为tot_delay的新连续变量,然后创建了一个名为delay_class的4个级别的因子.当我绘制时,我会过滤掉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_class是NA,但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。