ggplot渲染图,基于值的顺序不正确

时间:2018-12-22 17:36:07

标签: r ggplot2

我想根据值term为变量val绘制以下数据帧,并按gr刻面

我使用Windows 10 64位,R 3.4.3 64位。 我已经尝试了fct_reorder软件包中的forcats,但没有成功。

library(tidyverse)

df = data_frame(gr = c(rep('foo',3), rep('bar',3), 
     rep('cron',3)), term = c('a','b','c', 'd', 'a','e', 'f', 'g', 'h'), 
     val = c(4,5,6,1.5,1,3,1,2,4))

df %>%
group_by(gr) %>% 
arrange(desc(val)) %>%
ungroup() %>%
mutate(term = reorder(term, val)) %>%
ggplot(aes(term, val, fill = gr)) +
geom_col(position = 'identity') +
facet_wrap(~gr, scales = 'free') +
ylab('')+
coord_flip()

期望是术语afoobar组的底部。 但是,在情节中,组bar的顺序不正确,如中间的情节。

enter image description here

1 个答案:

答案 0 :(得分:0)

@Camille的评论是关键。但是您是对的-它需要另一种方法处理另一个数据框-一种方法是根据您的评论进行更新的。

我使用rank代替了arrange,并且正在介绍帮助器列。这有点“危险”,因为新列的位置不再对应于旧列。因此,我将其存储在一个新的数据框中,以免更改基础数据,并且也不会造成混淆。
然后,我根据@Camille的建议(以及取消分组后的操作,如您所做的那样)创建了因式列term_f

一些警告: 只需使用reorder(term, val, FUN = min),即不使用desc(val)

library(tidyverse)
df = data_frame(gr = c(rep('foo',3), rep('bar',3), rep('cron',3)), term = c('a','b','c', 'd', 'a','e', 'f', 'g', 'h'), val = c(4,3,6,1.5,1,3,1,2,4))

df_f <- 
  df %>% group_by(gr) %>%
  mutate(rank_val = val[rank(val)],
         rank_term = term[rank(val)]) %>% 
  ungroup() %>% 
  mutate(term_f = fct_inorder(rank_term))

df_f
#> # A tibble: 9 x 6
#>   gr    term    val rank_val rank_term term_f
#>   <chr> <chr> <dbl>    <dbl> <chr>     <fct> 
#> 1 foo   a       4        3   b         b     
#> 2 foo   b       3        4   a         a     
#> 3 foo   c       6        6   c         c     
#> 4 bar   d       1.5      1   a         a     
#> 5 bar   a       1        1.5 d         d     
#> 6 bar   e       3        3   e         e     
#> 7 cron  f       1        1   f         f     
#> 8 cron  g       2        2   g         g     
#> 9 cron  h       4        4   h         h

  ggplot(data = df_f, aes(term_f, rank_val)) +
  geom_col() +
  facet_wrap(~ gr, scales = 'free') +
  coord_flip()

reprex package(v0.2.0)于2018年12月23日创建。