更改NA的名称,但保留其在图中的位置

时间:2018-09-20 22:30:58

标签: r ggplot2

这就是我想要的情节外观:

flights$carrier[seq(1, length(flights$carrier), 20)] <- NA

flights %>% 
  count(carrier) %>% 
  top_n(10) %>% 
  ggplot() +
  geom_col(aes(x = reorder(carrier, n), y = n))

enter image description here

但是我想将NA重命名为“未知”。每当我这样做时,栏的位置都会发生变化:

flights %>% 
  count(carrier) %>% 
  mutate(
    carrier = coalesce(carrier, 'Unknown')
    ) %>% 
  top_n(10) %>% 
  ggplot() +
  geom_col(aes(x = reorder(carrier, n), y = n))

enter image description here

我尝试了几种不同的方法,包括尝试或多或少地使用scale_x_discrete和其他方法手动重新标记。即使可行,它的伸缩性也不会很好。

2 个答案:

答案 0 :(得分:2)

就像评论中已经提到的那样,在此question之后,您需要对级别进行排序以订购金条。这些指定了条形图在图中的位置。

为此,我使用了factor(df, levels = c(...))函数,就像Gavin Simpson在所提供的链接问题答案中所使用的那样。对于其他方法和解决方案,请查看整个问题。

下面是一个示例,说明如何使用可重现的数据完成该操作。

df<-flights %>% 
         count(carrier) %>% 
         mutate(
           carrier = coalesce(carrier, 'Unknown')
         )%>% top_n(10)

df$carrier<- factor(df$carrier, levels=c("WN",  "9E", "US", "MQ", "AA", "DL", "EV", "B6", "UA", "Unknown"))


ggplot(data = df) +
  geom_col(aes(x = carrier, y = n))

这提供了所需的输出图: enter image description here

一般方法:

您可以将级别读取为字符串并删除不需要的变量。只需再次将其附加在最后位置即可(或将其放置在所需的位置)。

我使用了几个步骤,因此更容易理解:

foo <- levels(factor(reorder(df$carrier, df$n)))
foo <- foo[foo!="Unknown"]
foo <- append(foo, "Unknown")

现在只需使用foo来设置级别:

df$carrier<- factor(df$carrier, levels=foo)

答案 1 :(得分:2)

由于您已经在使用tidyverse,因此您可以通过简单地使用fct_relevel()将“未知”设置为绘图前的最后一个级别来解决您的问题。

这种选择非常好,因为您无需事先知道有多少个级别,也不需要将它们安排在单独的步骤中。

flights %>% 
    count(carrier) %>% 
    mutate(
        carrier = coalesce(carrier, 'Unknown')
    ) %>% 
    top_n(10) %>% 
    ggplot() +
    geom_col(aes(x = fct_relevel(reorder(carrier, n), "Unknown", after = Inf), y = n)) +
    labs(x = "carrier")

enter image description here