这就是我想要的情节外观:
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))
但是我想将NA重命名为“未知”。每当我这样做时,栏的位置都会发生变化:
flights %>%
count(carrier) %>%
mutate(
carrier = coalesce(carrier, 'Unknown')
) %>%
top_n(10) %>%
ggplot() +
geom_col(aes(x = reorder(carrier, n), y = n))
我尝试了几种不同的方法,包括尝试或多或少地使用scale_x_discrete
和其他方法手动重新标记。即使可行,它的伸缩性也不会很好。
答案 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))
一般方法:
您可以将级别读取为字符串并删除不需要的变量。只需再次将其附加在最后位置即可(或将其放置在所需的位置)。
我使用了几个步骤,因此更容易理解:
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")